claude-scope 0.1.2 → 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/constants.d.ts +56 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +57 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/renderer.d.ts +33 -3
- package/dist/core/renderer.d.ts.map +1 -1
- package/dist/core/renderer.js +49 -7
- package/dist/core/renderer.js.map +1 -1
- package/dist/core/stdin-data-widget.d.ts +85 -0
- package/dist/core/stdin-data-widget.d.ts.map +1 -0
- package/dist/core/stdin-data-widget.js +75 -0
- package/dist/core/stdin-data-widget.js.map +1 -0
- package/dist/core/widget-types.d.ts +30 -0
- package/dist/core/widget-types.d.ts.map +1 -0
- package/dist/core/widget-types.js +30 -0
- package/dist/core/widget-types.js.map +1 -0
- 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 +64 -21
- package/dist/index.js.map +1 -1
- package/dist/providers/git-provider.d.ts +55 -32
- package/dist/providers/git-provider.d.ts.map +1 -1
- package/dist/providers/git-provider.js +63 -40
- 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 +13 -15
- 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/utils/colors.d.ts +16 -0
- package/dist/utils/colors.d.ts.map +1 -1
- package/dist/utils/colors.js +18 -0
- package/dist/utils/colors.js.map +1 -1
- package/dist/utils/formatters.d.ts +56 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +114 -0
- package/dist/utils/formatters.js.map +1 -0
- package/dist/widgets/context-widget.d.ts +13 -0
- package/dist/widgets/context-widget.d.ts.map +1 -0
- package/dist/widgets/context-widget.js +31 -0
- package/dist/widgets/context-widget.js.map +1 -0
- 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 +13 -0
- package/dist/widgets/cost-widget.d.ts.map +1 -0
- package/dist/widgets/cost-widget.js +18 -0
- package/dist/widgets/cost-widget.js.map +1 -0
- package/dist/widgets/duration-widget.d.ts +13 -0
- package/dist/widgets/duration-widget.d.ts.map +1 -0
- package/dist/widgets/duration-widget.js +18 -0
- package/dist/widgets/duration-widget.js.map +1 -0
- 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/git-changes-widget.d.ts +16 -0
- package/dist/widgets/git-changes-widget.d.ts.map +1 -0
- package/dist/widgets/git-changes-widget.js +37 -0
- package/dist/widgets/git-changes-widget.js.map +1 -0
- package/dist/widgets/git-widget.d.ts +8 -2
- package/dist/widgets/git-widget.d.ts.map +1 -1
- package/dist/widgets/git-widget.js +9 -9
- package/dist/widgets/git-widget.js.map +1 -1
- package/dist/widgets/model-widget.d.ts +13 -0
- package/dist/widgets/model-widget.d.ts.map +1 -0
- package/dist/widgets/model-widget.js +15 -0
- package/dist/widgets/model-widget.js.map +1 -0
- package/package.json +14 -6
package/dist/index.js
CHANGED
|
@@ -5,31 +5,74 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { WidgetRegistry } from './core/widget-registry.js';
|
|
7
7
|
import { Renderer } from './core/renderer.js';
|
|
8
|
-
import { GitWidget } from './widgets/git-widget.js';
|
|
9
|
-
import {
|
|
8
|
+
import { GitWidget } from './widgets/git/git-widget.js';
|
|
9
|
+
import { ModelWidget } from './widgets/model-widget.js';
|
|
10
|
+
import { ContextWidget } from './widgets/context-widget.js';
|
|
11
|
+
import { CostWidget } from './widgets/cost-widget.js';
|
|
12
|
+
import { DurationWidget } from './widgets/duration-widget.js';
|
|
13
|
+
import { GitChangesWidget } from './widgets/git/git-changes-widget.js';
|
|
14
|
+
import { StdinProvider } from './data/stdin-provider.js';
|
|
15
|
+
/**
|
|
16
|
+
* Read stdin as string
|
|
17
|
+
*/
|
|
18
|
+
async function readStdin() {
|
|
19
|
+
const chunks = [];
|
|
20
|
+
for await (const chunk of process.stdin) {
|
|
21
|
+
chunks.push(chunk);
|
|
22
|
+
}
|
|
23
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
24
|
+
}
|
|
10
25
|
/**
|
|
11
26
|
* Main entry point
|
|
12
27
|
*/
|
|
13
28
|
export async function main() {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
try {
|
|
30
|
+
// Read JSON from stdin
|
|
31
|
+
const stdin = await readStdin();
|
|
32
|
+
// If stdin is empty, return empty string
|
|
33
|
+
if (!stdin || stdin.trim().length === 0) {
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
// Parse and validate with StdinProvider
|
|
37
|
+
const provider = new StdinProvider();
|
|
38
|
+
const stdinData = await provider.parse(stdin);
|
|
39
|
+
// Create registry
|
|
40
|
+
const registry = new WidgetRegistry();
|
|
41
|
+
// Register all widgets (no constructor args needed)
|
|
42
|
+
await registry.register(new ModelWidget());
|
|
43
|
+
await registry.register(new ContextWidget());
|
|
44
|
+
await registry.register(new CostWidget());
|
|
45
|
+
await registry.register(new DurationWidget());
|
|
46
|
+
await registry.register(new GitWidget());
|
|
47
|
+
await registry.register(new GitChangesWidget());
|
|
48
|
+
// Create renderer with error handling configuration
|
|
49
|
+
const renderer = new Renderer({
|
|
50
|
+
separator: ' │ ',
|
|
51
|
+
onError: (error, widget) => {
|
|
52
|
+
// Silently ignore widget errors - they return null
|
|
53
|
+
},
|
|
54
|
+
showErrors: false
|
|
55
|
+
});
|
|
56
|
+
// Update all widgets with data
|
|
57
|
+
for (const widget of registry.getAll()) {
|
|
58
|
+
await widget.update(stdinData);
|
|
59
|
+
}
|
|
60
|
+
// Render
|
|
61
|
+
const output = await renderer.render(registry.getEnabledWidgets(), { width: 80, timestamp: Date.now() });
|
|
62
|
+
return output || '';
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
// Return empty string on any error
|
|
66
|
+
return '';
|
|
67
|
+
}
|
|
32
68
|
}
|
|
33
69
|
// Run when executed (works with both direct node and npx)
|
|
34
|
-
main().then(
|
|
70
|
+
main().then((output) => {
|
|
71
|
+
if (output) {
|
|
72
|
+
console.log(output);
|
|
73
|
+
}
|
|
74
|
+
}).catch(() => {
|
|
75
|
+
// Silently fail - return empty status line
|
|
76
|
+
process.exit(0);
|
|
77
|
+
});
|
|
35
78
|
//# 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":";AACA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,48 +1,71 @@
|
|
|
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 type { GitInfo } from '../types.js';
|
|
6
7
|
/**
|
|
7
|
-
*
|
|
8
|
+
* Result of git status operation
|
|
8
9
|
*/
|
|
9
|
-
export interface
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
current: string | null;
|
|
13
|
-
all: string[];
|
|
14
|
-
}>;
|
|
10
|
+
export interface GitStatusResult {
|
|
11
|
+
/** Current branch name (null if no branch or detached HEAD) */
|
|
12
|
+
current: string | null;
|
|
15
13
|
}
|
|
16
14
|
/**
|
|
17
|
-
*
|
|
15
|
+
* Single file diff statistics
|
|
18
16
|
*/
|
|
19
|
-
export interface
|
|
20
|
-
|
|
17
|
+
export interface GitDiffFile {
|
|
18
|
+
/** File path relative to repo root */
|
|
19
|
+
file: string;
|
|
20
|
+
/** Number of lines added */
|
|
21
|
+
insertions: number;
|
|
22
|
+
/** Number of lines deleted */
|
|
23
|
+
deletions: number;
|
|
21
24
|
}
|
|
22
25
|
/**
|
|
23
|
-
*
|
|
26
|
+
* Result of git diff --shortstat operation
|
|
24
27
|
*/
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
getBranch(): Promise<string | null>;
|
|
28
|
+
export interface GitDiffSummary {
|
|
29
|
+
/** Array of changed files with statistics */
|
|
30
|
+
files: GitDiffFile[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Interface for git operations
|
|
34
|
+
*
|
|
35
|
+
* Abstraction over git commands to enable:
|
|
36
|
+
* - Easy testing with mocks
|
|
37
|
+
* - Swapping implementations
|
|
38
|
+
* - No tight coupling to specific git library
|
|
39
|
+
*/
|
|
40
|
+
export interface IGit {
|
|
39
41
|
/**
|
|
40
|
-
*
|
|
42
|
+
* Get current git status (branch name)
|
|
43
|
+
* @returns Promise resolving to status info
|
|
41
44
|
*/
|
|
42
|
-
|
|
45
|
+
status(): Promise<GitStatusResult>;
|
|
43
46
|
/**
|
|
44
|
-
* Get
|
|
47
|
+
* Get diff statistics (insertions/deletions)
|
|
48
|
+
* @returns Promise resolving to diff summary
|
|
45
49
|
*/
|
|
46
|
-
|
|
50
|
+
diffSummary(options?: string[]): Promise<GitDiffSummary>;
|
|
47
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Native git implementation using child_process
|
|
54
|
+
*
|
|
55
|
+
* Executes real git commands on the system.
|
|
56
|
+
* Requires git to be installed and available in PATH.
|
|
57
|
+
*/
|
|
58
|
+
export declare class NativeGit implements IGit {
|
|
59
|
+
private cwd;
|
|
60
|
+
constructor(cwd: string);
|
|
61
|
+
status(): Promise<GitStatusResult>;
|
|
62
|
+
diffSummary(options?: string[]): Promise<GitDiffSummary>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Factory function to create NativeGit instance
|
|
66
|
+
*
|
|
67
|
+
* @param cwd - Working directory for git operations
|
|
68
|
+
* @returns IGit instance
|
|
69
|
+
*/
|
|
70
|
+
export declare function createGit(cwd: string): IGit;
|
|
48
71
|
//# sourceMappingURL=git-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-provider.d.ts","sourceRoot":"","sources":["../../src/providers/git-provider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"git-provider.d.ts","sourceRoot":"","sources":["../../src/providers/git-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,IAAI;IACnB;;;OAGG;IACH,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAEnC;;;OAGG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC1D;AAED;;;;;GAKG;AACH,qBAAa,SAAU,YAAW,IAAI;IACpC,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,EAAE,MAAM;IAIjB,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAiBlC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;CAgC/D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C"}
|
|
@@ -1,50 +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
|
*/
|
|
7
|
+
import { execFile } from 'node:child_process';
|
|
8
|
+
import { promisify } from 'node:util';
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
5
10
|
/**
|
|
6
|
-
*
|
|
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.
|
|
7
15
|
*/
|
|
8
|
-
export class
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
constructor(deps) {
|
|
13
|
-
this.git = deps.git;
|
|
14
|
-
this.repoPath = '';
|
|
16
|
+
export class NativeGit {
|
|
17
|
+
cwd;
|
|
18
|
+
constructor(cwd) {
|
|
19
|
+
this.cwd = cwd;
|
|
15
20
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return null;
|
|
21
|
+
async status() {
|
|
22
|
+
try {
|
|
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 };
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Not in a git repo or git not available
|
|
33
|
+
return { current: null };
|
|
30
34
|
}
|
|
31
|
-
const result = await this.git.branch();
|
|
32
|
-
return result.current;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Check if current path is a git repository
|
|
36
|
-
*/
|
|
37
|
-
isRepo() {
|
|
38
|
-
return this._isRepo;
|
|
39
35
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
36
|
+
async diffSummary(options) {
|
|
37
|
+
const args = ['diff', '--shortstat'];
|
|
38
|
+
if (options) {
|
|
39
|
+
args.push(...options);
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
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 };
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Not in a git repo or git not available
|
|
60
|
+
return { files: [] };
|
|
61
|
+
}
|
|
48
62
|
}
|
|
49
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Factory function to create NativeGit instance
|
|
66
|
+
*
|
|
67
|
+
* @param cwd - Working directory for git operations
|
|
68
|
+
* @returns IGit instance
|
|
69
|
+
*/
|
|
70
|
+
export function createGit(cwd) {
|
|
71
|
+
return new NativeGit(cwd);
|
|
72
|
+
}
|
|
50
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"}
|