claude-scope 0.1.3 → 0.1.5
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 +11 -9
package/dist/core/renderer.d.ts
CHANGED
|
@@ -1,21 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Unified rendering engine
|
|
2
|
+
* Unified rendering engine with error boundaries
|
|
3
3
|
* Combines widget outputs into statusline
|
|
4
4
|
*/
|
|
5
5
|
import type { IWidget } from './types.js';
|
|
6
6
|
import type { RenderContext } from '../types.js';
|
|
7
7
|
/**
|
|
8
|
-
* Renderer
|
|
8
|
+
* Renderer configuration options
|
|
9
|
+
*/
|
|
10
|
+
export interface RendererOptions {
|
|
11
|
+
/** Separator between widget outputs */
|
|
12
|
+
separator?: string;
|
|
13
|
+
/** Error handler callback for widget render failures */
|
|
14
|
+
onError?: (error: Error, widget: IWidget) => void;
|
|
15
|
+
/** Show error placeholder in output (for debugging) */
|
|
16
|
+
showErrors?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Renderer for combining widget outputs with error boundaries
|
|
20
|
+
*
|
|
21
|
+
* Failed widgets are gracefully skipped, preventing single widget
|
|
22
|
+
* failures from breaking the entire statusline.
|
|
9
23
|
*/
|
|
10
24
|
export declare class Renderer {
|
|
11
25
|
private separator;
|
|
26
|
+
private onError?;
|
|
27
|
+
private showErrors;
|
|
28
|
+
constructor(options?: RendererOptions);
|
|
12
29
|
/**
|
|
13
|
-
* Render widgets into a single line
|
|
30
|
+
* Render widgets into a single line with error boundaries
|
|
31
|
+
*
|
|
32
|
+
* Widgets that throw errors are logged (via onError callback) and skipped,
|
|
33
|
+
* allowing other widgets to continue rendering.
|
|
34
|
+
*
|
|
35
|
+
* @param widgets - Array of widgets to render
|
|
36
|
+
* @param context - Render context with width and timestamp
|
|
37
|
+
* @returns Combined widget outputs separated by separator
|
|
14
38
|
*/
|
|
15
39
|
render(widgets: IWidget[], context: RenderContext): Promise<string>;
|
|
16
40
|
/**
|
|
17
41
|
* Set custom separator
|
|
18
42
|
*/
|
|
19
43
|
setSeparator(separator: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Handle widget render errors
|
|
46
|
+
*
|
|
47
|
+
* Calls the onError callback if provided, otherwise logs to console.warn
|
|
48
|
+
*/
|
|
49
|
+
private handleError;
|
|
20
50
|
}
|
|
21
51
|
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/core/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/core/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,uDAAuD;IACvD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAC,CAA0C;IAC1D,OAAO,CAAC,UAAU,CAAU;gBAEhB,OAAO,GAAE,eAAoB;IAMzC;;;;;;;;;OASG;IACG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IA2BzE;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;;;OAIG;IACH,OAAO,CAAC,WAAW;CAQpB"}
|
package/dist/core/renderer.js
CHANGED
|
@@ -1,15 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Unified rendering engine
|
|
2
|
+
* Unified rendering engine with error boundaries
|
|
3
3
|
* Combines widget outputs into statusline
|
|
4
4
|
*/
|
|
5
5
|
import { DEFAULTS } from '../constants.js';
|
|
6
6
|
/**
|
|
7
|
-
* Renderer for combining widget outputs
|
|
7
|
+
* Renderer for combining widget outputs with error boundaries
|
|
8
|
+
*
|
|
9
|
+
* Failed widgets are gracefully skipped, preventing single widget
|
|
10
|
+
* failures from breaking the entire statusline.
|
|
8
11
|
*/
|
|
9
12
|
export class Renderer {
|
|
10
|
-
separator
|
|
13
|
+
separator;
|
|
14
|
+
onError;
|
|
15
|
+
showErrors;
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
this.separator = options.separator ?? DEFAULTS.SEPARATOR;
|
|
18
|
+
this.onError = options.onError;
|
|
19
|
+
this.showErrors = options.showErrors ?? false;
|
|
20
|
+
}
|
|
11
21
|
/**
|
|
12
|
-
* Render widgets into a single line
|
|
22
|
+
* Render widgets into a single line with error boundaries
|
|
23
|
+
*
|
|
24
|
+
* Widgets that throw errors are logged (via onError callback) and skipped,
|
|
25
|
+
* allowing other widgets to continue rendering.
|
|
26
|
+
*
|
|
27
|
+
* @param widgets - Array of widgets to render
|
|
28
|
+
* @param context - Render context with width and timestamp
|
|
29
|
+
* @returns Combined widget outputs separated by separator
|
|
13
30
|
*/
|
|
14
31
|
async render(widgets, context) {
|
|
15
32
|
const outputs = [];
|
|
@@ -17,9 +34,19 @@ export class Renderer {
|
|
|
17
34
|
if (!widget.isEnabled()) {
|
|
18
35
|
continue;
|
|
19
36
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
37
|
+
try {
|
|
38
|
+
const output = await widget.render(context);
|
|
39
|
+
if (output !== null) {
|
|
40
|
+
outputs.push(output);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
// Log error but continue rendering other widgets
|
|
45
|
+
this.handleError(error, widget);
|
|
46
|
+
// Optional: show error placeholder in output
|
|
47
|
+
if (this.showErrors) {
|
|
48
|
+
outputs.push(`${widget.id}:<err>`);
|
|
49
|
+
}
|
|
23
50
|
}
|
|
24
51
|
}
|
|
25
52
|
return outputs.join(this.separator);
|
|
@@ -30,5 +57,19 @@ export class Renderer {
|
|
|
30
57
|
setSeparator(separator) {
|
|
31
58
|
this.separator = separator;
|
|
32
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Handle widget render errors
|
|
62
|
+
*
|
|
63
|
+
* Calls the onError callback if provided, otherwise logs to console.warn
|
|
64
|
+
*/
|
|
65
|
+
handleError(error, widget) {
|
|
66
|
+
if (this.onError) {
|
|
67
|
+
this.onError(error, widget);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Default: silent fail with console.warn
|
|
71
|
+
console.warn(`[Widget ${widget.id}] ${error.message}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
33
74
|
}
|
|
34
75
|
//# sourceMappingURL=renderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/core/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/core/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAc3C;;;;;GAKG;AACH,MAAM,OAAO,QAAQ;IACX,SAAS,CAAS;IAClB,OAAO,CAA2C;IAClD,UAAU,CAAU;IAE5B,YAAY,UAA2B,EAAE;QACvC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC;QACzD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;IAChD,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CAAC,OAAkB,EAAE,OAAsB;QACrD,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,iDAAiD;gBACjD,IAAI,CAAC,WAAW,CAAC,KAAc,EAAE,MAAM,CAAC,CAAC;gBAEzC,6CAA6C;gBAC7C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACK,WAAW,CAAC,KAAY,EAAE,MAAe;QAC/C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,yCAAyC;YACzC,OAAO,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stdin provider for parsing JSON data from stdin
|
|
3
|
+
* Parses and validates Claude Code session data using Zod
|
|
4
|
+
*/
|
|
5
|
+
import type { StdinData } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Error thrown when stdin parsing fails
|
|
8
|
+
*/
|
|
9
|
+
export declare class StdinParseError extends Error {
|
|
10
|
+
constructor(message: string);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Error thrown when stdin validation fails
|
|
14
|
+
*/
|
|
15
|
+
export declare class StdinValidationError extends Error {
|
|
16
|
+
constructor(message: string);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Stdin provider for parsing and validating JSON data
|
|
20
|
+
*/
|
|
21
|
+
export declare class StdinProvider {
|
|
22
|
+
/**
|
|
23
|
+
* Parse and validate JSON string from stdin
|
|
24
|
+
* @param input JSON string to parse
|
|
25
|
+
* @returns Validated StdinData object
|
|
26
|
+
* @throws StdinParseError if JSON is malformed
|
|
27
|
+
* @throws StdinValidationError if data doesn't match schema
|
|
28
|
+
*/
|
|
29
|
+
parse(input: string): Promise<StdinData>;
|
|
30
|
+
/**
|
|
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
|
|
35
|
+
*/
|
|
36
|
+
safeParse(input: string): Promise<{
|
|
37
|
+
success: true;
|
|
38
|
+
data: StdinData;
|
|
39
|
+
} | {
|
|
40
|
+
success: false;
|
|
41
|
+
error: string;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=stdin-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin-provider.d.ts","sourceRoot":"","sources":["../../src/data/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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stdin provider for parsing JSON data from stdin
|
|
3
|
+
* Parses and validates Claude Code session data using Zod
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { StdinDataSchema } from '../schemas/stdin-schema.js';
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown when stdin parsing fails
|
|
9
|
+
*/
|
|
10
|
+
export class StdinParseError extends Error {
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'StdinParseError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Error thrown when stdin validation fails
|
|
18
|
+
*/
|
|
19
|
+
export class StdinValidationError extends Error {
|
|
20
|
+
constructor(message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = 'StdinValidationError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Stdin provider for parsing and validating JSON data
|
|
27
|
+
*/
|
|
28
|
+
export class StdinProvider {
|
|
29
|
+
/**
|
|
30
|
+
* Parse and validate JSON string from stdin
|
|
31
|
+
* @param input JSON string to parse
|
|
32
|
+
* @returns Validated StdinData object
|
|
33
|
+
* @throws StdinParseError if JSON is malformed
|
|
34
|
+
* @throws StdinValidationError if data doesn't match schema
|
|
35
|
+
*/
|
|
36
|
+
async parse(input) {
|
|
37
|
+
// Check for empty input
|
|
38
|
+
if (!input || input.trim().length === 0) {
|
|
39
|
+
throw new StdinParseError('stdin data is empty');
|
|
40
|
+
}
|
|
41
|
+
// Parse JSON
|
|
42
|
+
let data;
|
|
43
|
+
try {
|
|
44
|
+
data = JSON.parse(input);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw new StdinParseError(`Invalid JSON: ${error.message}`);
|
|
48
|
+
}
|
|
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;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
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
|
|
72
|
+
*/
|
|
73
|
+
async safeParse(input) {
|
|
74
|
+
try {
|
|
75
|
+
const data = await this.parse(input);
|
|
76
|
+
return { success: true, data };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
return { success: false, error: error.message };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=stdin-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin-provider.js","sourceRoot":"","sources":["../../src/data/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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AA0BH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAkD5C"}
|
package/dist/index.js
CHANGED
|
@@ -5,82 +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';
|
|
8
|
+
import { GitWidget } from './widgets/git/git-widget.js';
|
|
9
9
|
import { ModelWidget } from './widgets/model-widget.js';
|
|
10
10
|
import { ContextWidget } from './widgets/context-widget.js';
|
|
11
11
|
import { CostWidget } from './widgets/cost-widget.js';
|
|
12
12
|
import { DurationWidget } from './widgets/duration-widget.js';
|
|
13
|
-
import { GitChangesWidget } from './widgets/git-changes-widget.js';
|
|
14
|
-
import {
|
|
13
|
+
import { GitChangesWidget } from './widgets/git/git-changes-widget.js';
|
|
14
|
+
import { StdinProvider } from './data/stdin-provider.js';
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* Read stdin as string
|
|
17
17
|
*/
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
model: {
|
|
25
|
-
id: 'claude-opus-4-1',
|
|
26
|
-
display_name: 'Opus 4.5'
|
|
27
|
-
},
|
|
28
|
-
workspace: {
|
|
29
|
-
current_dir: process.cwd(),
|
|
30
|
-
project_dir: process.cwd()
|
|
31
|
-
},
|
|
32
|
-
version: '1.0.80',
|
|
33
|
-
output_style: {
|
|
34
|
-
name: 'default'
|
|
35
|
-
},
|
|
36
|
-
cost: {
|
|
37
|
-
total_cost_usd: 0.0123,
|
|
38
|
-
total_duration_ms: 330000,
|
|
39
|
-
total_api_duration_ms: 15000,
|
|
40
|
-
total_lines_added: 42,
|
|
41
|
-
total_lines_removed: 10
|
|
42
|
-
},
|
|
43
|
-
context_window: {
|
|
44
|
-
total_input_tokens: 15234,
|
|
45
|
-
total_output_tokens: 4521,
|
|
46
|
-
context_window_size: 200000,
|
|
47
|
-
current_usage: {
|
|
48
|
-
input_tokens: 8500,
|
|
49
|
-
output_tokens: 1200,
|
|
50
|
-
cache_creation_input_tokens: 5000,
|
|
51
|
-
cache_read_input_tokens: 2000
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
};
|
|
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');
|
|
55
24
|
}
|
|
56
25
|
/**
|
|
57
26
|
* Main entry point
|
|
58
27
|
*/
|
|
59
28
|
export async function main() {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
await
|
|
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 '';
|
|
79
67
|
}
|
|
80
|
-
// Render
|
|
81
|
-
const output = await renderer.render(registry.getEnabledWidgets(), { width: 80, timestamp: Date.now() });
|
|
82
|
-
return output;
|
|
83
68
|
}
|
|
84
69
|
// Run when executed (works with both direct node and npx)
|
|
85
|
-
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
|
+
});
|
|
86
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,64 +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 SimpleGit } from 'simple-git';
|
|
6
|
-
import type { GitInfo, GitChanges } from '../types.js';
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Result of git status operation
|
|
9
9
|
*/
|
|
10
|
-
export interface
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
current: string | null;
|
|
14
|
-
all: string[];
|
|
15
|
-
}>;
|
|
16
|
-
diffStats(): Promise<{
|
|
17
|
-
insertions: number;
|
|
18
|
-
deletions: number;
|
|
19
|
-
} | null>;
|
|
10
|
+
export interface GitStatusResult {
|
|
11
|
+
/** Current branch name (null if no branch or detached HEAD) */
|
|
12
|
+
current: string | null;
|
|
20
13
|
}
|
|
21
14
|
/**
|
|
22
|
-
*
|
|
15
|
+
* Single file diff statistics
|
|
23
16
|
*/
|
|
24
|
-
export interface
|
|
25
|
-
|
|
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;
|
|
26
24
|
}
|
|
27
25
|
/**
|
|
28
|
-
*
|
|
26
|
+
* Result of git diff --shortstat operation
|
|
29
27
|
*/
|
|
30
|
-
export
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
getBranch(): Promise<string | null>;
|
|
44
|
-
/**
|
|
45
|
-
* Get git diff statistics
|
|
46
|
-
* @returns Changes with insertions and deletions, or null if not a repo
|
|
47
|
-
*/
|
|
48
|
-
getChanges(): Promise<GitChanges | 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 {
|
|
49
41
|
/**
|
|
50
|
-
*
|
|
42
|
+
* Get current git status (branch name)
|
|
43
|
+
* @returns Promise resolving to status info
|
|
51
44
|
*/
|
|
52
|
-
|
|
45
|
+
status(): Promise<GitStatusResult>;
|
|
53
46
|
/**
|
|
54
|
-
* Get
|
|
47
|
+
* Get diff statistics (insertions/deletions)
|
|
48
|
+
* @returns Promise resolving to diff summary
|
|
55
49
|
*/
|
|
56
|
-
|
|
50
|
+
diffSummary(options?: string[]): Promise<GitDiffSummary>;
|
|
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>;
|
|
57
63
|
}
|
|
58
64
|
/**
|
|
59
|
-
* Factory
|
|
60
|
-
*
|
|
61
|
-
* @
|
|
65
|
+
* Factory function to create NativeGit instance
|
|
66
|
+
*
|
|
67
|
+
* @param cwd - Working directory for git operations
|
|
68
|
+
* @returns IGit instance
|
|
62
69
|
*/
|
|
63
|
-
export declare function
|
|
70
|
+
export declare function createGit(cwd: string): IGit;
|
|
64
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"}
|