prtape-cli 0.0.0-stage → 0.1.0
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/LICENSE +21 -0
- package/README.md +138 -2
- package/dist/adapters/claude.d.ts +2 -0
- package/dist/adapters/claude.js +309 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/bash-edits.d.ts +41 -0
- package/dist/bash-edits.js +440 -0
- package/dist/bash-edits.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +214 -0
- package/dist/cli.js.map +1 -0
- package/dist/decision.d.ts +7 -0
- package/dist/decision.js +224 -0
- package/dist/decision.js.map +1 -0
- package/dist/discover.d.ts +32 -0
- package/dist/discover.js +179 -0
- package/dist/discover.js.map +1 -0
- package/dist/display.d.ts +28 -0
- package/dist/display.js +311 -0
- package/dist/display.js.map +1 -0
- package/dist/env.d.ts +5 -0
- package/dist/env.js +11 -0
- package/dist/env.js.map +1 -0
- package/dist/gh.d.ts +46 -0
- package/dist/gh.js +190 -0
- package/dist/gh.js.map +1 -0
- package/dist/glance.d.ts +15 -0
- package/dist/glance.js +75 -0
- package/dist/glance.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/orphan.d.ts +44 -0
- package/dist/orphan.js +152 -0
- package/dist/orphan.js.map +1 -0
- package/dist/png.d.ts +2 -0
- package/dist/png.js +13 -0
- package/dist/png.js.map +1 -0
- package/dist/privacy.d.ts +7 -0
- package/dist/privacy.js +39 -0
- package/dist/privacy.js.map +1 -0
- package/dist/redact.d.ts +17 -0
- package/dist/redact.js +101 -0
- package/dist/redact.js.map +1 -0
- package/dist/run.d.ts +48 -0
- package/dist/run.js +218 -0
- package/dist/run.js.map +1 -0
- package/dist/summary.d.ts +7 -0
- package/dist/summary.js +134 -0
- package/dist/summary.js.map +1 -0
- package/dist/tests-detect.d.ts +19 -0
- package/dist/tests-detect.js +97 -0
- package/dist/tests-detect.js.map +1 -0
- package/dist/text.d.ts +8 -0
- package/dist/text.js +31 -0
- package/dist/text.js.map +1 -0
- package/dist/timeline/format.d.ts +28 -0
- package/dist/timeline/format.js +127 -0
- package/dist/timeline/format.js.map +1 -0
- package/dist/timeline/md.d.ts +17 -0
- package/dist/timeline/md.js +129 -0
- package/dist/timeline/md.js.map +1 -0
- package/dist/timeline/svg.d.ts +7 -0
- package/dist/timeline/svg.js +260 -0
- package/dist/timeline/svg.js.map +1 -0
- package/dist/timeline/wrap.d.ts +7 -0
- package/dist/timeline/wrap.js +77 -0
- package/dist/timeline/wrap.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +57 -4
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { oneLine } from "../text.js";
|
|
2
|
+
/** Approximate rendered width. CJK and the ellipsis count as one em; bold Latin is wider than 0.5em. */
|
|
3
|
+
export function textWidth(value, fontSize) {
|
|
4
|
+
let width = 0;
|
|
5
|
+
for (const ch of value) {
|
|
6
|
+
if (ch === " ")
|
|
7
|
+
width += fontSize * 0.33;
|
|
8
|
+
else if (isWide(ch))
|
|
9
|
+
width += fontSize;
|
|
10
|
+
else
|
|
11
|
+
width += fontSize * 0.62;
|
|
12
|
+
}
|
|
13
|
+
return width;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Wrap onto at most `maxLines`. Wide characters and over-long tokens break
|
|
17
|
+
* so a line cannot extend past `maxWidth`. Leftover text ends with an ellipsis.
|
|
18
|
+
*/
|
|
19
|
+
export function wrapText(value, maxWidth, fontSize, maxLines) {
|
|
20
|
+
const source = [...oneLine(value)];
|
|
21
|
+
if (source.length === 0 || maxLines < 1 || maxWidth <= 0)
|
|
22
|
+
return [];
|
|
23
|
+
const lines = [];
|
|
24
|
+
let index = 0;
|
|
25
|
+
while (index < source.length && lines.length < maxLines) {
|
|
26
|
+
const last = lines.length === maxLines - 1;
|
|
27
|
+
const line = [];
|
|
28
|
+
let consumed = index;
|
|
29
|
+
while (consumed < source.length) {
|
|
30
|
+
const ch = source[consumed] ?? "";
|
|
31
|
+
const candidate = line.join("") + ch;
|
|
32
|
+
if (line.length > 0 && textWidth(candidate, fontSize) > maxWidth)
|
|
33
|
+
break;
|
|
34
|
+
line.push(ch);
|
|
35
|
+
consumed += 1;
|
|
36
|
+
}
|
|
37
|
+
if (!last && consumed < source.length) {
|
|
38
|
+
const space = line.lastIndexOf(" ");
|
|
39
|
+
if (space > 0) {
|
|
40
|
+
consumed -= line.length - space - 1;
|
|
41
|
+
line.splice(space);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let drawn = line.join("").trimEnd();
|
|
45
|
+
if (last && consumed < source.length) {
|
|
46
|
+
while (drawn && textWidth(`${drawn}…`, fontSize) > maxWidth)
|
|
47
|
+
drawn = dropLast(drawn);
|
|
48
|
+
drawn = `${drawn}…`;
|
|
49
|
+
consumed = source.length;
|
|
50
|
+
}
|
|
51
|
+
if (!drawn)
|
|
52
|
+
break;
|
|
53
|
+
lines.push(drawn);
|
|
54
|
+
index = consumed;
|
|
55
|
+
if (source[index] === " ")
|
|
56
|
+
index += 1;
|
|
57
|
+
}
|
|
58
|
+
return lines;
|
|
59
|
+
}
|
|
60
|
+
function dropLast(value) {
|
|
61
|
+
const chars = [...value];
|
|
62
|
+
chars.pop();
|
|
63
|
+
return chars.join("");
|
|
64
|
+
}
|
|
65
|
+
function isWide(ch) {
|
|
66
|
+
const code = ch.codePointAt(0) ?? 0;
|
|
67
|
+
if (ch === "…" || ch === "—" || ch === "·")
|
|
68
|
+
return true;
|
|
69
|
+
return ((code >= 0x1100 && code <= 0x115f) ||
|
|
70
|
+
(code >= 0x2e80 && code <= 0x9fff) ||
|
|
71
|
+
(code >= 0xac00 && code <= 0xd7af) ||
|
|
72
|
+
(code >= 0xf900 && code <= 0xfaff) ||
|
|
73
|
+
(code >= 0xfe10 && code <= 0xfe6f) ||
|
|
74
|
+
(code >= 0xff01 && code <= 0xff60) ||
|
|
75
|
+
(code >= 0x20000 && code <= 0x3fffd));
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=wrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../src/timeline/wrap.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export type SourceKind = "claude-code";
|
|
2
|
+
export type FileAction = "edit" | "write" | "delete";
|
|
3
|
+
export type TestOutcome = "pass" | "fail" | "unknown";
|
|
4
|
+
export interface TouchedFile {
|
|
5
|
+
path: string;
|
|
6
|
+
action: FileAction;
|
|
7
|
+
}
|
|
8
|
+
export interface TestRun {
|
|
9
|
+
command: string;
|
|
10
|
+
outcome: TestOutcome;
|
|
11
|
+
/** Parsed from that run's reporter. Absent when the output has no counts. */
|
|
12
|
+
failed?: number;
|
|
13
|
+
passed?: number;
|
|
14
|
+
total?: number;
|
|
15
|
+
/** First failing test name, copied from the reporter line. */
|
|
16
|
+
failedName?: string;
|
|
17
|
+
}
|
|
18
|
+
/** One observed action, in the order it happened. Not a canned phase. */
|
|
19
|
+
export type TimelineEvent = ({
|
|
20
|
+
kind: "read";
|
|
21
|
+
path?: string;
|
|
22
|
+
} | {
|
|
23
|
+
kind: "edit";
|
|
24
|
+
path: string;
|
|
25
|
+
action: FileAction;
|
|
26
|
+
before?: string;
|
|
27
|
+
after?: string;
|
|
28
|
+
} | {
|
|
29
|
+
kind: "test";
|
|
30
|
+
command: string;
|
|
31
|
+
outcome: TestOutcome;
|
|
32
|
+
failed?: number;
|
|
33
|
+
passed?: number;
|
|
34
|
+
total?: number;
|
|
35
|
+
failedName?: string;
|
|
36
|
+
} | {
|
|
37
|
+
kind: "commit";
|
|
38
|
+
message?: string;
|
|
39
|
+
}) & {
|
|
40
|
+
/** Bash tool call that produced this event. Not shown on public steps. */
|
|
41
|
+
batch?: string;
|
|
42
|
+
};
|
|
43
|
+
export type Step = {
|
|
44
|
+
kind: "prompt";
|
|
45
|
+
text: string;
|
|
46
|
+
} | {
|
|
47
|
+
kind: "read";
|
|
48
|
+
path?: string;
|
|
49
|
+
} | {
|
|
50
|
+
kind: "edit";
|
|
51
|
+
path: string;
|
|
52
|
+
action: FileAction;
|
|
53
|
+
} | {
|
|
54
|
+
kind: "test";
|
|
55
|
+
command: string;
|
|
56
|
+
outcome: TestOutcome;
|
|
57
|
+
} | {
|
|
58
|
+
kind: "commit";
|
|
59
|
+
} | {
|
|
60
|
+
kind: "decision";
|
|
61
|
+
text: string;
|
|
62
|
+
};
|
|
63
|
+
/** Used when a session file has no human prompt. */
|
|
64
|
+
export declare const FALLBACK_TITLE = "Coding-agent session";
|
|
65
|
+
/** Used when a session file has no summary and no assistant prose. */
|
|
66
|
+
export declare const FALLBACK_DECISION = "Session recorded. No decision summary was found.";
|
|
67
|
+
export interface SessionSummary {
|
|
68
|
+
source: SourceKind;
|
|
69
|
+
sessionId: string;
|
|
70
|
+
startedAt?: string;
|
|
71
|
+
model?: string;
|
|
72
|
+
branch?: string;
|
|
73
|
+
cwd?: string;
|
|
74
|
+
title: string;
|
|
75
|
+
decision: string;
|
|
76
|
+
files: TouchedFile[];
|
|
77
|
+
tests: TestRun[];
|
|
78
|
+
/** Observed actions in session order. Drives steps and the track. */
|
|
79
|
+
events: TimelineEvent[];
|
|
80
|
+
testsRun: boolean;
|
|
81
|
+
steps: Step[];
|
|
82
|
+
}
|
|
83
|
+
export interface SessionDraft {
|
|
84
|
+
source: SourceKind;
|
|
85
|
+
sessionId: string;
|
|
86
|
+
startedAt?: string;
|
|
87
|
+
model?: string;
|
|
88
|
+
branch?: string;
|
|
89
|
+
cwd?: string;
|
|
90
|
+
title: string;
|
|
91
|
+
decision: string;
|
|
92
|
+
files: TouchedFile[];
|
|
93
|
+
tests: TestRun[];
|
|
94
|
+
/** When set, this order wins over files-then-tests bucketing. */
|
|
95
|
+
events?: TimelineEvent[];
|
|
96
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Used when a session file has no human prompt. */
|
|
2
|
+
export const FALLBACK_TITLE = "Coding-agent session";
|
|
3
|
+
/** Used when a session file has no summary and no assistant prose. */
|
|
4
|
+
export const FALLBACK_DECISION = "Session recorded. No decision summary was found.";
|
|
5
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAiDA,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAErD,sEAAsE;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,kDAAkD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const VERSION = "0.1.0";
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,59 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prtape-cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "One image on the PR showing what your AI agent did.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Jasper31943",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Jasper31943/prtape.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/Jasper31943/prtape",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/Jasper31943/prtape/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"bin": {
|
|
17
|
+
"prtape": "./dist/cli.js",
|
|
18
|
+
"prtape-cli": "./dist/cli.js"
|
|
19
|
+
},
|
|
20
|
+
"main": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"import": "./dist/index.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"README.md",
|
|
31
|
+
"LICENSE"
|
|
32
|
+
],
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=20"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc -p tsconfig.json && chmod +x dist/cli.js",
|
|
38
|
+
"prepare": "npm run build",
|
|
39
|
+
"typecheck": "tsc -p tsconfig.test.json --noEmit",
|
|
40
|
+
"test": "tsc -p tsconfig.test.json --noEmit && tsx --test test/*.test.ts",
|
|
41
|
+
"prtape": "tsx src/cli.ts"
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"cli",
|
|
45
|
+
"claude-code",
|
|
46
|
+
"pull-request",
|
|
47
|
+
"redaction",
|
|
48
|
+
"timeline"
|
|
49
|
+
],
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.15.3",
|
|
52
|
+
"tsx": "^4.19.4",
|
|
53
|
+
"typescript": "^5.8.3"
|
|
54
|
+
},
|
|
55
|
+
"sideEffects": false,
|
|
56
|
+
"dependencies": {
|
|
57
|
+
"@resvg/resvg-js": "^2.6.2"
|
|
58
|
+
}
|
|
59
|
+
}
|