@revenium/claude-code-metering 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/.env.example +15 -0
  2. package/.eslintrc.js +24 -0
  3. package/.github/workflows/branch-bypass-alert.yml +68 -0
  4. package/CODE_OF_CONDUCT.md +57 -0
  5. package/CONTRIBUTING.md +73 -0
  6. package/README.md +57 -3
  7. package/SECURITY.md +46 -0
  8. package/dist/cli/commands/setup.js +3 -1
  9. package/dist/cli/commands/setup.js.map +1 -1
  10. package/dist/core/api/client.d.ts.map +1 -1
  11. package/dist/core/api/client.js +4 -1
  12. package/dist/core/api/client.js.map +1 -1
  13. package/dist/core/tool-context.d.ts +6 -0
  14. package/dist/core/tool-context.d.ts.map +1 -0
  15. package/dist/core/tool-context.js +21 -0
  16. package/dist/core/tool-context.js.map +1 -0
  17. package/dist/core/tool-tracker.d.ts +4 -0
  18. package/dist/core/tool-tracker.d.ts.map +1 -0
  19. package/dist/core/tool-tracker.js +156 -0
  20. package/dist/core/tool-tracker.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/types/index.d.ts +1 -0
  26. package/dist/types/index.d.ts.map +1 -1
  27. package/dist/types/index.js +15 -0
  28. package/dist/types/index.js.map +1 -1
  29. package/dist/types/tool-metering.d.ts +36 -0
  30. package/dist/types/tool-metering.d.ts.map +1 -0
  31. package/dist/types/tool-metering.js +3 -0
  32. package/dist/types/tool-metering.js.map +1 -0
  33. package/docs/research/settings-json-telemetry-findings.md +171 -0
  34. package/examples/README.md +114 -0
  35. package/examples/validation/validate-installation.sh +212 -0
  36. package/package.json +4 -10
  37. package/public-allowlist-node.txt +7 -0
  38. package/src/cli/commands/backfill.ts +865 -0
  39. package/src/cli/commands/setup.ts +254 -0
  40. package/src/cli/commands/status.ts +108 -0
  41. package/src/cli/commands/test.ts +91 -0
  42. package/src/cli/index.ts +103 -0
  43. package/src/core/api/client.ts +194 -0
  44. package/src/core/config/loader.ts +217 -0
  45. package/src/core/config/validator.ts +142 -0
  46. package/src/core/config/writer.ts +212 -0
  47. package/src/core/shell/detector.ts +92 -0
  48. package/src/core/shell/profile-updater.ts +131 -0
  49. package/src/core/tool-context.ts +23 -0
  50. package/src/core/tool-tracker.ts +204 -0
  51. package/src/index.ts +12 -0
  52. package/src/types/index.ts +110 -0
  53. package/src/types/tool-metering.ts +38 -0
  54. package/src/utils/constants.ts +80 -0
  55. package/src/utils/hashing.ts +35 -0
  56. package/src/utils/masking.ts +32 -0
  57. package/tests/integration/cli-commands.test.ts +158 -0
  58. package/tests/unit/backfill-command.test.ts +366 -0
  59. package/tests/unit/backfill-helpers.test.ts +397 -0
  60. package/tests/unit/backfill-parse.test.ts +276 -0
  61. package/tests/unit/backfill-stream.test.ts +147 -0
  62. package/tests/unit/backfill.test.ts +344 -0
  63. package/tests/unit/cli-index.test.ts +193 -0
  64. package/tests/unit/client.test.ts +195 -0
  65. package/tests/unit/detector.test.ts +247 -0
  66. package/tests/unit/hashing.test.ts +121 -0
  67. package/tests/unit/loader.test.ts +272 -0
  68. package/tests/unit/masking.test.ts +46 -0
  69. package/tests/unit/profile-updater.test.ts +146 -0
  70. package/tests/unit/setup.test.ts +557 -0
  71. package/tests/unit/status.test.ts +149 -0
  72. package/tests/unit/test.test.ts +165 -0
  73. package/tests/unit/validator.test.ts +211 -0
  74. package/tests/unit/writer.test.ts +176 -0
  75. package/tsconfig.json +20 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-tracker.js","sourceRoot":"","sources":["../../src/core/tool-tracker.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,4 +7,6 @@ export * from './core/config/writer.js';
