@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.
- package/.env.example +15 -0
- package/.eslintrc.js +24 -0
- package/.github/workflows/branch-bypass-alert.yml +68 -0
- package/CODE_OF_CONDUCT.md +57 -0
- package/CONTRIBUTING.md +73 -0
- package/README.md +57 -3
- package/SECURITY.md +46 -0
- package/dist/cli/commands/setup.js +3 -1
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/core/api/client.d.ts.map +1 -1
- package/dist/core/api/client.js +4 -1
- package/dist/core/api/client.js.map +1 -1
- package/dist/core/tool-context.d.ts +6 -0
- package/dist/core/tool-context.d.ts.map +1 -0
- package/dist/core/tool-context.js +21 -0
- package/dist/core/tool-context.js.map +1 -0
- package/dist/core/tool-tracker.d.ts +4 -0
- package/dist/core/tool-tracker.d.ts.map +1 -0
- package/dist/core/tool-tracker.js +156 -0
- package/dist/core/tool-tracker.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/tool-metering.d.ts +36 -0
- package/dist/types/tool-metering.d.ts.map +1 -0
- package/dist/types/tool-metering.js +3 -0
- package/dist/types/tool-metering.js.map +1 -0
- package/docs/research/settings-json-telemetry-findings.md +171 -0
- package/examples/README.md +114 -0
- package/examples/validation/validate-installation.sh +212 -0
- package/package.json +4 -10
- package/public-allowlist-node.txt +7 -0
- package/src/cli/commands/backfill.ts +865 -0
- package/src/cli/commands/setup.ts +254 -0
- package/src/cli/commands/status.ts +108 -0
- package/src/cli/commands/test.ts +91 -0
- package/src/cli/index.ts +103 -0
- package/src/core/api/client.ts +194 -0
- package/src/core/config/loader.ts +217 -0
- package/src/core/config/validator.ts +142 -0
- package/src/core/config/writer.ts +212 -0
- package/src/core/shell/detector.ts +92 -0
- package/src/core/shell/profile-updater.ts +131 -0
- package/src/core/tool-context.ts +23 -0
- package/src/core/tool-tracker.ts +204 -0
- package/src/index.ts +12 -0
- package/src/types/index.ts +110 -0
- package/src/types/tool-metering.ts +38 -0
- package/src/utils/constants.ts +80 -0
- package/src/utils/hashing.ts +35 -0
- package/src/utils/masking.ts +32 -0
- package/tests/integration/cli-commands.test.ts +158 -0
- package/tests/unit/backfill-command.test.ts +366 -0
- package/tests/unit/backfill-helpers.test.ts +397 -0
- package/tests/unit/backfill-parse.test.ts +276 -0
- package/tests/unit/backfill-stream.test.ts +147 -0
- package/tests/unit/backfill.test.ts +344 -0
- package/tests/unit/cli-index.test.ts +193 -0
- package/tests/unit/client.test.ts +195 -0
- package/tests/unit/detector.test.ts +247 -0
- package/tests/unit/hashing.test.ts +121 -0
- package/tests/unit/loader.test.ts +272 -0
- package/tests/unit/masking.test.ts +46 -0
- package/tests/unit/profile-updater.test.ts +146 -0
- package/tests/unit/setup.test.ts +557 -0
- package/tests/unit/status.test.ts +149 -0
- package/tests/unit/test.test.ts +165 -0
- package/tests/unit/validator.test.ts +211 -0
- package/tests/unit/writer.test.ts +176 -0
- 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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/types/index.js
CHANGED
|
@@ -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
|
package/dist/types/index.js.map
CHANGED
|
@@ -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 @@
|
|
|
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.
|
|
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": "^
|
|
42
|
+
"chalk": "^4.1.2",
|
|
49
43
|
"commander": "^12.1.0",
|
|
50
|
-
"inquirer": "^
|
|
51
|
-
"ora": "^
|
|
44
|
+
"inquirer": "^8.2.6",
|
|
45
|
+
"ora": "^5.4.1"
|
|
52
46
|
},
|
|
53
47
|
"devDependencies": {
|
|
54
48
|
"@types/inquirer": "^9.0.7",
|