diff --git a/sdk/.gitleaks.toml b/.gitleaks.toml similarity index 100% rename from sdk/.gitleaks.toml rename to .gitleaks.toml diff --git a/sdk/.greptile/config.json b/.greptile/config.json similarity index 88% rename from sdk/.greptile/config.json rename to .greptile/config.json index 353dd48141..2fbdc32fb5 100644 --- a/sdk/.greptile/config.json +++ b/.greptile/config.json @@ -6,15 +6,18 @@ { "id": "sdk-tool-handler-telemetry", "rule": "Any new tool handler added to packages/agents/src or packages/core/src that performs a user-visible action (writes files, executes commands, modifies state, calls external APIs) must include a call to captureToolUsage() from packages/core/src/services/telemetry/core-events.ts, or emit a task.tool_used event via telemetry.capture(). Pure read-only helpers and getters are exempt. When in doubt, prefer instrumentation.", - "scope": ["packages/agents/src/**", "packages/core/src/**"], + "scope": [ + "sdk/packages/agents/src/**", + "sdk/packages/core/src/**" + ], "severity": "high" }, { "id": "sdk-session-lifecycle-telemetry", "rule": "New session start, end, or state-transition code paths in packages/core/src must call the appropriate typed helper from packages/core/src/services/telemetry/core-events.ts (captureTaskCreated, captureTaskCompleted, captureConversationTurnEvent, captureTokenUsage, etc.). Do not inline raw telemetry.capture() calls for session lifecycle events — always use the typed helper, which guarantees a consistent payload shape.", "scope": [ - "packages/core/src/cline-core/**", - "packages/core/src/runtime/**" + "sdk/packages/core/src/cline-core/**", + "sdk/packages/core/src/runtime/**" ], "severity": "high" }, @@ -22,8 +25,8 @@ "id": "sdk-no-raw-event-strings", "rule": "All telemetry event name strings must be sourced from CORE_TELEMETRY_EVENTS in packages/core/src/services/telemetry/core-events.ts. If a PR introduces a string literal in a telemetry.capture(), telemetry.captureRequired(), or recordCounter()/recordHistogram()/recordGauge() call that does not reference CORE_TELEMETRY_EVENTS, flag it. New events must be added to CORE_TELEMETRY_EVENTS first, with a typed capture helper created alongside them.", "scope": [ - "packages/core/src/**", - "packages/agents/src/**", + "sdk/packages/core/src/**", + "sdk/packages/agents/src/**", "apps/cli/src/**", "apps/vscode/src/**" ], @@ -32,13 +35,17 @@ { "id": "sdk-auth-telemetry-completeness", "rule": "Any new OAuth or authentication provider added under packages/core/src/auth must emit all four lifecycle events using the typed helpers from core-events.ts: captureAuthStarted (at flow entry), captureAuthSucceeded + identifyAccount (on token success), captureAuthFailed (on error), and captureAuthLoggedOut (on token invalidation or explicit logout). Flag PRs that introduce a new auth flow file without all four. Cross-reference packages/core/src/auth/cline.ts and packages/core/src/auth/codex.ts as canonical examples.", - "scope": ["packages/core/src/auth/**"], + "scope": [ + "sdk/packages/core/src/auth/**" + ], "severity": "high" }, { "id": "sdk-telemetry-doc-update", "rule": "Any PR that adds new event constants to CORE_TELEMETRY_EVENTS in packages/core/src/services/telemetry/core-events.ts, adds new capture* helper functions, or changes the payload shape of an existing event must update the Event Catalog section in DOC.md. Flag PRs that modify core-events.ts without a corresponding change to DOC.md.", - "scope": ["packages/core/src/services/telemetry/core-events.ts"], + "scope": [ + "sdk/packages/core/src/services/telemetry/core-events.ts" + ], "severity": "medium" } ] diff --git a/sdk/.greptile/files.json b/.greptile/files.json similarity index 82% rename from sdk/.greptile/files.json rename to .greptile/files.json index f3fb28648e..6e6826d9e5 100644 --- a/sdk/.greptile/files.json +++ b/.greptile/files.json @@ -1,19 +1,19 @@ { "files": [ { - "path": "packages/core/src/services/telemetry/core-events.ts", + "path": "sdk/packages/core/src/services/telemetry/core-events.ts", "description": "Single source of truth for all telemetry event names (CORE_TELEMETRY_EVENTS) and their typed capture helper functions. Every PR touching telemetry must be evaluated against this catalog. New events must be defined here first." }, { - "path": "packages/shared/src/services/telemetry.ts", + "path": "sdk/packages/shared/src/services/telemetry.ts", "description": "ITelemetryService interface definition. Defines the contract all telemetry implementations must satisfy (capture, captureRequired, recordCounter, recordHistogram, recordGauge, flush, dispose)." }, { - "path": "packages/core/src/services/telemetry/TelemetryService.ts", + "path": "sdk/packages/core/src/services/telemetry/TelemetryService.ts", "description": "Reference implementation of ITelemetryService used by all hosts. Multi-adapter fan-out service that forwards events to OpenTelemetry." }, { - "path": "packages/core/src/services/telemetry/OpenTelemetryProvider.ts", + "path": "sdk/packages/core/src/services/telemetry/OpenTelemetryProvider.ts", "description": "OpenTelemetry-backed provider that wires logs/metrics/traces exporters. Contains createConfiguredTelemetryService and createConfiguredTelemetryHandle, the canonical factories every host should use." }, { @@ -21,11 +21,11 @@ "description": "Public API and event documentation. The Event Catalog and 'Activation funnel' sections must be kept in sync with core-events.ts. Host integration rules (CLI dir ordering, hub daemon metadata forwarding) are documented here." }, { - "path": "ARCHITECTURE.md", + "path": "sdk/ARCHITECTURE.md", "description": "Architecture reference. Telemetry design decisions, completion semantics (submit_and_exit anchoring), and hub-daemon telemetry forwarding are documented here. Use as ground truth for design intent." }, { - "path": "AGENTS.md", + "path": "sdk/AGENTS.md", "description": "Package boundary rules. Telemetry runtime services live in @cline/core; @cline/agents must not own stateful telemetry. Use to evaluate whether a telemetry change is being made in the correct package." } ] diff --git a/sdk/.greptile/rules.md b/.greptile/rules.md similarity index 90% rename from sdk/.greptile/rules.md rename to .greptile/rules.md index 54cfc6a00f..56640ff0c1 100644 --- a/sdk/.greptile/rules.md +++ b/.greptile/rules.md @@ -10,9 +10,9 @@ The SDK uses OpenTelemetry (OTEL) as its sole telemetry transport. Events flow t ``` core-events.ts (event catalog + typed helpers) ↓ -ITelemetryService (packages/shared) ← interface contract +ITelemetryService (sdk/packages/shared) ← interface contract ↓ -TelemetryService (packages/core) ← multi-adapter fan-out +TelemetryService (sdk/packages/core) ← multi-adapter fan-out ↓ OpenTelemetryAdapter → OpenTelemetryProvider ← OTLP transport ↓ @@ -24,7 +24,7 @@ parallel-but-independent stacks; this `.greptile/` config covers only the SDK. ## The Single Source of Truth -`packages/core/src/services/telemetry/core-events.ts` is the single source of truth for all +`sdk/packages/core/src/services/telemetry/core-events.ts` is the single source of truth for all event names. It exports: - `CORE_TELEMETRY_EVENTS` — a frozen const object grouped by family @@ -60,8 +60,8 @@ Emission ownership: emitter in `prepareLocalRuntimeBootstrap`. Hosts must NOT re-emit these. - `workspace.path_resolved`: emitted from default tool executors **only when** `WorkspaceManager` exposes more than one root. -- `task.*`: emitted by core session lifecycle code in `packages/core/src/cline-core/` and - `packages/core/src/runtime/`. Hosts must not duplicate this emission. +- `task.*`: emitted by core session lifecycle code in `sdk/packages/core/src/cline-core/` and + `sdk/packages/core/src/runtime/`. Hosts must not duplicate this emission. ## `task.completed` Semantics @@ -105,7 +105,7 @@ forwarding, hub-backed sessions silently drop their lifecycle telemetry. ## Auth Lifecycle Completeness -Every authentication provider in `packages/core/src/auth/` must emit all four auth lifecycle +Every authentication provider in `sdk/packages/core/src/auth/` must emit all four auth lifecycle events using the typed helpers: | Phase | Helper | Where it fires | @@ -115,7 +115,7 @@ events using the typed helpers: | Token error | `captureAuthFailed(provider, errorMessage)` | In the catch block | | Token invalidation | `captureAuthLoggedOut(provider, reason)` | On invalid_grant or explicit logout | -Cross-reference `packages/core/src/auth/cline.ts` and `packages/core/src/auth/codex.ts` as +Cross-reference `sdk/packages/core/src/auth/cline.ts` and `sdk/packages/core/src/auth/codex.ts` as canonical examples of all four phases. ## Single Telemetry Service Per Host diff --git a/sdk/.kanban/config.json b/.kanban/config.json similarity index 100% rename from sdk/.kanban/config.json rename to .kanban/config.json diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index bf1e1ba1e5..c894ac9d91 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -43,7 +43,7 @@ ] } }, - "include": ["**/*.ts", "**/*.tsx", "**/bun.mts"], + "include": ["**/*.ts", "**/*.tsx", "**/bun.mts", "../vitest.config.ts"], "exclude": [ "node_modules", "**/dist/**", diff --git a/sdk/vitest.workspace.ts b/sdk/vitest.workspace.ts deleted file mode 100644 index 0e4333119c..0000000000 --- a/sdk/vitest.workspace.ts +++ /dev/null @@ -1,7 +0,0 @@ -export default [ - "packages/agents/vitest.config.ts", - "packages/core/vitest.config.ts", - "packages/hub/vitest.config.ts", - "packages/llms/vitest.config.ts", - "../apps/cli/vitest.config.ts", -]; diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000000..f798e90e73 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + projects: [ + "sdk/packages/agents/vitest.config.ts", + "sdk/packages/core/vitest.config.ts", + "sdk/packages/llms/vitest.config.ts", + "sdk/packages/shared/vitest.config.ts", + "apps/cli/vitest.config.ts", + ], + }, +}); \ No newline at end of file