7
7
  export * from './core/config/validator.js';
8
8
  export * from './core/api/client.js';
9
9
  export * from './core/shell/detector.js';
10
+ export * from './core/tool-context.js';
11
+ export * from './core/tool-tracker.js';
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
package/dist/index.js CHANGED
@@ -24,4 +24,6 @@ __exportStar(require("./core/config/writer.js"), exports);
24
24
  __exportStar(require("./core/config/validator.js"), exports);
25
25
  __exportStar(require("./core/api/client.js"), exports);
26
26
  __exportStar(require("./core/shell/detector.js"), exports);
27
+ __exportStar(require("./core/tool-context.js"), exports);
28
+ __exportStar(require("./core/tool-tracker.js"), exports);
27
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAqD;AACrD,mDAAiC;AACjC,uDAAqC;AACrC,qDAAmC;AACnC,qDAAmC;AACnC,0DAAwC;AACxC,0DAAwC;AACxC,6DAA2C;AAC3C,uDAAqC;AACrC,2DAAyC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAqD;AACrD,mDAAiC;AACjC,uDAAqC;AACrC,qDAAmC;AACnC,qDAAmC;AACnC,0DAAwC;AACxC,0DAAwC;AACxC,6DAA2C;AAC3C,uDAAqC;AACrC,2DAAyC;AACzC,yDAAuC;AACvC,yDAAuC"}
@@ -98,4 +98,5 @@ export interface OTLPResponse {
98
98
  processedEvents: number;
99
99
  created: string;
100
100
  }
