@codemieai/code 0.0.58 → 0.1.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 +56 -15
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.js +3 -0
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.js +18 -0
- package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
- package/dist/agents/plugins/claude/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/agents/plugins/claude/plugin/commands/README.md +2 -31
- package/dist/agents/plugins/claude/plugin/commands/codemie-catchup.md +5 -0
- package/dist/agents/plugins/claude/plugin/commands/codemie-init.md +42 -43
- package/dist/agents/plugins/claude/plugin/commands/codemie-subagents.md +5 -0
- package/dist/agents/plugins/claude/plugin/commands/handoff.md +56 -0
- package/dist/agents/plugins/claude/plugin/commands/memory-refresh.md +5 -0
- package/dist/agents/plugins/claude/plugin/hooks/hooks.json +1 -1
- package/dist/agents/plugins/claude/plugin/scripts/bash/rtk-rewrite.sh +101 -0
- package/dist/agents/plugins/claude/plugin/skills/msgraph/README.md +4 -1
- package/dist/agents/plugins/claude/plugin/skills/msgraph/SKILL.md +27 -8
- package/dist/agents/plugins/claude/plugin/skills/msgraph/scripts/msgraph.js +63 -3
- package/dist/agents/plugins/claude/plugin/skills/report-issue/SKILL.md +1 -0
- package/dist/assets/demo.gif +0 -0
- package/dist/assets/skills-sh-egress-guard.cjs +166 -0
- package/dist/cli/commands/assistants/setup/constants.d.ts +1 -25
- package/dist/cli/commands/assistants/setup/constants.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/constants.js +1 -20
- package/dist/cli/commands/assistants/setup/constants.js.map +1 -1
- package/dist/cli/commands/assistants/setup/generators/claude-agent-generator.d.ts +4 -4
- package/dist/cli/commands/assistants/setup/generators/claude-agent-generator.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/generators/claude-agent-generator.js +11 -10
- package/dist/cli/commands/assistants/setup/generators/claude-agent-generator.js.map +1 -1
- package/dist/cli/commands/assistants/setup/generators/claude-skill-generator.d.ts +4 -4
- package/dist/cli/commands/assistants/setup/generators/claude-skill-generator.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/generators/claude-skill-generator.js +11 -9
- package/dist/cli/commands/assistants/setup/generators/claude-skill-generator.js.map +1 -1
- package/dist/cli/commands/assistants/setup/helpers.d.ts +4 -18
- package/dist/cli/commands/assistants/setup/helpers.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/helpers.js +10 -60
- package/dist/cli/commands/assistants/setup/helpers.js.map +1 -1
- package/dist/cli/commands/assistants/setup/index.d.ts +0 -8
- package/dist/cli/commands/assistants/setup/index.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/index.js +20 -164
- package/dist/cli/commands/assistants/setup/index.js.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/actions.d.ts +1 -30
- package/dist/cli/commands/assistants/setup/selection/actions.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/actions.js +1 -320
- package/dist/cli/commands/assistants/setup/selection/actions.js.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/constants.d.ts +3 -65
- package/dist/cli/commands/assistants/setup/selection/constants.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/constants.js +4 -81
- package/dist/cli/commands/assistants/setup/selection/constants.js.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/index.d.ts +1 -9
- package/dist/cli/commands/assistants/setup/selection/index.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/index.js +14 -34
- package/dist/cli/commands/assistants/setup/selection/index.js.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/interactive-prompt.d.ts +1 -19
- package/dist/cli/commands/assistants/setup/selection/interactive-prompt.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/interactive-prompt.js +1 -338
- package/dist/cli/commands/assistants/setup/selection/interactive-prompt.js.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/types.d.ts +7 -23
- package/dist/cli/commands/assistants/setup/selection/types.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/ui.d.ts +0 -8
- package/dist/cli/commands/assistants/setup/selection/ui.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/ui.js +7 -123
- package/dist/cli/commands/assistants/setup/selection/ui.js.map +1 -1
- package/dist/cli/commands/doctor/index.d.ts.map +1 -1
- package/dist/cli/commands/doctor/index.js +10 -1
- package/dist/cli/commands/doctor/index.js.map +1 -1
- package/dist/cli/commands/proxy/connectors/desktop-managed-mcp-servers.json +50 -0
- package/dist/cli/commands/proxy/connectors/desktop.d.ts +13 -3
- package/dist/cli/commands/proxy/connectors/desktop.d.ts.map +1 -1
- package/dist/cli/commands/proxy/connectors/desktop.js +47 -4
- package/dist/cli/commands/proxy/connectors/desktop.js.map +1 -1
- package/dist/cli/commands/proxy/index.d.ts.map +1 -1
- package/dist/cli/commands/proxy/index.js +89 -52
- package/dist/cli/commands/proxy/index.js.map +1 -1
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +2 -0
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/shared/constants.d.ts +15 -0
- package/dist/cli/commands/shared/constants.d.ts.map +1 -0
- package/dist/cli/commands/shared/constants.js +10 -0
- package/dist/cli/commands/shared/constants.js.map +1 -0
- package/dist/cli/commands/shared/helpers.d.ts +12 -0
- package/dist/cli/commands/shared/helpers.d.ts.map +1 -0
- package/dist/cli/commands/shared/helpers.js +54 -0
- package/dist/cli/commands/shared/helpers.js.map +1 -0
- package/dist/cli/commands/shared/prompts/storage-scope.d.ts +6 -0
- package/dist/cli/commands/shared/prompts/storage-scope.d.ts.map +1 -0
- package/dist/cli/commands/shared/prompts/storage-scope.js +84 -0
- package/dist/cli/commands/shared/prompts/storage-scope.js.map +1 -0
- package/dist/cli/commands/shared/selection/actions.d.ts +40 -0
- package/dist/cli/commands/shared/selection/actions.d.ts.map +1 -0
- package/dist/cli/commands/shared/selection/actions.js +264 -0
- package/dist/cli/commands/shared/selection/actions.js.map +1 -0
- package/dist/cli/commands/shared/selection/constants.d.ts +68 -0
- package/dist/cli/commands/shared/selection/constants.d.ts.map +1 -0
- package/dist/cli/commands/shared/selection/constants.js +70 -0
- package/dist/cli/commands/shared/selection/constants.js.map +1 -0
- package/dist/cli/commands/shared/selection/interactive-prompt.d.ts +16 -0
- package/dist/cli/commands/shared/selection/interactive-prompt.d.ts.map +1 -0
- package/dist/cli/commands/shared/selection/interactive-prompt.js +276 -0
- package/dist/cli/commands/shared/selection/interactive-prompt.js.map +1 -0
- package/dist/cli/commands/shared/selection/types.d.ts +31 -0
- package/dist/cli/commands/shared/selection/types.d.ts.map +1 -0
- package/dist/cli/commands/shared/selection/types.js +2 -0
- package/dist/cli/commands/shared/selection/types.js.map +1 -0
- package/dist/cli/commands/shared/selection/ui.d.ts +9 -0
- package/dist/cli/commands/shared/selection/ui.d.ts.map +1 -0
- package/dist/cli/commands/shared/selection/ui.js +92 -0
- package/dist/cli/commands/shared/selection/ui.js.map +1 -0
- package/dist/cli/commands/skills/add.d.ts +9 -0
- package/dist/cli/commands/skills/add.d.ts.map +1 -0
- package/dist/cli/commands/skills/add.js +187 -0
- package/dist/cli/commands/skills/add.js.map +1 -0
- package/dist/cli/commands/skills/find.d.ts +17 -0
- package/dist/cli/commands/skills/find.d.ts.map +1 -0
- package/dist/cli/commands/skills/find.js +94 -0
- package/dist/cli/commands/skills/find.js.map +1 -0
- package/dist/cli/commands/skills/index.d.ts +10 -0
- package/dist/cli/commands/skills/index.d.ts.map +1 -0
- package/dist/cli/commands/skills/index.js +23 -0
- package/dist/cli/commands/skills/index.js.map +1 -0
- package/dist/cli/commands/skills/lib/agent-detection.d.ts +27 -0
- package/dist/cli/commands/skills/lib/agent-detection.d.ts.map +1 -0
- package/dist/cli/commands/skills/lib/agent-detection.js +50 -0
- package/dist/cli/commands/skills/lib/agent-detection.js.map +1 -0
- package/dist/cli/commands/skills/lib/error-classify.d.ts +14 -0
- package/dist/cli/commands/skills/lib/error-classify.d.ts.map +1 -0
- package/dist/cli/commands/skills/lib/error-classify.js +64 -0
- package/dist/cli/commands/skills/lib/error-classify.js.map +1 -0
- package/dist/cli/commands/skills/lib/require-auth.d.ts +17 -0
- package/dist/cli/commands/skills/lib/require-auth.d.ts.map +1 -0
- package/dist/cli/commands/skills/lib/require-auth.js +44 -0
- package/dist/cli/commands/skills/lib/require-auth.js.map +1 -0
- package/dist/cli/commands/skills/lib/result-render.d.ts +26 -0
- package/dist/cli/commands/skills/lib/result-render.d.ts.map +1 -0
- package/dist/cli/commands/skills/lib/result-render.js +77 -0
- package/dist/cli/commands/skills/lib/result-render.js.map +1 -0
- package/dist/cli/commands/skills/lib/run-skills-cli.d.ts +46 -0
- package/dist/cli/commands/skills/lib/run-skills-cli.d.ts.map +1 -0
- package/dist/cli/commands/skills/lib/run-skills-cli.js +217 -0
- package/dist/cli/commands/skills/lib/run-skills-cli.js.map +1 -0
- package/dist/cli/commands/skills/lib/sanitize.d.ts +17 -0
- package/dist/cli/commands/skills/lib/sanitize.d.ts.map +1 -0
- package/dist/cli/commands/skills/lib/sanitize.js +73 -0
- package/dist/cli/commands/skills/lib/sanitize.js.map +1 -0
- package/dist/cli/commands/skills/lib/skills-metrics.d.ts +74 -0
- package/dist/cli/commands/skills/lib/skills-metrics.d.ts.map +1 -0
- package/dist/cli/commands/skills/lib/skills-metrics.js +268 -0
- package/dist/cli/commands/skills/lib/skills-metrics.js.map +1 -0
- package/dist/cli/commands/skills/lib/skills-search-client.d.ts +36 -0
- package/dist/cli/commands/skills/lib/skills-search-client.d.ts.map +1 -0
- package/dist/cli/commands/skills/lib/skills-search-client.js +147 -0
- package/dist/cli/commands/skills/lib/skills-search-client.js.map +1 -0
- package/dist/cli/commands/skills/lib/skills-sh-telemetry.d.ts +10 -0
- package/dist/cli/commands/skills/lib/skills-sh-telemetry.d.ts.map +1 -0
- package/dist/cli/commands/skills/lib/skills-sh-telemetry.js +33 -0
- package/dist/cli/commands/skills/lib/skills-sh-telemetry.js.map +1 -0
- package/dist/cli/commands/skills/list.d.ts +13 -0
- package/dist/cli/commands/skills/list.d.ts.map +1 -0
- package/dist/cli/commands/skills/list.js +55 -0
- package/dist/cli/commands/skills/list.js.map +1 -0
- package/dist/cli/commands/skills/remove.d.ts +11 -0
- package/dist/cli/commands/skills/remove.d.ts.map +1 -0
- package/dist/cli/commands/skills/remove.js +93 -0
- package/dist/cli/commands/skills/remove.js.map +1 -0
- package/dist/cli/commands/skills/setup/constants.d.ts +2 -0
- package/dist/cli/commands/skills/setup/constants.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/constants.js +2 -0
- package/dist/cli/commands/skills/setup/constants.js.map +1 -0
- package/dist/cli/commands/skills/setup/data.d.ts +28 -0
- package/dist/cli/commands/skills/setup/data.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/data.js +79 -0
- package/dist/cli/commands/skills/setup/data.js.map +1 -0
- package/dist/cli/commands/skills/setup/generators/claude-skill-generator.d.ts +12 -0
- package/dist/cli/commands/skills/setup/generators/claude-skill-generator.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/generators/claude-skill-generator.js +94 -0
- package/dist/cli/commands/skills/setup/generators/claude-skill-generator.js.map +1 -0
- package/dist/cli/commands/skills/setup/helpers.d.ts +12 -0
- package/dist/cli/commands/skills/setup/helpers.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/helpers.js +31 -0
- package/dist/cli/commands/skills/setup/helpers.js.map +1 -0
- package/dist/cli/commands/skills/setup/index.d.ts +5 -0
- package/dist/cli/commands/skills/setup/index.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/index.js +137 -0
- package/dist/cli/commands/skills/setup/index.js.map +1 -0
- package/dist/cli/commands/skills/setup/selection/actions.d.ts +2 -0
- package/dist/cli/commands/skills/setup/selection/actions.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/selection/actions.js +2 -0
- package/dist/cli/commands/skills/setup/selection/actions.js.map +1 -0
- package/dist/cli/commands/skills/setup/selection/constants.d.ts +11 -0
- package/dist/cli/commands/skills/setup/selection/constants.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/selection/constants.js +11 -0
- package/dist/cli/commands/skills/setup/selection/constants.js.map +1 -0
- package/dist/cli/commands/skills/setup/selection/index.d.ts +13 -0
- package/dist/cli/commands/skills/setup/selection/index.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/selection/index.js +113 -0
- package/dist/cli/commands/skills/setup/selection/index.js.map +1 -0
- package/dist/cli/commands/skills/setup/selection/interactive-prompt.d.ts +2 -0
- package/dist/cli/commands/skills/setup/selection/interactive-prompt.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/selection/interactive-prompt.js +2 -0
- package/dist/cli/commands/skills/setup/selection/interactive-prompt.js.map +1 -0
- package/dist/cli/commands/skills/setup/selection/types.d.ts +13 -0
- package/dist/cli/commands/skills/setup/selection/types.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/selection/types.js +2 -0
- package/dist/cli/commands/skills/setup/selection/types.js.map +1 -0
- package/dist/cli/commands/skills/setup/selection/ui.d.ts +3 -0
- package/dist/cli/commands/skills/setup/selection/ui.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/selection/ui.js +68 -0
- package/dist/cli/commands/skills/setup/selection/ui.js.map +1 -0
- package/dist/cli/commands/skills/setup/sync.d.ts +13 -0
- package/dist/cli/commands/skills/setup/sync.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/sync.js +46 -0
- package/dist/cli/commands/skills/setup/sync.js.map +1 -0
- package/dist/cli/commands/skills/update.d.ts +7 -0
- package/dist/cli/commands/skills/update.d.ts.map +1 -0
- package/dist/cli/commands/skills/update.js +71 -0
- package/dist/cli/commands/skills/update.js.map +1 -0
- package/dist/cli/first-time.d.ts.map +1 -1
- package/dist/cli/first-time.js +4 -0
- package/dist/cli/first-time.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/env/types.d.ts +14 -0
- package/dist/env/types.d.ts.map +1 -1
- package/dist/env/types.js.map +1 -1
- package/dist/providers/core/types.d.ts +1 -1
- package/dist/providers/core/types.d.ts.map +1 -1
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.d.ts.map +1 -1
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js +26 -2
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.d.ts +31 -0
- package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.js +148 -0
- package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +12 -13
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.js +15 -17
- package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
- package/dist/providers/plugins/sso/sso.http-client.d.ts +1 -1
- package/dist/providers/plugins/sso/sso.http-client.js +3 -3
- package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
- package/dist/providers/plugins/sso/sso.models.js +2 -2
- package/dist/providers/plugins/sso/sso.models.js.map +1 -1
- package/dist/providers/plugins/sso/sso.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.setup-steps.js +6 -10
- package/dist/providers/plugins/sso/sso.setup-steps.js.map +1 -1
- package/dist/utils/config.d.ts +14 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +95 -5
- package/dist/utils/config.js.map +1 -1
- package/package.json +22 -10
- package/scripts/copy-plugins.js +5 -0
- package/scripts/sonar/package.json +3 -0
- package/scripts/sonar/run-local-sonar.js +405 -0
- package/dist/agents/plugins/claude/plugin/commands/codemie-commit.md +0 -31
- package/dist/agents/plugins/claude/plugin/scripts/bash/rtk-auto-wrapper.sh +0 -81
- package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.d.ts +0 -30
- package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.d.ts.map +0 -1
- package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.js +0 -111
- package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.js.map +0 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle event emitter for `codemie skills *` commands.
|
|
3
|
+
*
|
|
4
|
+
* Each event is POSTed to the CodeMie backend at `/v1/skills/events`, where
|
|
5
|
+
* it is persisted in Postgres (authoritative, durable) and mirrored to the
|
|
6
|
+
* legacy Elastic-backed metrics path. Postgres survives Elastic retention,
|
|
7
|
+
* so install-count / popularity queries remain accurate forever.
|
|
8
|
+
*
|
|
9
|
+
* Behaviour:
|
|
10
|
+
* - **Auth-gated (spec §7).** If no SSO credentials are present, the helper
|
|
11
|
+
* becomes a no-op silently — no event is sent.
|
|
12
|
+
* - **Fan-out per skill.** When the wrapper knows which skills the operation
|
|
13
|
+
* targets (explicit `--skill foo bar`), one POST is emitted per skill so
|
|
14
|
+
* the backend stores `(event, skill)` rows and trivial COUNT(*) queries
|
|
15
|
+
* work. For ops without a specific skill (bare `list`, interactive `add`),
|
|
16
|
+
* a single POST is sent with `skill_*` fields null.
|
|
17
|
+
* - **Best-effort.** Any failure to load credentials, resolve the API URL,
|
|
18
|
+
* or POST is logged at debug level and swallowed — telemetry must never
|
|
19
|
+
* block a real user command.
|
|
20
|
+
*/
|
|
21
|
+
import { randomUUID } from 'node:crypto';
|
|
22
|
+
import { readFileSync } from 'node:fs';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import { ConfigLoader } from '../../../../utils/config.js';
|
|
25
|
+
import { logger } from '../../../../utils/logger.js';
|
|
26
|
+
import { detectGitBranch, detectGitRemoteRepo } from '../../../../utils/processes.js';
|
|
27
|
+
import { getDirname } from '../../../../utils/paths.js';
|
|
28
|
+
const AGENT_NAME = 'codemie-skills';
|
|
29
|
+
const ENDPOINT_PATH = '/v1/skills/events';
|
|
30
|
+
/**
|
|
31
|
+
* Build a metric session for a single `codemie skills <command>` invocation.
|
|
32
|
+
* Loads SSO credentials best-effort; if anything fails, returns a session
|
|
33
|
+
* whose `transport` is null and the lifecycle helpers become no-ops.
|
|
34
|
+
*/
|
|
35
|
+
export async function startSkillMetric(command, workingDirectory = process.cwd()) {
|
|
36
|
+
const sessionId = process.env.CODEMIE_SESSION_ID ?? randomUUID();
|
|
37
|
+
const agentVersion = readPackageVersion();
|
|
38
|
+
const transport = await tryBuildTransport(agentVersion);
|
|
39
|
+
return {
|
|
40
|
+
command,
|
|
41
|
+
sessionId,
|
|
42
|
+
agentVersion,
|
|
43
|
+
workingDirectory,
|
|
44
|
+
transport,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export async function emitStarted(session, partial) {
|
|
48
|
+
// Kept as a lifecycle primitive for callers that need in-flight visibility.
|
|
49
|
+
// Current skills commands emit terminal states only so interrupted upstream
|
|
50
|
+
// prompts do not leave durable started-only rows.
|
|
51
|
+
await emit(session, 'started', partial);
|
|
52
|
+
}
|
|
53
|
+
export async function emitCompleted(session, partial) {
|
|
54
|
+
await emit(session, 'completed', partial);
|
|
55
|
+
}
|
|
56
|
+
export async function emitFailed(session, partial) {
|
|
57
|
+
await emit(session, 'failed', partial);
|
|
58
|
+
}
|
|
59
|
+
async function emit(session, status, partial) {
|
|
60
|
+
if (!session.transport) {
|
|
61
|
+
if (shouldLogSkillMetricDebug(session.command)) {
|
|
62
|
+
logSkillMetricDebug(session.command, {
|
|
63
|
+
sent: false,
|
|
64
|
+
reason: 'no event transport; missing CodeMie URL, SSO cookies, or API base',
|
|
65
|
+
command: session.command,
|
|
66
|
+
status,
|
|
67
|
+
session_id: session.sessionId,
|
|
68
|
+
partial,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const transport = session.transport;
|
|
74
|
+
try {
|
|
75
|
+
const [branch, repository] = await Promise.all([
|
|
76
|
+
detectGitBranch(session.workingDirectory),
|
|
77
|
+
detectGitRemoteRepo(session.workingDirectory),
|
|
78
|
+
]);
|
|
79
|
+
const baseBody = {
|
|
80
|
+
session_id: session.sessionId,
|
|
81
|
+
command: session.command,
|
|
82
|
+
status,
|
|
83
|
+
...(partial.scope !== undefined && { scope: partial.scope }),
|
|
84
|
+
...(partial.error_code !== undefined && { error_code: partial.error_code }),
|
|
85
|
+
...(partial.agent_selection_mode !== undefined && {
|
|
86
|
+
agent_selection_mode: partial.agent_selection_mode,
|
|
87
|
+
}),
|
|
88
|
+
...(partial.target_agents && partial.target_agents.length > 0 && {
|
|
89
|
+
target_agents: partial.target_agents,
|
|
90
|
+
}),
|
|
91
|
+
...(partial.source !== undefined && { source: partial.source }),
|
|
92
|
+
agent: AGENT_NAME,
|
|
93
|
+
agent_version: session.agentVersion,
|
|
94
|
+
...(repository && { repository }),
|
|
95
|
+
...(branch && { branch }),
|
|
96
|
+
...(partial.attributes && Object.keys(partial.attributes).length > 0 && {
|
|
97
|
+
attributes: partial.attributes,
|
|
98
|
+
}),
|
|
99
|
+
};
|
|
100
|
+
const targetedSkills = partial.skill_names ?? [];
|
|
101
|
+
const bodies = targetedSkills.length > 0
|
|
102
|
+
? targetedSkills.map((name) => ({
|
|
103
|
+
...baseBody,
|
|
104
|
+
skill_name: name,
|
|
105
|
+
skill_slug: toSkillSlug(name),
|
|
106
|
+
skill_id: composeSkillId(partial.source, toSkillSlug(name)),
|
|
107
|
+
}))
|
|
108
|
+
: [{ ...baseBody }];
|
|
109
|
+
logger.debug('[skills] Emitting skill events', {
|
|
110
|
+
command: session.command,
|
|
111
|
+
status,
|
|
112
|
+
scope: partial.scope,
|
|
113
|
+
session_id: session.sessionId,
|
|
114
|
+
events: bodies.length,
|
|
115
|
+
});
|
|
116
|
+
await Promise.all(bodies.map((body) => postOne(transport, body)));
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
120
|
+
logger.debug(`[skills] Event emission failed (${status}): ${message}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async function postOne(transport, body) {
|
|
124
|
+
const url = `${transport.apiUrl}${ENDPOINT_PATH}`;
|
|
125
|
+
const headers = {
|
|
126
|
+
'Content-Type': 'application/json',
|
|
127
|
+
'User-Agent': `codemie-cli/${transport.cliVersion}`,
|
|
128
|
+
'X-CodeMie-CLI': `codemie-cli/${transport.cliVersion}`,
|
|
129
|
+
'X-CodeMie-Client': 'codemie-cli',
|
|
130
|
+
Cookie: transport.cookieHeader,
|
|
131
|
+
};
|
|
132
|
+
if (body.repository)
|
|
133
|
+
headers['X-CodeMie-Repository'] = body.repository;
|
|
134
|
+
if (body.branch)
|
|
135
|
+
headers['X-CodeMie-Branch'] = body.branch;
|
|
136
|
+
if (body.project)
|
|
137
|
+
headers['X-CodeMie-Project'] = body.project;
|
|
138
|
+
if (shouldLogSkillMetricDebug(body.command)) {
|
|
139
|
+
const debugPayload = {
|
|
140
|
+
url,
|
|
141
|
+
headers: redactSensitiveHeaders(headers),
|
|
142
|
+
body,
|
|
143
|
+
};
|
|
144
|
+
logSkillMetricDebug(body.command, { sent: true, ...debugPayload });
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const response = await fetch(url, {
|
|
148
|
+
method: 'POST',
|
|
149
|
+
headers,
|
|
150
|
+
body: JSON.stringify(body),
|
|
151
|
+
});
|
|
152
|
+
if (!response.ok) {
|
|
153
|
+
const text = await response.text().catch(() => '');
|
|
154
|
+
logger.debug(`[skills] /v1/skills/events POST returned HTTP ${response.status} ${response.statusText}: ${text.slice(0, 200)}`);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const data = (await response.json().catch(() => ({})));
|
|
158
|
+
logger.debug('[skills] Skill event recorded', {
|
|
159
|
+
id: data.id,
|
|
160
|
+
command: body.command,
|
|
161
|
+
status: body.status,
|
|
162
|
+
skill_id: body.skill_id,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
167
|
+
logger.debug(`[skills] Skill event POST failed: ${message}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function redactSensitiveHeaders(headers) {
|
|
171
|
+
return Object.fromEntries(Object.entries(headers).map(([key, value]) => [
|
|
172
|
+
key,
|
|
173
|
+
key.toLowerCase() === 'cookie' ? '<redacted>' : value,
|
|
174
|
+
]));
|
|
175
|
+
}
|
|
176
|
+
function shouldLogSkillMetricDebug(command) {
|
|
177
|
+
return command === 'add' || command === 'remove' || command === 'update';
|
|
178
|
+
}
|
|
179
|
+
function logSkillMetricDebug(command, payload) {
|
|
180
|
+
logger.debug(`[skills] CodeMie ${command} metric debug`, payload);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Mirror of upstream `skills` CLI `toSkillSlug`. Keeping the algorithm
|
|
184
|
+
* byte-for-byte identical means the canonical `<source>/<slug>` we send
|
|
185
|
+
* matches whatever the upstream tooling computes, so cross-system joins
|
|
186
|
+
* (e.g. comparing our install counts to skills.sh download counts) work
|
|
187
|
+
* without a translation layer.
|
|
188
|
+
*/
|
|
189
|
+
export function toSkillSlug(name) {
|
|
190
|
+
if (!name)
|
|
191
|
+
return '';
|
|
192
|
+
return name
|
|
193
|
+
.toLowerCase()
|
|
194
|
+
.replace(/[\s_]+/g, '-')
|
|
195
|
+
.replace(/[^a-z0-9-]/g, '')
|
|
196
|
+
.replace(/-+/g, '-')
|
|
197
|
+
.replace(/^-|-$/g, '');
|
|
198
|
+
}
|
|
199
|
+
function composeSkillId(source, slug) {
|
|
200
|
+
if (!slug)
|
|
201
|
+
return undefined;
|
|
202
|
+
return source ? `${source}/${slug}` : slug;
|
|
203
|
+
}
|
|
204
|
+
async function tryBuildTransport(agentVersion) {
|
|
205
|
+
let config;
|
|
206
|
+
try {
|
|
207
|
+
config = await ConfigLoader.load();
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
logger.debug('[skills] Skipping event emission: configuration not loaded', error);
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
const ssoUrl = config.codeMieUrl || config.baseUrl;
|
|
214
|
+
if (!ssoUrl) {
|
|
215
|
+
logger.debug('[skills] Skipping event emission: no CodeMie URL configured');
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
let cookieHeader = '';
|
|
219
|
+
let apiUrl;
|
|
220
|
+
try {
|
|
221
|
+
const { CodeMieSSO } = await import('../../../../providers/plugins/sso/sso.auth.js');
|
|
222
|
+
const sso = new CodeMieSSO();
|
|
223
|
+
const credentials = await sso.getStoredCredentials(ssoUrl);
|
|
224
|
+
if (credentials?.cookies) {
|
|
225
|
+
cookieHeader = Object.entries(credentials.cookies)
|
|
226
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
227
|
+
.join('; ');
|
|
228
|
+
}
|
|
229
|
+
// credentials.apiUrl is the resolved API base (e.g.
|
|
230
|
+
// "<codeMieUrl>/code-assistant-api"). The bare baseUrl from the profile
|
|
231
|
+
// points at the LLM proxy for SSO providers and does NOT serve our
|
|
232
|
+
// events endpoint, so we prefer the credential-stored URL.
|
|
233
|
+
apiUrl = credentials?.apiUrl;
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
logger.debug('[skills] Failed to load SSO credentials for events', error);
|
|
237
|
+
}
|
|
238
|
+
if (!cookieHeader) {
|
|
239
|
+
logger.debug('[skills] Skipping event emission: no SSO cookies available');
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
if (!apiUrl) {
|
|
243
|
+
try {
|
|
244
|
+
const { ensureApiBase } = await import('../../../../providers/core/codemie-auth-helpers.js');
|
|
245
|
+
apiUrl = ensureApiBase(ssoUrl);
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
logger.debug('[skills] Skipping event emission: cannot resolve API base URL', error);
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
logger.debug('[skills] Built skill events transport', { apiUrl });
|
|
253
|
+
return { apiUrl, cookieHeader, cliVersion: agentVersion };
|
|
254
|
+
}
|
|
255
|
+
function readPackageVersion() {
|
|
256
|
+
try {
|
|
257
|
+
const here = getDirname(import.meta.url);
|
|
258
|
+
// Walk up from <root>/{src,dist}/cli/commands/skills/lib to <root>.
|
|
259
|
+
const root = path.resolve(here, '..', '..', '..', '..', '..');
|
|
260
|
+
const pkgPath = path.join(root, 'package.json');
|
|
261
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
262
|
+
return pkg.version ?? 'unknown';
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
return process.env.CODEMIE_CLI_VERSION ?? 'unknown';
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=skills-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-metrics.js","sourceRoot":"","sources":["../../../../../src/cli/commands/skills/lib/skills-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface SkillSearchResult {
|
|
2
|
+
name: string;
|
|
3
|
+
slug: string;
|
|
4
|
+
source: string;
|
|
5
|
+
installs?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface SearchSection {
|
|
8
|
+
available: boolean;
|
|
9
|
+
results: SkillSearchResult[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Pre-resolved internal endpoint plus the SSO/identification headers
|
|
13
|
+
* that the internal HTTP call needs. `null` when no internal URL is
|
|
14
|
+
* configured (env var unset and `skillsSearchUrl` empty).
|
|
15
|
+
*/
|
|
16
|
+
export interface InternalSearchContext {
|
|
17
|
+
url: string;
|
|
18
|
+
headers: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export declare function searchPublic(query: string, limit: number): Promise<SearchSection>;
|
|
21
|
+
/**
|
|
22
|
+
* Search the internal CodeMie catalog.
|
|
23
|
+
*
|
|
24
|
+
* If `context` is supplied, no `ConfigLoader.load` happens here — the
|
|
25
|
+
* orchestrator already resolved the URL and headers. Falling back to
|
|
26
|
+
* `null` keeps the function callable in isolation (e.g. ad-hoc scripts
|
|
27
|
+
* or future call sites) at the cost of one config read.
|
|
28
|
+
*/
|
|
29
|
+
export declare function searchInternal(query: string, limit: number, context?: InternalSearchContext | null): Promise<SearchSection>;
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the internal endpoint URL and SSO/identification headers in a
|
|
32
|
+
* single config load. Returns `null` when no URL is configured (env var
|
|
33
|
+
* unset and `skillsSearchUrl` profile field empty).
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveInternalContext(): Promise<InternalSearchContext | null>;
|
|
36
|
+
//# sourceMappingURL=skills-search-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-search-client.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/skills/lib/skills-search-client.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAaD,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAGvF;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,GACrC,OAAO,CAAC,aAAa,CAAC,CASxB;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAuBpF"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP search clients for `codemie skills find`.
|
|
3
|
+
*
|
|
4
|
+
* Two sources, both behind the same shape (`SearchSection`):
|
|
5
|
+
*
|
|
6
|
+
* - Internal (EPAM catalog): URL resolved from
|
|
7
|
+
* `CODEMIE_SKILLS_SEARCH_URL` env var, then `skillsSearchUrl` profile
|
|
8
|
+
* field. SSO cookies are attached so the future internal API can
|
|
9
|
+
* gate on identity. When the URL is unresolved we return
|
|
10
|
+
* `{ available: false, results: [] }` immediately (no HTTP call) so
|
|
11
|
+
* the friendly placeholder renders.
|
|
12
|
+
* - Public (skills.sh): fixed `https://skills.sh/api/search`. No auth.
|
|
13
|
+
*
|
|
14
|
+
* Both functions are designed to never throw. Any error path returns
|
|
15
|
+
* `{ available: false, results: [] }` and logs at debug level so that
|
|
16
|
+
* one source going down never breaks the other.
|
|
17
|
+
*
|
|
18
|
+
* `resolveInternalContext` is exposed so the orchestrator can decide
|
|
19
|
+
* once whether the internal section is configured (used both as a
|
|
20
|
+
* "render placeholder vs no-results" hint and to short-circuit the
|
|
21
|
+
* HTTP call) without paying the cost of a second `ConfigLoader.load`.
|
|
22
|
+
*/
|
|
23
|
+
import { ConfigLoader } from '../../../../utils/config.js';
|
|
24
|
+
import { logger } from '../../../../utils/logger.js';
|
|
25
|
+
import { stripControlChars } from './sanitize.js';
|
|
26
|
+
const PUBLIC_API_URL = 'https://skills.sh/api/search';
|
|
27
|
+
const INTERNAL_ENV_VAR = 'CODEMIE_SKILLS_SEARCH_URL';
|
|
28
|
+
const REQUEST_TIMEOUT_MS = 5_000;
|
|
29
|
+
export async function searchPublic(query, limit) {
|
|
30
|
+
const url = `${PUBLIC_API_URL}?q=${encodeURIComponent(query)}&limit=${limit}`;
|
|
31
|
+
return fetchSearchResults(url, {});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Search the internal CodeMie catalog.
|
|
35
|
+
*
|
|
36
|
+
* If `context` is supplied, no `ConfigLoader.load` happens here — the
|
|
37
|
+
* orchestrator already resolved the URL and headers. Falling back to
|
|
38
|
+
* `null` keeps the function callable in isolation (e.g. ad-hoc scripts
|
|
39
|
+
* or future call sites) at the cost of one config read.
|
|
40
|
+
*/
|
|
41
|
+
export async function searchInternal(query, limit, context) {
|
|
42
|
+
const ctx = context === undefined ? await resolveInternalContext() : context;
|
|
43
|
+
if (!ctx) {
|
|
44
|
+
logger.debug('[skills] No internal search URL configured; rendering placeholder');
|
|
45
|
+
return { available: false, results: [] };
|
|
46
|
+
}
|
|
47
|
+
const url = appendQuery(ctx.url, query, limit);
|
|
48
|
+
return fetchSearchResults(url, ctx.headers);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Resolve the internal endpoint URL and SSO/identification headers in a
|
|
52
|
+
* single config load. Returns `null` when no URL is configured (env var
|
|
53
|
+
* unset and `skillsSearchUrl` profile field empty).
|
|
54
|
+
*/
|
|
55
|
+
export async function resolveInternalContext() {
|
|
56
|
+
const envOverride = process.env[INTERNAL_ENV_VAR];
|
|
57
|
+
if (envOverride && envOverride.trim().length > 0) {
|
|
58
|
+
return {
|
|
59
|
+
url: envOverride.trim(),
|
|
60
|
+
headers: await buildInternalHeaders(),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const config = await ConfigLoader.load();
|
|
65
|
+
const fromConfig = config.skillsSearchUrl;
|
|
66
|
+
if (!fromConfig || fromConfig.trim().length === 0) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
url: fromConfig.trim(),
|
|
71
|
+
headers: await buildInternalHeaders(config.codeMieUrl || config.baseUrl),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
logger.debug('[skills] Failed to resolve internal search context', error);
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function buildInternalHeaders(ssoUrl) {
|
|
80
|
+
const headers = {
|
|
81
|
+
Accept: 'application/json',
|
|
82
|
+
'X-CodeMie-Client': 'codemie-cli',
|
|
83
|
+
};
|
|
84
|
+
let resolvedSsoUrl = ssoUrl;
|
|
85
|
+
if (!resolvedSsoUrl) {
|
|
86
|
+
try {
|
|
87
|
+
const config = await ConfigLoader.load();
|
|
88
|
+
resolvedSsoUrl = config.codeMieUrl || config.baseUrl;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// fall through; we just won't have cookies
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (!resolvedSsoUrl)
|
|
95
|
+
return headers;
|
|
96
|
+
try {
|
|
97
|
+
const { CodeMieSSO } = await import('../../../../providers/plugins/sso/sso.auth.js');
|
|
98
|
+
const sso = new CodeMieSSO();
|
|
99
|
+
const credentials = await sso.getStoredCredentials(resolvedSsoUrl);
|
|
100
|
+
if (credentials?.cookies) {
|
|
101
|
+
const cookieHeader = Object.entries(credentials.cookies)
|
|
102
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
103
|
+
.join('; ');
|
|
104
|
+
if (cookieHeader) {
|
|
105
|
+
headers.Cookie = cookieHeader;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
logger.debug('[skills] Failed to attach SSO cookies for internal search', error);
|
|
111
|
+
}
|
|
112
|
+
return headers;
|
|
113
|
+
}
|
|
114
|
+
function appendQuery(baseUrl, query, limit) {
|
|
115
|
+
const sep = baseUrl.includes('?') ? '&' : '?';
|
|
116
|
+
return `${baseUrl}${sep}q=${encodeURIComponent(query)}&limit=${limit}`;
|
|
117
|
+
}
|
|
118
|
+
async function fetchSearchResults(url, headers) {
|
|
119
|
+
const controller = new AbortController();
|
|
120
|
+
const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
121
|
+
try {
|
|
122
|
+
const response = await fetch(url, { headers, signal: controller.signal });
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
logger.debug(`[skills] Search request returned HTTP ${response.status} ${response.statusText}: ${url}`);
|
|
125
|
+
return { available: false, results: [] };
|
|
126
|
+
}
|
|
127
|
+
const data = (await response.json().catch(() => ({})));
|
|
128
|
+
const skills = Array.isArray(data.skills) ? data.skills : [];
|
|
129
|
+
const results = skills
|
|
130
|
+
.map((raw) => ({
|
|
131
|
+
name: stripControlChars(raw.name ?? ''),
|
|
132
|
+
slug: stripControlChars(raw.id ?? ''),
|
|
133
|
+
source: stripControlChars(raw.source ?? ''),
|
|
134
|
+
installs: typeof raw.installs === 'number' ? raw.installs : undefined,
|
|
135
|
+
}))
|
|
136
|
+
.filter((entry) => entry.slug.length > 0);
|
|
137
|
+
return { available: true, results };
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
logger.debug(`[skills] Search request failed for ${url}`, error);
|
|
141
|
+
return { available: false, results: [] };
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
clearTimeout(timer);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=skills-search-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-search-client.js","sourceRoot":"","sources":["../../../../../src/cli/commands/skills/lib/skills-search-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses structured payloads captured from upstream `skills` telemetry.
|
|
3
|
+
*
|
|
4
|
+
* The egress guard blocks the upstream network request but writes the query
|
|
5
|
+
* payload to stderr with this marker. This gives the wrapper the selected
|
|
6
|
+
* skill names from interactive upstream flows without parsing human output.
|
|
7
|
+
*/
|
|
8
|
+
export declare const SKILLS_SH_TELEMETRY_MARKER = "CODEMIE_SKILLS_SH_TELEMETRY";
|
|
9
|
+
export declare function parseSkillNamesFromSkillsTelemetry(stderr: string, event: string): string[] | undefined;
|
|
10
|
+
//# sourceMappingURL=skills-sh-telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-sh-telemetry.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/skills/lib/skills-sh-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,eAAO,MAAM,0BAA0B,gCAAgC,CAAC;AAOxE,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,EAAE,GAAG,SAAS,CAsBtB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses structured payloads captured from upstream `skills` telemetry.
|
|
3
|
+
*
|
|
4
|
+
* The egress guard blocks the upstream network request but writes the query
|
|
5
|
+
* payload to stderr with this marker. This gives the wrapper the selected
|
|
6
|
+
* skill names from interactive upstream flows without parsing human output.
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from '../../../../utils/logger.js';
|
|
9
|
+
import { capList } from './sanitize.js';
|
|
10
|
+
export const SKILLS_SH_TELEMETRY_MARKER = 'CODEMIE_SKILLS_SH_TELEMETRY';
|
|
11
|
+
export function parseSkillNamesFromSkillsTelemetry(stderr, event) {
|
|
12
|
+
const skillNames = [];
|
|
13
|
+
const lines = stderr
|
|
14
|
+
.split(/\r?\n/)
|
|
15
|
+
.filter((line) => line.startsWith(`${SKILLS_SH_TELEMETRY_MARKER} `));
|
|
16
|
+
for (const line of lines) {
|
|
17
|
+
const rawPayload = line.slice(SKILLS_SH_TELEMETRY_MARKER.length + 1);
|
|
18
|
+
try {
|
|
19
|
+
const payload = JSON.parse(rawPayload);
|
|
20
|
+
if (payload.event !== event || !payload.skills) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
skillNames.push(...payload.skills.split(',').map((skill) => skill.trim()));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
logger.debug('[skills] Failed to parse skills.sh telemetry payload', {
|
|
27
|
+
error: error instanceof Error ? error.message : String(error),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return capList(skillNames);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=skills-sh-telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-sh-telemetry.js","sourceRoot":"","sources":["../../../../../src/cli/commands/skills/lib/skills-sh-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,CAAC,MAAM,0BAA0B,GAAG,6BAA6B,CAAC;AAOxE,MAAM,UAAU,kCAAkC,CAChD,MAAc,EACd,KAAa;IAEb,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM;SACjB,KAAK,CAAC,OAAO,CAAC;SACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,0BAA0B,GAAG,CAAC,CAAC,CAAC;IAEvE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAA2B,CAAC;YACjE,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/C,SAAS;YACX,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sDAAsD,EAAE;gBACnE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codemie skills list` — pass-through wrapper around the upstream
|
|
3
|
+
* `skills list` subcommand. Auth-gated only; no CodeMie lifecycle metrics.
|
|
4
|
+
* List is a read-only inspection command and was intentionally excluded from
|
|
5
|
+
* backend skill lifecycle metrics to avoid low-value noise.
|
|
6
|
+
*
|
|
7
|
+
* `--json` is forwarded to the upstream CLI so machine-readable output
|
|
8
|
+
* stays under upstream's control. The wrapper never parses output to
|
|
9
|
+
* extract installed skill metadata.
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
export declare function createListCommand(): Command;
|
|
13
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/skills/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,iBAAiB,IAAI,OAAO,CAyC3C"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codemie skills list` — pass-through wrapper around the upstream
|
|
3
|
+
* `skills list` subcommand. Auth-gated only; no CodeMie lifecycle metrics.
|
|
4
|
+
* List is a read-only inspection command and was intentionally excluded from
|
|
5
|
+
* backend skill lifecycle metrics to avoid low-value noise.
|
|
6
|
+
*
|
|
7
|
+
* `--json` is forwarded to the upstream CLI so machine-readable output
|
|
8
|
+
* stays under upstream's control. The wrapper never parses output to
|
|
9
|
+
* extract installed skill metadata.
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
import { logger } from '../../../utils/logger.js';
|
|
13
|
+
import { runSkillsCli } from './lib/run-skills-cli.js';
|
|
14
|
+
import { requireAuthenticatedSession } from './lib/require-auth.js';
|
|
15
|
+
export function createListCommand() {
|
|
16
|
+
return new Command('list')
|
|
17
|
+
.description('List installed skills via the upstream skills CLI')
|
|
18
|
+
.option('-g, --global', 'list user-scoped skills')
|
|
19
|
+
.option('-a, --agent <agent>', 'filter by target agent')
|
|
20
|
+
.option('--json', 'emit JSON output (forwarded to upstream)')
|
|
21
|
+
.action(async (options) => {
|
|
22
|
+
await requireAuthenticatedSession();
|
|
23
|
+
const cwd = process.cwd();
|
|
24
|
+
const args = ['list'];
|
|
25
|
+
if (options.global)
|
|
26
|
+
args.push('--global');
|
|
27
|
+
if (options.agent)
|
|
28
|
+
args.push('--agent', options.agent);
|
|
29
|
+
if (options.json)
|
|
30
|
+
args.push('--json');
|
|
31
|
+
// List is read-only; capture output instead of inheriting stdio so the
|
|
32
|
+
// upstream JSON mode (when requested) can be piped cleanly.
|
|
33
|
+
const interactive = !options.json;
|
|
34
|
+
try {
|
|
35
|
+
const result = await runSkillsCli(args, { cwd, interactive });
|
|
36
|
+
// In non-interactive (--json) mode the child output was captured but
|
|
37
|
+
// not echoed, so forward it to the caller verbatim.
|
|
38
|
+
if (!interactive) {
|
|
39
|
+
if (result.stdout)
|
|
40
|
+
process.stdout.write(`${result.stdout}\n`);
|
|
41
|
+
if (result.stderr)
|
|
42
|
+
process.stderr.write(`${result.stderr}\n`);
|
|
43
|
+
}
|
|
44
|
+
if (result.code === 0) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
process.exit(result.code || 1);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger.error(`[skills] list failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/cli/commands/skills/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAQpE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,cAAc,EAAE,yBAAyB,CAAC;SACjD,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;QACrC,MAAM,2BAA2B,EAAE,CAAC;QAEpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE1B,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,IAAI,OAAO,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,OAAO,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtC,uEAAuE;QACvE,4DAA4D;QAC5D,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;YAE9D,qEAAqE;YACrE,oDAAoD;YACpD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,IAAI,MAAM,CAAC,MAAM;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;gBAC9D,IAAI,MAAM,CAAC,MAAM;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAClF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codemie skills remove [skills...]` — pass-through wrapper around the
|
|
3
|
+
* upstream `skills remove` subcommand. Auth-gated and lifecycle-metricked.
|
|
4
|
+
*
|
|
5
|
+
* `target_agents` is emitted only when the user explicitly passed `--agent`
|
|
6
|
+
* — the wrapper never auto-detects on remove because removal is destructive
|
|
7
|
+
* and the user should be specific.
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
export declare function createRemoveCommand(): Command;
|
|
11
|
+
//# sourceMappingURL=remove.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/skills/remove.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,mBAAmB,IAAI,OAAO,CAgF7C"}
|