claude-scope 0.1.3 → 0.1.4
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/dist/core/renderer.d.ts +33 -3
- package/dist/core/renderer.d.ts.map +1 -1
- package/dist/core/renderer.js +48 -7
- package/dist/core/renderer.js.map +1 -1
- package/dist/data/stdin-provider.d.ts +44 -0
- package/dist/data/stdin-provider.d.ts.map +1 -0
- package/dist/data/stdin-provider.js +83 -0
- package/dist/data/stdin-provider.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +56 -64
- package/dist/index.js.map +1 -1
- package/dist/providers/git-provider.d.ts +53 -46
- package/dist/providers/git-provider.d.ts.map +1 -1
- package/dist/providers/git-provider.js +53 -107
- package/dist/providers/git-provider.js.map +1 -1
- package/dist/providers/stdin-provider.d.ts +16 -15
- package/dist/providers/stdin-provider.d.ts.map +1 -1
- package/dist/providers/stdin-provider.js +35 -66
- package/dist/providers/stdin-provider.js.map +1 -1
- package/dist/schemas/stdin-schema.d.ts +123 -0
- package/dist/schemas/stdin-schema.d.ts.map +1 -0
- package/dist/schemas/stdin-schema.js +81 -0
- package/dist/schemas/stdin-schema.js.map +1 -0
- package/dist/types.d.ts +6 -63
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/dist/ui/utils/colors.d.ts +52 -0
- package/dist/ui/utils/colors.d.ts.map +1 -0
- package/dist/ui/utils/colors.js +54 -0
- package/dist/ui/utils/colors.js.map +1 -0
- package/dist/ui/utils/formatters.d.ts +56 -0
- package/dist/ui/utils/formatters.d.ts.map +1 -0
- package/dist/ui/utils/formatters.js +114 -0
- package/dist/ui/utils/formatters.js.map +1 -0
- package/dist/widgets/context-widget.d.ts +3 -3
- package/dist/widgets/context-widget.d.ts.map +1 -1
- package/dist/widgets/context-widget.js +9 -5
- package/dist/widgets/context-widget.js.map +1 -1
- package/dist/widgets/core/stdin-data-widget.d.ts +93 -0
- package/dist/widgets/core/stdin-data-widget.d.ts.map +1 -0
- package/dist/widgets/core/stdin-data-widget.js +84 -0
- package/dist/widgets/core/stdin-data-widget.js.map +1 -0
- package/dist/widgets/cost-widget.d.ts +4 -4
- package/dist/widgets/cost-widget.d.ts.map +1 -1
- package/dist/widgets/cost-widget.js +6 -5
- package/dist/widgets/cost-widget.js.map +1 -1
- package/dist/widgets/duration-widget.d.ts +3 -3
- package/dist/widgets/duration-widget.d.ts.map +1 -1
- package/dist/widgets/duration-widget.js +5 -4
- package/dist/widgets/duration-widget.js.map +1 -1
- package/dist/widgets/git/git-changes-widget.d.ts +38 -0
- package/dist/widgets/git/git-changes-widget.d.ts.map +1 -0
- package/dist/widgets/git/git-changes-widget.js +91 -0
- package/dist/widgets/git/git-changes-widget.js.map +1 -0
- package/dist/widgets/git/git-widget.d.ts +37 -0
- package/dist/widgets/git/git-widget.d.ts.map +1 -0
- package/dist/widgets/git/git-widget.js +67 -0
- package/dist/widgets/git/git-widget.js.map +1 -0
- package/dist/widgets/model-widget.d.ts +3 -3
- package/dist/widgets/model-widget.d.ts.map +1 -1
- package/dist/widgets/model-widget.js +2 -3
- package/dist/widgets/model-widget.js.map +1 -1
- package/package.json +8 -6
|
@@ -1,127 +1,73 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Git
|
|
3
|
-
*
|
|
2
|
+
* Git provider interface and implementation
|
|
3
|
+
*
|
|
4
|
+
* Uses native Node.js child_process to execute git commands,
|
|
5
|
+
* avoiding external dependencies like simple-git.
|
|
4
6
|
*/
|
|
5
|
-
import {
|
|
7
|
+
import { execFile } from 'node:child_process';
|
|
8
|
+
import { promisify } from 'node:util';
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
6
10
|
/**
|
|
7
|
-
*
|
|
11
|
+
* Native git implementation using child_process
|
|
12
|
+
*
|
|
13
|
+
* Executes real git commands on the system.
|
|
14
|
+
* Requires git to be installed and available in PATH.
|
|
8
15
|
*/
|
|
9
|
-
export class
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
constructor(deps) {
|
|
14
|
-
this.git = deps.git;
|
|
15
|
-
this.repoPath = '';
|
|
16
|
+
export class NativeGit {
|
|
17
|
+
cwd;
|
|
18
|
+
constructor(cwd) {
|
|
19
|
+
this.cwd = cwd;
|
|
16
20
|
}
|
|
17
|
-
|
|
18
|
-
* Initialize provider with repository path
|
|
19
|
-
*/
|
|
20
|
-
async init(path) {
|
|
21
|
-
this.repoPath = path;
|
|
22
|
-
this._isRepo = await this.git.checkIsRepo();
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Get current branch name
|
|
26
|
-
* @returns Branch name or null if not in repo
|
|
27
|
-
*/
|
|
28
|
-
async getBranch() {
|
|
29
|
-
if (!this._isRepo) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
const result = await this.git.branch();
|
|
33
|
-
return result.current;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Get git diff statistics
|
|
37
|
-
* @returns Changes with insertions and deletions, or null if not a repo
|
|
38
|
-
*/
|
|
39
|
-
async getChanges() {
|
|
40
|
-
if (!this._isRepo) {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
const stats = await this.git.diffStats();
|
|
44
|
-
if (!stats) {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
insertions: stats.insertions,
|
|
49
|
-
deletions: stats.deletions
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Check if current path is a git repository
|
|
54
|
-
*/
|
|
55
|
-
isRepo() {
|
|
56
|
-
return this._isRepo;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Get complete git info
|
|
60
|
-
*/
|
|
61
|
-
async getInfo() {
|
|
62
|
-
return {
|
|
63
|
-
branch: await this.getBranch(),
|
|
64
|
-
isRepo: this.isRepo()
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Adapter to wrap simple-git with our IGit interface
|
|
70
|
-
*/
|
|
71
|
-
class SimpleGitAdapter {
|
|
72
|
-
git;
|
|
73
|
-
constructor(git) {
|
|
74
|
-
this.git = git;
|
|
75
|
-
}
|
|
76
|
-
async checkIsRepo() {
|
|
21
|
+
async status() {
|
|
77
22
|
try {
|
|
78
|
-
await
|
|
79
|
-
|
|
23
|
+
const { stdout } = await execFileAsync('git', ['status', '--branch', '--short'], {
|
|
24
|
+
cwd: this.cwd,
|
|
25
|
+
});
|
|
26
|
+
// Parse output like: "## main" or "## feature-branch"
|
|
27
|
+
const match = stdout.match(/^##\s+(\S+)/m);
|
|
28
|
+
const current = match ? match[1] : null;
|
|
29
|
+
return { current };
|
|
80
30
|
}
|
|
81
31
|
catch {
|
|
82
|
-
|
|
32
|
+
// Not in a git repo or git not available
|
|
33
|
+
return { current: null };
|
|
83
34
|
}
|
|
84
35
|
}
|
|
85
|
-
async
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
async diffStats() {
|
|
36
|
+
async diffSummary(options) {
|
|
37
|
+
const args = ['diff', '--shortstat'];
|
|
38
|
+
if (options) {
|
|
39
|
+
args.push(...options);
|
|
40
|
+
}
|
|
93
41
|
try {
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
return { insertions, deletions };
|
|
42
|
+
const { stdout } = await execFileAsync('git', args, {
|
|
43
|
+
cwd: this.cwd,
|
|
44
|
+
});
|
|
45
|
+
// Parse output like: " 5 file(s) changed, 12 insertions(+), 3 deletions(-)"
|
|
46
|
+
// or: " 2 insertions(+), 1 deletion(-)"
|
|
47
|
+
const insertionMatch = stdout.match(/(\d+)\s+insertion/);
|
|
48
|
+
const deletionMatch = stdout.match(/(\d+)\s+deletion/);
|
|
49
|
+
const insertions = insertionMatch ? parseInt(insertionMatch[1], 10) : 0;
|
|
50
|
+
const deletions = deletionMatch ? parseInt(deletionMatch[1], 10) : 0;
|
|
51
|
+
// Return a single "file" entry representing total changes
|
|
52
|
+
// This matches the simple-git behavior we had before
|
|
53
|
+
const files = insertions > 0 || deletions > 0
|
|
54
|
+
? [{ file: '(total)', insertions, deletions }]
|
|
55
|
+
: [];
|
|
56
|
+
return { files };
|
|
112
57
|
}
|
|
113
58
|
catch {
|
|
114
|
-
|
|
59
|
+
// Not in a git repo or git not available
|
|
60
|
+
return { files: [] };
|
|
115
61
|
}
|
|
116
62
|
}
|
|
117
63
|
}
|
|
118
64
|
/**
|
|
119
|
-
* Factory
|
|
120
|
-
*
|
|
121
|
-
* @
|
|
65
|
+
* Factory function to create NativeGit instance
|
|
66
|
+
*
|
|
67
|
+
* @param cwd - Working directory for git operations
|
|
68
|
+
* @returns IGit instance
|
|
122
69
|
*/
|
|
123
|
-
export function
|
|
124
|
-
|
|
125
|
-
return new SimpleGitAdapter(git);
|
|
70
|
+
export function createGit(cwd) {
|
|
71
|
+
return new NativeGit(cwd);
|
|
126
72
|
}
|
|
127
73
|
//# sourceMappingURL=git-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-provider.js","sourceRoot":"","sources":["../../src/providers/git-provider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"git-provider.js","sourceRoot":"","sources":["../../src/providers/git-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAoD1C;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACZ,GAAG,CAAS;IAEpB,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE;gBAC/E,GAAG,EAAE,IAAI,CAAC,GAAG;aACd,CAAC,CAAC;YAEH,sDAAsD;YACtD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAExC,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;YACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAkB;QAClC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACrC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE;gBAClD,GAAG,EAAE,IAAI,CAAC,GAAG;aACd,CAAC,CAAC;YAEH,4EAA4E;YAC5E,wCAAwC;YACxC,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACzD,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAEvD,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAErE,0DAA0D;YAC1D,qDAAqD;YACrD,MAAM,KAAK,GACT,UAAU,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC;gBAC7B,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;gBAC9C,CAAC,CAAC,EAAE,CAAC;YAET,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;YACzC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Stdin provider for parsing JSON data from stdin
|
|
3
|
-
* Parses and validates Claude Code session data
|
|
3
|
+
* Parses and validates Claude Code session data using Zod
|
|
4
4
|
*/
|
|
5
5
|
import type { StdinData } from '../types.js';
|
|
6
6
|
/**
|
|
@@ -16,28 +16,29 @@ export declare class StdinValidationError extends Error {
|
|
|
16
16
|
constructor(message: string);
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* Stdin provider for parsing JSON data
|
|
19
|
+
* Stdin provider for parsing and validating JSON data
|
|
20
20
|
*/
|
|
21
21
|
export declare class StdinProvider {
|
|
22
22
|
/**
|
|
23
|
-
* Parse JSON string from stdin
|
|
23
|
+
* Parse and validate JSON string from stdin
|
|
24
24
|
* @param input JSON string to parse
|
|
25
|
-
* @returns
|
|
25
|
+
* @returns Validated StdinData object
|
|
26
26
|
* @throws StdinParseError if JSON is malformed
|
|
27
|
-
* @throws StdinValidationError if data
|
|
27
|
+
* @throws StdinValidationError if data doesn't match schema
|
|
28
28
|
*/
|
|
29
29
|
parse(input: string): Promise<StdinData>;
|
|
30
30
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* @
|
|
34
|
-
|
|
35
|
-
validate(data: unknown): data is StdinData;
|
|
36
|
-
/**
|
|
37
|
-
* Validate stdin data and return detailed error message
|
|
38
|
-
* @param data Data to validate
|
|
39
|
-
* @returns Error message if invalid, null if valid
|
|
31
|
+
* Safe parse that returns result instead of throwing
|
|
32
|
+
* Useful for testing and optional validation
|
|
33
|
+
* @param input JSON string to parse
|
|
34
|
+
* @returns Result object with success flag
|
|
40
35
|
*/
|
|
41
|
-
|
|
36
|
+
safeParse(input: string): Promise<{
|
|
37
|
+
success: true;
|
|
38
|
+
data: StdinData;
|
|
39
|
+
} | {
|
|
40
|
+
success: false;
|
|
41
|
+
error: string;
|
|
42
|
+
}>;
|
|
42
43
|
}
|
|
43
44
|
//# sourceMappingURL=stdin-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdin-provider.d.ts","sourceRoot":"","sources":["../../src/providers/stdin-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"stdin-provider.d.ts","sourceRoot":"","sources":["../../src/providers/stdin-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB;;;;;;OAMG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAmC9C;;;;;OAKG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAQhH"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Stdin provider for parsing JSON data from stdin
|
|
3
|
-
* Parses and validates Claude Code session data
|
|
3
|
+
* Parses and validates Claude Code session data using Zod
|
|
4
4
|
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { StdinDataSchema } from '../schemas/stdin-schema.js';
|
|
5
7
|
/**
|
|
6
8
|
* Error thrown when stdin parsing fails
|
|
7
9
|
*/
|
|
@@ -21,15 +23,15 @@ export class StdinValidationError extends Error {
|
|
|
21
23
|
}
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
24
|
-
* Stdin provider for parsing JSON data
|
|
26
|
+
* Stdin provider for parsing and validating JSON data
|
|
25
27
|
*/
|
|
26
28
|
export class StdinProvider {
|
|
27
29
|
/**
|
|
28
|
-
* Parse JSON string from stdin
|
|
30
|
+
* Parse and validate JSON string from stdin
|
|
29
31
|
* @param input JSON string to parse
|
|
30
|
-
* @returns
|
|
32
|
+
* @returns Validated StdinData object
|
|
31
33
|
* @throws StdinParseError if JSON is malformed
|
|
32
|
-
* @throws StdinValidationError if data
|
|
34
|
+
* @throws StdinValidationError if data doesn't match schema
|
|
33
35
|
*/
|
|
34
36
|
async parse(input) {
|
|
35
37
|
// Check for empty input
|
|
@@ -41,74 +43,41 @@ export class StdinProvider {
|
|
|
41
43
|
try {
|
|
42
44
|
data = JSON.parse(input);
|
|
43
45
|
}
|
|
44
|
-
catch {
|
|
45
|
-
throw new StdinParseError(
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw new StdinParseError(`Invalid JSON: ${error.message}`);
|
|
46
48
|
}
|
|
47
|
-
// Validate
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
const obj = data;
|
|
65
|
-
// Check required top-level fields
|
|
66
|
-
if (typeof obj.session_id !== 'string') {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
if (typeof obj.cwd !== 'string') {
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
// Check model object
|
|
73
|
-
if (typeof obj.model !== 'object' || obj.model === null) {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
const model = obj.model;
|
|
77
|
-
if (typeof model.id !== 'string') {
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
if (typeof model.display_name !== 'string') {
|
|
81
|
-
return false;
|
|
49
|
+
// Validate with Zod
|
|
50
|
+
try {
|
|
51
|
+
return StdinDataSchema.parse(data);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error instanceof z.ZodError) {
|
|
55
|
+
// Format error messages nicely
|
|
56
|
+
const errorDetails = error.issues
|
|
57
|
+
.map((e) => {
|
|
58
|
+
const path = e.path.length > 0 ? e.path.join('.') : 'root';
|
|
59
|
+
return `${path}: ${e.message}`;
|
|
60
|
+
})
|
|
61
|
+
.join(', ');
|
|
62
|
+
throw new StdinValidationError(`Validation failed: ${errorDetails}`);
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
82
65
|
}
|
|
83
|
-
return true;
|
|
84
66
|
}
|
|
85
67
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* @
|
|
68
|
+
* Safe parse that returns result instead of throwing
|
|
69
|
+
* Useful for testing and optional validation
|
|
70
|
+
* @param input JSON string to parse
|
|
71
|
+
* @returns Result object with success flag
|
|
89
72
|
*/
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const obj = data;
|
|
95
|
-
if (typeof obj.session_id !== 'string') {
|
|
96
|
-
return 'missing session_id';
|
|
97
|
-
}
|
|
98
|
-
if (typeof obj.cwd !== 'string') {
|
|
99
|
-
return 'missing cwd';
|
|
100
|
-
}
|
|
101
|
-
if (typeof obj.model !== 'object' || obj.model === null) {
|
|
102
|
-
return 'missing model';
|
|
103
|
-
}
|
|
104
|
-
const model = obj.model;
|
|
105
|
-
if (typeof model.id !== 'string') {
|
|
106
|
-
return 'missing model.id';
|
|
73
|
+
async safeParse(input) {
|
|
74
|
+
try {
|
|
75
|
+
const data = await this.parse(input);
|
|
76
|
+
return { success: true, data };
|
|
107
77
|
}
|
|
108
|
-
|
|
109
|
-
return
|
|
78
|
+
catch (error) {
|
|
79
|
+
return { success: false, error: error.message };
|
|
110
80
|
}
|
|
111
|
-
return null;
|
|
112
81
|
}
|
|
113
82
|
}
|
|
114
83
|
//# sourceMappingURL=stdin-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdin-provider.js","sourceRoot":"","sources":["../../src/providers/stdin-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"stdin-provider.js","sourceRoot":"","sources":["../../src/providers/stdin-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IACxB;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,KAAa;QACvB,wBAAwB;QACxB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC;QAED,aAAa;QACb,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,eAAe,CAAC,iBAAkB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC;YACH,OAAO,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAChC,+BAA+B;gBAC/B,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM;qBAC9B,GAAG,CAAC,CAAC,CAAa,EAAE,EAAE;oBACrB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC3D,OAAO,GAAG,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;gBACjC,CAAC,CAAC;qBACD,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEd,MAAM,IAAI,oBAAoB,CAC5B,sBAAsB,YAAY,EAAE,CACrC,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime type-safe schema for Claude Code stdin data
|
|
3
|
+
*
|
|
4
|
+
* This schema validates incoming JSON from Claude Code statusline API
|
|
5
|
+
* and provides TypeScript types automatically via inference.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
/**
|
|
9
|
+
* Context usage schema
|
|
10
|
+
* Details about current token usage in the context window
|
|
11
|
+
*/
|
|
12
|
+
export declare const ContextUsageSchema: z.ZodObject<{
|
|
13
|
+
input_tokens: z.ZodNumber;
|
|
14
|
+
output_tokens: z.ZodNumber;
|
|
15
|
+
cache_creation_input_tokens: z.ZodNumber;
|
|
16
|
+
cache_read_input_tokens: z.ZodNumber;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
/**
|
|
19
|
+
* Cost info schema
|
|
20
|
+
* Details about session cost and duration
|
|
21
|
+
*/
|
|
22
|
+
export declare const CostInfoSchema: z.ZodObject<{
|
|
23
|
+
total_cost_usd: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
total_duration_ms: z.ZodOptional<z.ZodNumber>;
|
|
25
|
+
total_api_duration_ms: z.ZodOptional<z.ZodNumber>;
|
|
26
|
+
total_lines_added: z.ZodOptional<z.ZodNumber>;
|
|
27
|
+
total_lines_removed: z.ZodOptional<z.ZodNumber>;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
/**
|
|
30
|
+
* Context window schema
|
|
31
|
+
* Information about token usage and limits
|
|
32
|
+
*/
|
|
33
|
+
export declare const ContextWindowSchema: z.ZodObject<{
|
|
34
|
+
total_input_tokens: z.ZodNumber;
|
|
35
|
+
total_output_tokens: z.ZodNumber;
|
|
36
|
+
context_window_size: z.ZodNumber;
|
|
37
|
+
current_usage: z.ZodNullable<z.ZodObject<{
|
|
38
|
+
input_tokens: z.ZodNumber;
|
|
39
|
+
output_tokens: z.ZodNumber;
|
|
40
|
+
cache_creation_input_tokens: z.ZodNumber;
|
|
41
|
+
cache_read_input_tokens: z.ZodNumber;
|
|
42
|
+
}, z.core.$strip>>;
|
|
43
|
+
}, z.core.$strip>;
|
|
44
|
+
/**
|
|
45
|
+
* Model info schema
|
|
46
|
+
* Information about the Claude model being used
|
|
47
|
+
*/
|
|
48
|
+
export declare const ModelInfoSchema: z.ZodObject<{
|
|
49
|
+
id: z.ZodString;
|
|
50
|
+
display_name: z.ZodString;
|
|
51
|
+
}, z.core.$strip>;
|
|
52
|
+
/**
|
|
53
|
+
* Workspace schema
|
|
54
|
+
* Information about current working directory
|
|
55
|
+
*/
|
|
56
|
+
export declare const WorkspaceSchema: z.ZodObject<{
|
|
57
|
+
current_dir: z.ZodString;
|
|
58
|
+
project_dir: z.ZodString;
|
|
59
|
+
}, z.core.$strip>;
|
|
60
|
+
/**
|
|
61
|
+
* Output style schema
|
|
62
|
+
* Information about current output style
|
|
63
|
+
*/
|
|
64
|
+
export declare const OutputStyleSchema: z.ZodObject<{
|
|
65
|
+
name: z.ZodString;
|
|
66
|
+
}, z.core.$strip>;
|
|
67
|
+
/**
|
|
68
|
+
* Main stdin data schema
|
|
69
|
+
*
|
|
70
|
+
* This is the primary schema for validating Claude Code statusline data.
|
|
71
|
+
* All fields are validated at runtime, and TypeScript types are inferred
|
|
72
|
+
* automatically.
|
|
73
|
+
*/
|
|
74
|
+
export declare const StdinDataSchema: z.ZodObject<{
|
|
75
|
+
hook_event_name: z.ZodLiteral<"Status">;
|
|
76
|
+
session_id: z.ZodString;
|
|
77
|
+
transcript_path: z.ZodString;
|
|
78
|
+
cwd: z.ZodString;
|
|
79
|
+
model: z.ZodObject<{
|
|
80
|
+
id: z.ZodString;
|
|
81
|
+
display_name: z.ZodString;
|
|
82
|
+
}, z.core.$strip>;
|
|
83
|
+
workspace: z.ZodObject<{
|
|
84
|
+
current_dir: z.ZodString;
|
|
85
|
+
project_dir: z.ZodString;
|
|
86
|
+
}, z.core.$strip>;
|
|
87
|
+
version: z.ZodString;
|
|
88
|
+
output_style: z.ZodObject<{
|
|
89
|
+
name: z.ZodString;
|
|
90
|
+
}, z.core.$strip>;
|
|
91
|
+
cost: z.ZodOptional<z.ZodObject<{
|
|
92
|
+
total_cost_usd: z.ZodOptional<z.ZodNumber>;
|
|
93
|
+
total_duration_ms: z.ZodOptional<z.ZodNumber>;
|
|
94
|
+
total_api_duration_ms: z.ZodOptional<z.ZodNumber>;
|
|
95
|
+
total_lines_added: z.ZodOptional<z.ZodNumber>;
|
|
96
|
+
total_lines_removed: z.ZodOptional<z.ZodNumber>;
|
|
97
|
+
}, z.core.$strip>>;
|
|
98
|
+
context_window: z.ZodObject<{
|
|
99
|
+
total_input_tokens: z.ZodNumber;
|
|
100
|
+
total_output_tokens: z.ZodNumber;
|
|
101
|
+
context_window_size: z.ZodNumber;
|
|
102
|
+
current_usage: z.ZodNullable<z.ZodObject<{
|
|
103
|
+
input_tokens: z.ZodNumber;
|
|
104
|
+
output_tokens: z.ZodNumber;
|
|
105
|
+
cache_creation_input_tokens: z.ZodNumber;
|
|
106
|
+
cache_read_input_tokens: z.ZodNumber;
|
|
107
|
+
}, z.core.$strip>>;
|
|
108
|
+
}, z.core.$strip>;
|
|
109
|
+
}, z.core.$strip>;
|
|
110
|
+
/**
|
|
111
|
+
* Type inference from schema
|
|
112
|
+
*
|
|
113
|
+
* These types are automatically inferred from the Zod schemas,
|
|
114
|
+
* ensuring compile-time and run-time type safety are in sync.
|
|
115
|
+
*/
|
|
116
|
+
export type StdinData = z.infer<typeof StdinDataSchema>;
|
|
117
|
+
export type ContextUsage = z.infer<typeof ContextUsageSchema>;
|
|
118
|
+
export type CostInfo = z.infer<typeof CostInfoSchema>;
|
|
119
|
+
export type ContextWindow = z.infer<typeof ContextWindowSchema>;
|
|
120
|
+
export type ModelInfo = z.infer<typeof ModelInfoSchema>;
|
|
121
|
+
export type Workspace = z.infer<typeof WorkspaceSchema>;
|
|
122
|
+
export type OutputStyle = z.infer<typeof OutputStyleSchema>;
|
|
123
|
+
//# sourceMappingURL=stdin-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin-schema.d.ts","sourceRoot":"","sources":["../../src/schemas/stdin-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;iBAMf,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;iBAK9B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,eAAe;;;iBAG1B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,eAAe;;;iBAG1B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;iBAE5B,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW1B,CAAC;AAEH;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime type-safe schema for Claude Code stdin data
|
|
3
|
+
*
|
|
4
|
+
* This schema validates incoming JSON from Claude Code statusline API
|
|
5
|
+
* and provides TypeScript types automatically via inference.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
/**
|
|
9
|
+
* Context usage schema
|
|
10
|
+
* Details about current token usage in the context window
|
|
11
|
+
*/
|
|
12
|
+
export const ContextUsageSchema = z.object({
|
|
13
|
+
input_tokens: z.number(),
|
|
14
|
+
output_tokens: z.number(),
|
|
15
|
+
cache_creation_input_tokens: z.number(),
|
|
16
|
+
cache_read_input_tokens: z.number()
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Cost info schema
|
|
20
|
+
* Details about session cost and duration
|
|
21
|
+
*/
|
|
22
|
+
export const CostInfoSchema = z.object({
|
|
23
|
+
total_cost_usd: z.number(),
|
|
24
|
+
total_duration_ms: z.number(),
|
|
25
|
+
total_api_duration_ms: z.number(),
|
|
26
|
+
total_lines_added: z.number(),
|
|
27
|
+
total_lines_removed: z.number()
|
|
28
|
+
}).partial(); // Make all fields optional for backwards compatibility
|
|
29
|
+
/**
|
|
30
|
+
* Context window schema
|
|
31
|
+
* Information about token usage and limits
|
|
32
|
+
*/
|
|
33
|
+
export const ContextWindowSchema = z.object({
|
|
34
|
+
total_input_tokens: z.number(),
|
|
35
|
+
total_output_tokens: z.number(),
|
|
36
|
+
context_window_size: z.number(),
|
|
37
|
+
current_usage: ContextUsageSchema.nullable()
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* Model info schema
|
|
41
|
+
* Information about the Claude model being used
|
|
42
|
+
*/
|
|
43
|
+
export const ModelInfoSchema = z.object({
|
|
44
|
+
id: z.string(),
|
|
45
|
+
display_name: z.string()
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Workspace schema
|
|
49
|
+
* Information about current working directory
|
|
50
|
+
*/
|
|
51
|
+
export const WorkspaceSchema = z.object({
|
|
52
|
+
current_dir: z.string(),
|
|
53
|
+
project_dir: z.string()
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* Output style schema
|
|
57
|
+
* Information about current output style
|
|
58
|
+
*/
|
|
59
|
+
export const OutputStyleSchema = z.object({
|
|
60
|
+
name: z.string()
|
|
61
|
+
});
|
|
62
|
+
/**
|
|
63
|
+
* Main stdin data schema
|
|
64
|
+
*
|
|
65
|
+
* This is the primary schema for validating Claude Code statusline data.
|
|
66
|
+
* All fields are validated at runtime, and TypeScript types are inferred
|
|
67
|
+
* automatically.
|
|
68
|
+
*/
|
|
69
|
+
export const StdinDataSchema = z.object({
|
|
70
|
+
hook_event_name: z.literal('Status'),
|
|
71
|
+
session_id: z.string(),
|
|
72
|
+
transcript_path: z.string(),
|
|
73
|
+
cwd: z.string(),
|
|
74
|
+
model: ModelInfoSchema,
|
|
75
|
+
workspace: WorkspaceSchema,
|
|
76
|
+
version: z.string(),
|
|
77
|
+
output_style: OutputStyleSchema,
|
|
78
|
+
cost: CostInfoSchema.optional(),
|
|
79
|
+
context_window: ContextWindowSchema
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=stdin-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin-schema.js","sourceRoot":"","sources":["../../src/schemas/stdin-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,2BAA2B,EAAE,CAAC,CAAC,MAAM,EAAE;IACvC,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE;CACpC,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;IAC1B,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC7B,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE;IACjC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC7B,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE;CAChC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAE,uDAAuD;AAEtE;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC9B,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC/B,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC/B,aAAa,EAAE,kBAAkB,CAAC,QAAQ,EAAE;CAC7C,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;CACzB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;CACxB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CACjB,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,eAAe;IACtB,SAAS,EAAE,eAAe;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,YAAY,EAAE,iBAAiB;IAC/B,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE;IAC/B,cAAc,EAAE,mBAAmB;CACpC,CAAC,CAAC"}
|