101
+ export * from "./tool-metering.js";
101
102
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,yEAAyE;IACzE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,KAAK,CAAC;QAClB,QAAQ,CAAC,EAAE;YACT,UAAU,CAAC,EAAE,KAAK,CAAC;gBACjB,GAAG,EAAE,MAAM,CAAC;gBACZ,KAAK,EAAE,SAAS,CAAC;aAClB,CAAC,CAAC;SACJ,CAAC;QACF,SAAS,EAAE,KAAK,CAAC;YACf,KAAK,CAAC,EAAE;gBACN,IAAI,EAAE,MAAM,CAAC;gBACb,OAAO,EAAE,MAAM,CAAC;aACjB,CAAC;YACF,UAAU,EAAE,KAAK,CAAC;gBAChB,YAAY,CAAC,EAAE,MAAM,CAAC;gBACtB,IAAI,EAAE,SAAS,CAAC;gBAChB,UAAU,EAAE,KAAK,CAAC;oBAChB,GAAG,EAAE,MAAM,CAAC;oBACZ,KAAK,EAAE,SAAS,CAAC;iBAClB,CAAC,CAAC;aACJ,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,yEAAyE;IACzE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,KAAK,CAAC;QAClB,QAAQ,CAAC,EAAE;YACT,UAAU,CAAC,EAAE,KAAK,CAAC;gBACjB,GAAG,EAAE,MAAM,CAAC;gBACZ,KAAK,EAAE,SAAS,CAAC;aAClB,CAAC,CAAC;SACJ,CAAC;QACF,SAAS,EAAE,KAAK,CAAC;YACf,KAAK,CAAC,EAAE;gBACN,IAAI,EAAE,MAAM,CAAC;gBACb,OAAO,EAAE,MAAM,CAAC;aACjB,CAAC;YACF,UAAU,EAAE,KAAK,CAAC;gBAChB,YAAY,CAAC,EAAE,MAAM,CAAC;gBACtB,IAAI,EAAE,SAAS,CAAC;gBAChB,UAAU,EAAE,KAAK,CAAC;oBAChB,GAAG,EAAE,MAAM,CAAC;oBACZ,KAAK,EAAE,SAAS,CAAC;iBAClB,CAAC,CAAC;aACJ,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAc,oBAAoB,CAAC"}
@@ -1,3 +1,18 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./tool-metering.js"), exports);
3
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AA6GA,qDAAmC"}
@@ -0,0 +1,36 @@
1
+ export interface ToolContext {
2
+ sessionId?: string;
3
+ userId?: string;
4
+ organizationName?: string;
5
+ productName?: string;
6
+ apiKey?: string;
7
+ endpoint?: string;
8
+ }
9
+ export interface ToolMetadata {
10
+ description?: string;
11
+ category?: string;
12
+ version?: string;
13
+ tags?: string[];
14
+ outputFields?: string[];
15
+ usageMetadata?: Record<string, unknown>;
16
+ }
17
+ export interface ToolEventPayload {
18
+ toolId: string;
19
+ sessionId: string;
20
+ startTime: number;
21
+ endTime: number;
22
+ durationMs: number;
23
+ success: boolean;
24
+ errorMessage?: string;
25
+ metadata?: ToolMetadata;
26
+ userId?: string;
27
+ organizationName?: string;
28
+ productName?: string;
29
+ }
30
+ export interface ToolCallReport {
31
+ success: boolean;
32
+ durationMs: number;
33
+ errorMessage?: string;
34
+ metadata?: ToolMetadata;
35
+ }
36
+ //# sourceMappingURL=tool-metering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-metering.d.ts","sourceRoot":"","sources":["../../src/types/tool-metering.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=tool-metering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-metering.js","sourceRoot":"","sources":["../../src/types/tool-metering.ts"],"names":[],"mappings":""}
@@ -0,0 +1,171 @@
1
+ # Settings.json Telemetry Configuration: Research Findings
2
+
3
+ **Date**: January 16, 2026
4
+ **Status**: Investigation Complete - Approach Not Viable
5
+ **PR**: #7 (feat/settings-json-migration)
6
+
7
+ ## Executive Summary
8
+
9
+ We attempted to migrate the Revenium Claude Code Metering SDK from writing `~/.claude/revenium.env` (requires shell sourcing) to writing directly to `~/.claude/settings.json` (Claude Code's native config). The goal was to enable telemetry for **all Claude Code interfaces** (CLI, VS Code extension, JetBrains, etc.) with a single configuration.
10
+
11
+ **Finding**: The settings.json `env` section does not work for telemetry configuration because Claude Code's OTLP exporter initializes before the env vars are applied to its own process.
12
+
13
+ ## Background
14
+
15
+ ### The Problem We Were Solving
16
+
17
+ The current SDK approach requires:
18
+ 1. Writing env vars to `~/.claude/revenium.env`
19
+ 2. Adding `source ~/.claude/revenium.env` to shell profiles (`.zshrc`, `.bashrc`, etc.)
20
+ 3. Restarting terminals for changes to take effect
21
+
22
+ This approach has limitations:
23
+ - **VS Code Extension**: Launched from Dock/Spotlight doesn't inherit shell env vars
24
+ - **JetBrains IDEs**: Same issue - IDE-launched Claude Code doesn't see shell vars
25
+ - **Cross-platform**: Shell profile management differs across OS/shells
26
+ - **User friction**: Requires manual shell profile editing or restart
27
+
28
+ ### What We Thought Would Work
29
+
30
+ Claude Code documentation states that `~/.claude/settings.json` supports an `env` section:
31
+
32
+ ```json
33
+ {
34
+ "env": {
35
+ "CLAUDE_CODE_ENABLE_TELEMETRY": "1",
36
+ "OTEL_EXPORTER_OTLP_ENDPOINT": "https://api.example.com/meter/v2/otlp",
37
+ "OTEL_EXPORTER_OTLP_HEADERS": "x-api-key=hak_xxx"
38
+ }
39
+ }
40
+ ```
41
+
42
+ The documentation claims these env vars are "applied to every session" and "available to Claude Code and all Bash commands."
43
+
44
+ We implemented a migration (PR #7) that:
45
+ 1. Created `src/core/config/settings-json.ts` for JSONC read/write/backup
46
+ 2. Updated config loader to read from settings.json
47
+ 3. Updated setup wizard to write to settings.json instead of .env
48
+ 4. Removed shell profile update logic
49
+ 5. Added backup/restore functionality with comment preservation
50
+
51
+ ## What We Discovered
52
+
53
+ ### Test Methodology
54
+
55
+ 1. Disabled both `.env` files (Claude and Gemini SDKs)
56
+ 2. Removed shell profile sourcing
57
+ 3. Started fresh terminal sessions
58
+ 4. Verified settings.json had correct env section
59
+ 5. Started Claude Code and checked telemetry
60
+
61
+ ### Key Finding
62
+
63
+ **Environment variables from settings.json `env` section are only available to child processes (Bash commands executed inside Claude Code), NOT to Claude Code's own OTLP telemetry exporter.**
64
+
65
+ Evidence:
66
+
67
+ ```bash
68
+ # INSIDE Claude Code (! prefix runs shell command):
69
+ ! env | grep OTEL
70
+ # Shows all OTEL vars correctly ✓
71
+
72
+ # OUTSIDE Claude Code (after exiting):
73
+ env | grep OTEL
74
+ # Shows NOTHING - vars not in shell ✗
75
+ ```
76
+
77
+ ### Why This Happens
78
+
79
+ Claude Code's initialization sequence appears to be:
80
+
81
+ 1. Start process
82
+ 2. Initialize OTLP telemetry exporter (reads env vars from process environment)
83
+ 3. Read settings.json
84
+ 4. Apply settings.json `env` vars to internal environment (for child processes)
85
+ 5. Begin session
86
+
87
+ The telemetry exporter is initialized at step 2, but settings.json env vars aren't applied until step 4. By the time the vars are available, the exporter is already configured (with no OTLP endpoint).
88
+
89
+ ### Comparison: Working vs Non-Working Sessions
90
+
91
+ | Aspect | Working (shell .env) | Not Working (settings.json) |
92
+ |--------|---------------------|----------------------------|
93
+ | Vars in shell at startup | ✓ Yes | ✗ No |
94
+ | Vars available to OTLP exporter | ✓ Yes | ✗ No |
95
+ | Vars available to Bash commands | ✓ Yes | ✓ Yes |
96
+ | Telemetry sent | ✓ Yes | ✗ No |
97
+
98
+ ## Implications for the SDK
99
+
100
+ ### What This Means
101
+
102
+ 1. **settings.json `env` cannot replace shell sourcing** for telemetry configuration
103
+ 2. **IDE integrations remain problematic** - VS Code/JetBrains launched outside terminal won't have telemetry
104
+ 3. **The shell sourcing approach is still required** for CLI usage
105
+ 4. **No single-config solution exists** with current Claude Code architecture
106
+
107
+ ### Conflict Discovery
108
+
109
+ During testing, we also discovered that having multiple Revenium SDKs (Claude + Gemini) sourced in shell profiles can cause conflicts:
110
+
111
+ - Both set `OTEL_RESOURCE_ATTRIBUTES`
112
+ - Gemini's config overwrites Claude's `cost_multiplier` with different attributes
113
+ - This breaks telemetry for whichever SDK sources second
114
+
115
+ ## Proposed Next Steps
116
+
117
+ ### Option 1: Report to Anthropic (Recommended)
118
+
119
+ File a feature request/bug report asking Anthropic to:
120
+ 1. Read telemetry-related env vars from settings.json BEFORE initializing the OTLP exporter
121
+ 2. Or provide a dedicated telemetry configuration section in settings.json that's read at startup
122
+
123
+ This would enable the settings.json approach to work as documented.
124
+
125
+ ### Option 2: Hybrid Approach
126
+
127
+ Keep both mechanisms:
128
+ 1. Write to settings.json (for potential future compatibility)
129
+ 2. Continue writing .env and updating shell profiles (for current functionality)
130
+ 3. Detect IDE context and provide appropriate instructions
131
+
132
+ ### Option 3: Accept Limitations
133
+
134
+ Document the limitations clearly:
135
+ - CLI: Requires shell sourcing (works)
136
+ - VS Code/IDE: Requires launching from terminal with sourced env (workaround)
137
+ - Native IDE launch: Not supported until Anthropic fixes settings.json handling
138
+
139
+ ### Option 4: Investigate Managed Settings
140
+
141
+ Claude Code has a `managed-settings.json` for enterprise deployments. Investigate if this has different initialization timing that might work for telemetry.
142
+
143
+ ## Files Changed in PR #7
144
+
145
+ The migration implementation is complete and working for the settings.json write/read mechanics. The code changes are valid but the approach doesn't achieve the desired outcome due to Claude Code's initialization order.
146
+
147
+ | File | Purpose |
148
+ |------|---------|
149
+ | `src/core/config/settings-json.ts` | NEW - JSONC handling with backup |
150
+ | `src/core/config/writer.ts` | Generate env vars, write to settings.json |
151
+ | `src/core/config/loader.ts` | Read config from settings.json |
152
+ | `src/cli/commands/setup.ts` | New UX flow (automated vs manual) |
153
+ | `src/cli/commands/status.ts` | Updated messaging |
154
+ | `src/utils/constants.ts` | Added REVENIUM_MANAGED_ENV_VARS |
155
+ | `tests/unit/settings-json.test.ts` | NEW - Unit tests |
156
+
157
+ ## Recommendation
158
+
159
+ **Do not merge PR #7** until Anthropic addresses the settings.json env initialization timing. The current shell-sourcing approach, while less elegant, is the only reliable method for telemetry configuration.
160
+
161
+ Consider filing an issue with Anthropic referencing:
162
+ - The documented behavior of settings.json `env` section
163
+ - The actual behavior (vars not available to OTLP exporter at startup)
164
+ - The use case (third-party telemetry integration)
165
+
166
+ ## References
167
+
168
+ - [Claude Code Settings Documentation](https://docs.anthropic.com/en/docs/claude-code/settings)
169
+ - [GitHub Issue: env vars from settings.json not passed to MCPs](https://github.com/anthropics/claude-code/issues/11927) - Related issue
170
+ - PR #7: feat/settings-json-migration
171
+ - Migration Plan: `docs/plans/settings-json-migration-plan.md`
@@ -0,0 +1,114 @@
1
+ # Examples
2
+
3
+ This directory contains example usage patterns for @revenium/claude-code-metering.
4
+
5
+ ## Prerequisites
6
+
7
+ - Node.js 18+
8
+ - Revenium API key (obtain from [app.revenium.ai](https://app.revenium.ai))
9
+ - Claude Code CLI installed
10
+
11
+ ## Running Examples
12
+
13
+ All examples use the CLI commands. No TypeScript compilation needed.
14
+
15
+ ```bash
16
+ # Interactive setup
17
+ revenium-metering setup
18
+
19
+ # Check current status
20
+ revenium-metering status
21
+
22
+ # Send test metric
23
+ revenium-metering test --verbose
24
+ ```
25
+
26
+ ## Available Examples
27
+
28
+ | Example | Command | Description |
29
+ |---------|---------|-------------|
30
+ | Interactive Setup | `revenium-metering setup` | Full wizard with prompts |
31
+ | Non-Interactive | `revenium-metering setup --api-key hak_... --tier pro` | CI/CD friendly |
32
+ | Status Check | `revenium-metering status` | View configuration |
33
+ | Test Metric | `revenium-metering test --verbose` | Verify integration |
34
+
35
+ ## Setup Scenarios
36
+
37
+ ### Personal Developer Setup (Pro Tier)
38
+
39
+ ```bash
40
+ revenium-metering setup \
41
+ --api-key hak_your_api_key \
42
+ --email developer@company.com \
43
+ --tier pro
44
+ ```
45
+
46
+ ### Team Setup (Team Premium)
47
+
48
+ ```bash
49
+ revenium-metering setup \
50
+ --api-key hak_team_key \
51
+ --email team@company.com \
52
+ --tier team_premium
53
+ ```
54
+
55
+ ### Enterprise Setup
56
+
57
+ ```bash
58
+ revenium-metering setup \
59
+ --api-key hak_enterprise_key \
60
+ --email admin@enterprise.com \
61
+ --tier enterprise
62
+ ```
63
+
64
+ ### Development/Testing (Local Endpoint)
65
+
66
+ ```bash
67
+ revenium-metering setup \
68
+ --api-key hak_dev_key \
69
+ --endpoint http://localhost:8082 \
70
+ --tier api
71
+ ```
72
+
73
+ ## Verification Steps
74
+
75
+ After running setup:
76
+
77
+ 1. **Check configuration exists:**
78
+ ```bash
79
+ cat ~/.claude/revenium.env
80
+ ```
81
+
82
+ 2. **Verify environment is loaded:**
83
+ ```bash
84
+ source ~/.claude/revenium.env
85
+ echo $OTEL_METRICS_EXPORTER # Should output: otlp
86
+ ```
87
+
88
+ 3. **Run status check:**
89
+ ```bash
90
+ revenium-metering status
91
+ ```
92
+
93
+ 4. **Send test metric:**
94
+ ```bash
95
+ revenium-metering test --verbose
96
+ ```
97
+
98
+ ## Custom Cost Multiplier
99
+
100
+ After running setup, you can override the cost multiplier:
101
+
102
+ ```bash
103
+ # Edit ~/.claude/revenium.env
104
+ export OTEL_RESOURCE_ATTRIBUTES="cost_multiplier=0.12"
105
+ ```
106
+
107
+ Then reload:
108
+ ```bash
109
+ source ~/.claude/revenium.env
110
+ ```
111
+
112
+ ## Troubleshooting
113
+
114
+ If examples fail, see the main [README.md](../README.md#troubleshooting) for common issues.
@@ -0,0 +1,212 @@
1
+ #!/bin/bash
2
+ # validate-installation.sh
3
+ # Comprehensive validation script for @revenium/claude-code-metering
4
+ #
5
+ # Usage: ./validate-installation.sh [--api-key KEY] [--endpoint URL]
6
+ #
7
+ # This script validates:
8
+ # 1. CLI is installed and accessible
9
+ # 2. Setup command works (creates config)
10
+ # 3. Status command shows correct configuration
11
+ # 4. Test command successfully sends metrics to Revenium
12
+ # 5. Generated config has correct OTEL settings
13
+
14
+ set -e
15
+
16
+ # Colors for output
17
+ RED='\033[0;31m'
18
+ GREEN='\033[0;32m'
19
+ YELLOW='\033[1;33m'
20
+ BLUE='\033[0;34m'
21
+ NC='\033[0m' # No Color
22
+
23
+ # Default values
24
+ API_KEY="${REVENIUM_API_KEY:-}"
25
+ ENDPOINT="${REVENIUM_ENDPOINT:-https://api.revenium.ai}"
26
+ TIER="pro"
27
+ EMAIL="validation@test.com"
28
+
29
+ # Parse arguments
30
+ while [[ $# -gt 0 ]]; do
31
+ case $1 in
32
+ --api-key)
33
+ API_KEY="$2"
34
+ shift 2
35
+ ;;
36
+ --endpoint)
37
+ ENDPOINT="$2"
38
+ shift 2
39
+ ;;
40
+ --tier)
41
+ TIER="$2"
42
+ shift 2
43
+ ;;
44
+ *)
45
+ echo "Unknown option: $1"
46
+ exit 1
47
+ ;;
48
+ esac
49
+ done
50
+
51
+ echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
52
+ echo -e "${BLUE}║ @revenium/claude-code-metering - Validation Suite ║${NC}"
53
+ echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
54
+ echo ""
55
+
56
+ PASS_COUNT=0
57
+ FAIL_COUNT=0
58
+
59
+ pass() {
60
+ echo -e "${GREEN}✓ PASS:${NC} $1"
61
+ ((PASS_COUNT++))
62
+ }
63
+
64
+ fail() {
65
+ echo -e "${RED}✗ FAIL:${NC} $1"
66
+ ((FAIL_COUNT++))
67
+ }
68
+
69
+ warn() {
70
+ echo -e "${YELLOW}⚠ WARN:${NC} $1"
71
+ }
72
+
73
+ # ═══════════════════════════════════════════════════════════════
74
+ # CHECK 1: CLI Installation
75
+ # ═══════════════════════════════════════════════════════════════
76
+ echo -e "\n${BLUE}[1/5] Checking CLI installation...${NC}"
77
+
78
+ if command -v revenium-metering &> /dev/null; then
79
+ VERSION=$(revenium-metering --version 2>/dev/null || echo "unknown")
80
+ pass "CLI installed (version: $VERSION)"
81
+ else
82
+ fail "CLI not found. Install with: npm install -g @revenium/claude-code-metering"
83
+ echo "Aborting validation - CLI required for remaining tests"
84
+ exit 1
85
+ fi
86
+
87
+ # ═══════════════════════════════════════════════════════════════
88
+ # CHECK 2: Help Commands
89
+ # ═══════════════════════════════════════════════════════════════
90
+ echo -e "\n${BLUE}[2/5] Checking help commands...${NC}"
91
+
92
+ if revenium-metering --help &> /dev/null; then
93
+ pass "Main help command works"
94
+ else
95
+ fail "Main help command failed"
96
+ fi
97
+
98
+ if revenium-metering setup --help &> /dev/null; then
99
+ pass "Setup help command works"
100
+ else
101
+ fail "Setup help command failed"
102
+ fi
103
+
104
+ # ═══════════════════════════════════════════════════════════════
105
+ # CHECK 3: Setup Command (requires API key)
106
+ # ═══════════════════════════════════════════════════════════════
107
+ echo -e "\n${BLUE}[3/5] Checking setup command...${NC}"
108
+
109
+ if [ -z "$API_KEY" ]; then
110
+ warn "No API key provided. Skipping setup test."
111
+ warn "Run with: ./validate-installation.sh --api-key hak_your_key"
112
+ else
113
+ # Backup existing config if present
114
+ CONFIG_FILE="$HOME/.claude/revenium.env"
115
+ BACKUP_FILE="$HOME/.claude/revenium.env.backup.$$"
116
+
117
+ if [ -f "$CONFIG_FILE" ]; then
118
+ cp "$CONFIG_FILE" "$BACKUP_FILE"
119
+ echo "Backed up existing config to $BACKUP_FILE"
120
+ fi
121
+
122
+ # Run setup in non-interactive mode
123
+ if revenium-metering setup \
124
+ --api-key "$API_KEY" \
125
+ --email "$EMAIL" \
126
+ --tier "$TIER" \
127
+ --endpoint "$ENDPOINT" \
128
+ --skip-shell-update &> /dev/null; then
129
+ pass "Setup command completed"
130
+
131
+ # Verify config file created
132
+ if [ -f "$CONFIG_FILE" ]; then
133
+ pass "Config file created at $CONFIG_FILE"
134
+
135
+ # Check OTEL settings (CRITICAL)
136
+ if grep -q "OTEL_METRICS_EXPORTER=otlp" "$CONFIG_FILE"; then
137
+ pass "OTEL_METRICS_EXPORTER correctly set to 'otlp'"
138
+ else
139
+ fail "OTEL_METRICS_EXPORTER not set correctly"
140
+ fi
141
+
142
+ if grep -q "OTEL_EXPORTER_OTLP_ENDPOINT" "$CONFIG_FILE"; then
143
+ pass "OTEL_EXPORTER_OTLP_ENDPOINT configured"
144
+ else
145
+ fail "OTEL_EXPORTER_OTLP_ENDPOINT missing"
146
+ fi
147
+
148
+ # Check for legacy OTEL_LOGS_EXPORTER (should NOT be present)
149
+ if grep -q "OTEL_LOGS_EXPORTER" "$CONFIG_FILE"; then
150
+ fail "Config contains legacy OTEL_LOGS_EXPORTER (should be OTEL_METRICS_EXPORTER)"
151
+ else
152
+ pass "No legacy OTEL_LOGS_EXPORTER present"
153
+ fi
154
+
155
+ else
156
+ fail "Config file not created"
157
+ fi
158
+ else
159
+ fail "Setup command failed"
160
+ fi
161
+
162
+ # Restore backup if it existed
163
+ if [ -f "$BACKUP_FILE" ]; then
164
+ mv "$BACKUP_FILE" "$CONFIG_FILE"
165
+ echo "Restored original config"
166
+ fi
167
+ fi
168
+
169
+ # ═══════════════════════════════════════════════════════════════
170
+ # CHECK 4: Status Command
171
+ # ═══════════════════════════════════════════════════════════════
172
+ echo -e "\n${BLUE}[4/5] Checking status command...${NC}"
173
+
174
+ if revenium-metering status &> /dev/null; then
175
+ pass "Status command works"
176
+ else
177
+ warn "Status command returned non-zero (may be expected if not configured)"
178
+ fi
179
+
180
+ # ═══════════════════════════════════════════════════════════════
181
+ # CHECK 5: Test Command (requires API key)
182
+ # ═══════════════════════════════════════════════════════════════
183
+ echo -e "\n${BLUE}[5/5] Checking test command...${NC}"
184
+
185
+ if [ -z "$API_KEY" ]; then
186
+ warn "No API key provided. Skipping test command."
187
+ else
188
+ if revenium-metering test --verbose --endpoint "$ENDPOINT" 2>&1 | grep -q "success\|200"; then
189
+ pass "Test command sent metrics successfully"
190
+ else
191
+ warn "Test command completed but success unclear - check manually"
192
+ fi
193
+ fi
194
+
195
+ # ═══════════════════════════════════════════════════════════════
196
+ # SUMMARY
197
+ # ═══════════════════════════════════════════════════════════════
198
+ echo -e "\n${BLUE}═══════════════════════════════════════════════════════════════${NC}"
199
+ echo -e "${BLUE}VALIDATION SUMMARY${NC}"
200
+ echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}"
201
+ echo ""
202
+ echo -e "Passed: ${GREEN}$PASS_COUNT${NC}"
203
+ echo -e "Failed: ${RED}$FAIL_COUNT${NC}"
204
+ echo ""
205
+
206
+ if [ $FAIL_COUNT -eq 0 ]; then
207
+ echo -e "${GREEN}All validations passed!${NC}"
208
+ exit 0
209
+ else
210
+ echo -e "${RED}Some validations failed. Review output above.${NC}"
211
+ exit 1
212
+ fi
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revenium/claude-code-metering",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "CLI tool to configure Claude Code telemetry export to Revenium",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -35,20 +35,14 @@
35
35
  "url": "https://github.com/revenium/revenium-claude-code-sdk/issues"
36
36
  },
37
37
  "homepage": "https://github.com/revenium/revenium-claude-code-sdk#readme",
38
- "files": [
39
- "dist",
40
- "README.md",
41
- "LICENSE",
42
- "CHANGELOG.md"
43
- ],
44
38
  "engines": {
45
39
  "node": ">=20.0.0"
46
40
  },
47
41
  "dependencies": {
48
- "chalk": "^5.3.0",
42
+ "chalk": "^4.1.2",
49
43
  "commander": "^12.1.0",
50
- "inquirer": "^9.3.7",
51
- "ora": "^8.1.1"
44
+ "inquirer": "^8.2.6",
45
+ "ora": "^5.4.1"
52
46
  },
53
47
  "devDependencies": {
54
48
  "@types/inquirer": "^9.0.7",
@@ -0,0 +1,7 @@
1
+ src/
2
+ docs/
3
+ package.json
4
+ tsconfig.json
5
+ .gitignore
6
+ README.md
7
+ public-allowlist-node.txt