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
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SessionSummary } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* One short decision from the edits that actually happened.
|
|
4
|
+
* A test-file expectation change is not described as a source-code fix.
|
|
5
|
+
* Returns undefined when the diff does not establish a single change.
|
|
6
|
+
*/
|
|
7
|
+
export declare function decisionFromEvents(summary: SessionSummary): string | undefined;
|
package/dist/decision.js
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { bashSubstitutions } from "./bash-edits.js";
|
|
2
|
+
/**
|
|
3
|
+
* One short decision from the edits that actually happened.
|
|
4
|
+
* A test-file expectation change is not described as a source-code fix.
|
|
5
|
+
* Returns undefined when the diff does not establish a single change.
|
|
6
|
+
*/
|
|
7
|
+
export function decisionFromEvents(summary) {
|
|
8
|
+
const substitutions = substitutionsOf(summary);
|
|
9
|
+
const expectation = substitutions.filter((item) => item.shift && isTestFile(item.file));
|
|
10
|
+
const source = sourceReturn(summary);
|
|
11
|
+
if (expectation.length === 1 && !source) {
|
|
12
|
+
const item = expectation[0];
|
|
13
|
+
const shift = item?.shift;
|
|
14
|
+
if (!shift)
|
|
15
|
+
return undefined;
|
|
16
|
+
const sourceEdited = summary.events.some((event) => event.kind === "edit" && !isTestFile(event.path));
|
|
17
|
+
if (!sourceEdited && shift.callee) {
|
|
18
|
+
return `Correct test expectation from ${shift.from} to ${shift.to}; leave ${shift.callee}() unchanged.`;
|
|
19
|
+
}
|
|
20
|
+
return `Correct test expectation from ${shift.from} to ${shift.to}.`;
|
|
21
|
+
}
|
|
22
|
+
const small = expectation.length === 0 ? smallSourceEdit(summary) : undefined;
|
|
23
|
+
if (expectation.length === 0 && source && small)
|
|
24
|
+
return preferSpecific(source, small);
|
|
25
|
+
if (expectation.length === 0 && source)
|
|
26
|
+
return source;
|
|
27
|
+
if (expectation.length === 0 && small)
|
|
28
|
+
return small;
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
function preferSpecific(source, small) {
|
|
32
|
+
const span = /use (.+) instead of /.exec(small)?.[1] ?? "";
|
|
33
|
+
const expr = /return (.+)\.$/.exec(source)?.[1] ?? "";
|
|
34
|
+
if (span && expr.includes(span) && span.length + 8 < expr.length)
|
|
35
|
+
return small;
|
|
36
|
+
return source.length <= small.length ? source : small;
|
|
37
|
+
}
|
|
38
|
+
function smallSourceEdit(summary) {
|
|
39
|
+
const edits = summary.events.filter((event) => event.kind === "edit" && !isTestFile(event.path) && Boolean(event.before) && Boolean(event.after));
|
|
40
|
+
if (edits.length !== 1)
|
|
41
|
+
return undefined;
|
|
42
|
+
const edit = edits[0];
|
|
43
|
+
if (!edit?.before || !edit.after)
|
|
44
|
+
return undefined;
|
|
45
|
+
const change = spanChange(edit.before, edit.after);
|
|
46
|
+
if (!change)
|
|
47
|
+
return undefined;
|
|
48
|
+
const extracted = sessionSentence(summary);
|
|
49
|
+
if (extracted)
|
|
50
|
+
return capitalizeFirst(extracted);
|
|
51
|
+
const sentence = `In ${edit.path}, use ${change.added} instead of ${change.removed}.`;
|
|
52
|
+
if (sentence.length > 180)
|
|
53
|
+
return undefined;
|
|
54
|
+
return sentence;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A complete sentence copied from a commit message, a failing test name, or
|
|
58
|
+
* the assistant text. Hard-wrapped lines are joined before the split, and the
|
|
59
|
+
* result is never glued to a synthesized clause.
|
|
60
|
+
*/
|
|
61
|
+
function sessionSentence(summary) {
|
|
62
|
+
const sources = [
|
|
63
|
+
...summary.events.flatMap((event) => (event.kind === "commit" && event.message ? [event.message] : [])),
|
|
64
|
+
...summary.events.flatMap((event) => (event.kind === "test" && event.failedName ? [event.failedName] : [])),
|
|
65
|
+
summary.decision,
|
|
66
|
+
];
|
|
67
|
+
for (const source of sources) {
|
|
68
|
+
const sentence = firstCompleteSentence(source);
|
|
69
|
+
if (!sentence || isStatusReason(sentence))
|
|
70
|
+
continue;
|
|
71
|
+
if (normalizeSpace(source).includes(normalizeSpace(sentence)))
|
|
72
|
+
return sentence;
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
function firstCompleteSentence(message) {
|
|
77
|
+
const unwrapped = unwrapHardBreaks(message);
|
|
78
|
+
for (const paragraph of unwrapped.split("\n")) {
|
|
79
|
+
const parts = paragraph.split(/(?<=[.!?])\s+/);
|
|
80
|
+
for (const part of parts) {
|
|
81
|
+
const sentence = part.trim();
|
|
82
|
+
if (sentence.length < 12 || sentence.length > 180)
|
|
83
|
+
continue;
|
|
84
|
+
if (normalizeSpace(unwrapped).includes(normalizeSpace(sentence)))
|
|
85
|
+
return sentence;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
/** Join a line that was wrapped in the editor. A blank line stays a paragraph break. */
|
|
91
|
+
function unwrapHardBreaks(message) {
|
|
92
|
+
return message
|
|
93
|
+
.replace(/\r\n/g, "\n")
|
|
94
|
+
.trim()
|
|
95
|
+
.split(/\n[ \t]*\n/)
|
|
96
|
+
.map((paragraph) => paragraph.replace(/[ \t]*\n[ \t]*/g, " ").replace(/[ \t]+/g, " ").trim())
|
|
97
|
+
.filter(Boolean)
|
|
98
|
+
.join("\n");
|
|
99
|
+
}
|
|
100
|
+
function normalizeSpace(value) {
|
|
101
|
+
return value.replace(/\s+/g, " ").trim();
|
|
102
|
+
}
|
|
103
|
+
function capitalizeFirst(text) {
|
|
104
|
+
const trimmed = text.trim();
|
|
105
|
+
if (!trimmed)
|
|
106
|
+
return trimmed;
|
|
107
|
+
return trimmed.charAt(0).toUpperCase() + trimmed.slice(1);
|
|
108
|
+
}
|
|
109
|
+
function isStatusReason(text) {
|
|
110
|
+
return /\b(?:tests?|suite) (?:passed|passes|failed)\b/i.test(text) || /全部通過|測試通過|edited \d+ file/i.test(text);
|
|
111
|
+
}
|
|
112
|
+
function spanChange(before, after) {
|
|
113
|
+
if (!before || !after || before === after)
|
|
114
|
+
return undefined;
|
|
115
|
+
if (before.length > 2000 || after.length > 2000)
|
|
116
|
+
return undefined;
|
|
117
|
+
let start = 0;
|
|
118
|
+
while (start < before.length && start < after.length && before[start] === after[start])
|
|
119
|
+
start += 1;
|
|
120
|
+
let endBefore = before.length;
|
|
121
|
+
let endAfter = after.length;
|
|
122
|
+
while (endBefore > start && endAfter > start && before[endBefore - 1] === after[endAfter - 1]) {
|
|
123
|
+
endBefore -= 1;
|
|
124
|
+
endAfter -= 1;
|
|
125
|
+
}
|
|
126
|
+
let removed = before.slice(start, endBefore);
|
|
127
|
+
let added = after.slice(start, endAfter);
|
|
128
|
+
if (!added && removed) {
|
|
129
|
+
const extra = /[\w.]+$/.exec(before.slice(0, start))?.[0] ?? "";
|
|
130
|
+
if (!extra)
|
|
131
|
+
return undefined;
|
|
132
|
+
removed = extra + removed;
|
|
133
|
+
added = extra;
|
|
134
|
+
}
|
|
135
|
+
else if (!removed && added) {
|
|
136
|
+
const extra = /[\w.]+$/.exec(after.slice(0, start))?.[0] ?? "";
|
|
137
|
+
if (!extra)
|
|
138
|
+
return undefined;
|
|
139
|
+
added = extra + added;
|
|
140
|
+
removed = extra;
|
|
141
|
+
}
|
|
142
|
+
removed = removed.trim();
|
|
143
|
+
added = added.trim();
|
|
144
|
+
if (!removed || !added || removed.length > 80 || added.length > 80)
|
|
145
|
+
return undefined;
|
|
146
|
+
return { removed, added };
|
|
147
|
+
}
|
|
148
|
+
function substitutionsOf(summary) {
|
|
149
|
+
const found = [];
|
|
150
|
+
for (const event of summary.events) {
|
|
151
|
+
if (event.kind === "test") {
|
|
152
|
+
for (const item of bashSubstitutions(event.command)) {
|
|
153
|
+
found.push({ file: item.file, shift: expectationShift(item.old, item.next) });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (event.kind === "edit" && event.before && event.after && isTestFile(event.path)) {
|
|
157
|
+
found.push({ file: event.path, shift: expectationShift(event.before, event.after) });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const seen = new Set();
|
|
161
|
+
return found.filter((item) => {
|
|
162
|
+
const key = `${item.file}\0${item.shift?.from}\0${item.shift?.to}\0${item.shift?.callee ?? ""}`;
|
|
163
|
+
if (seen.has(key))
|
|
164
|
+
return false;
|
|
165
|
+
seen.add(key);
|
|
166
|
+
return true;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
function expectationShift(before, after) {
|
|
170
|
+
if (!before || !after || before === after)
|
|
171
|
+
return undefined;
|
|
172
|
+
if (before.length > 2000 || after.length > 2000)
|
|
173
|
+
return undefined;
|
|
174
|
+
const skeleton = (value) => value.replace(/-?\d+(?:\.\d+)?/g, "#");
|
|
175
|
+
if (skeleton(before) !== skeleton(after))
|
|
176
|
+
return undefined;
|
|
177
|
+
const numbers = (value) => [...value.matchAll(/-?\d+(?:\.\d+)?/g)].map((match) => match[0]);
|
|
178
|
+
const left = numbers(before);
|
|
179
|
+
const right = numbers(after);
|
|
180
|
+
if (left.length === 0 || left.length !== right.length)
|
|
181
|
+
return undefined;
|
|
182
|
+
let from = "";
|
|
183
|
+
let to = "";
|
|
184
|
+
let diffs = 0;
|
|
185
|
+
for (let index = 0; index < left.length; index += 1) {
|
|
186
|
+
if (left[index] !== right[index]) {
|
|
187
|
+
diffs += 1;
|
|
188
|
+
from = left[index] ?? "";
|
|
189
|
+
to = right[index] ?? "";
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (diffs !== 1)
|
|
193
|
+
return undefined;
|
|
194
|
+
return { from, to, callee: calleeName(before) };
|
|
195
|
+
}
|
|
196
|
+
function calleeName(text) {
|
|
197
|
+
const wrapped = /(?:assert\.\w+|expect)\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\(/.exec(text);
|
|
198
|
+
if (wrapped?.[1])
|
|
199
|
+
return wrapped[1];
|
|
200
|
+
const direct = /(?:^|[^\w.])([A-Za-z_][A-Za-z0-9_]*)\s*\(/.exec(text);
|
|
201
|
+
return direct?.[1];
|
|
202
|
+
}
|
|
203
|
+
function sourceReturn(summary) {
|
|
204
|
+
const edits = summary.events.filter((event) => event.kind === "edit" && !isTestFile(event.path) && Boolean(event.before) && Boolean(event.after));
|
|
205
|
+
if (edits.length !== 1)
|
|
206
|
+
return undefined;
|
|
207
|
+
const edit = edits[0];
|
|
208
|
+
if (!edit?.before || !edit.after)
|
|
209
|
+
return undefined;
|
|
210
|
+
const before = /return\s+([^;\n]+)/.exec(edit.before);
|
|
211
|
+
const after = /return\s+([^;\n]+)/.exec(edit.after);
|
|
212
|
+
if (!before?.[1] || !after?.[1] || before[1].trim() === after[1].trim())
|
|
213
|
+
return undefined;
|
|
214
|
+
const name = /function\s+([A-Za-z_][A-Za-z0-9_]*)/.exec(edit.before)?.[1] ??
|
|
215
|
+
/(?:const|let|var)\s+([A-Za-z_][A-Za-z0-9_]*)/.exec(edit.before)?.[1];
|
|
216
|
+
const expr = after[1].trim();
|
|
217
|
+
if (!name || expr.length > 40)
|
|
218
|
+
return undefined;
|
|
219
|
+
return `Change ${name}() to return ${expr}.`;
|
|
220
|
+
}
|
|
221
|
+
function isTestFile(filePath) {
|
|
222
|
+
return /\.(?:test|spec)\.[cm]?[jt]sx?$/i.test(filePath) || /_test\.[a-z]+$/i.test(filePath);
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision.js","sourceRoot":"","sources":["../src/decision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SourceKind } from "./types.js";
|
|
2
|
+
export type SourceChoice = "auto" | "claude";
|
|
3
|
+
export interface DiscoverOptions {
|
|
4
|
+
cwd: string;
|
|
5
|
+
source: SourceChoice;
|
|
6
|
+
claudeHome: string;
|
|
7
|
+
/** Injected so tests do not need a git repository. */
|
|
8
|
+
recentFiles?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface FoundSession {
|
|
11
|
+
source: SourceKind;
|
|
12
|
+
path: string;
|
|
13
|
+
note?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class NoSessionError extends Error {
|
|
16
|
+
constructor(message: string);
|
|
17
|
+
}
|
|
18
|
+
/** Claude config dir. `CLAUDE_CONFIG_DIR` is honored when set; otherwise `~/.claude`. */
|
|
19
|
+
export declare function defaultClaudeHome(env?: NodeJS.ProcessEnv, home?: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Directory slug Claude Code uses under `projects/`.
|
|
22
|
+
* Replaces ":", "\", and "/" with "-". The encoding is lossy when the path
|
|
23
|
+
* itself contains dashes, so selection still reads the `cwd` field.
|
|
24
|
+
*/
|
|
25
|
+
export declare function claudeProjectSlug(cwd: string): string;
|
|
26
|
+
export declare function pathsRelated(leftPath: string, rightPath: string): boolean;
|
|
27
|
+
export declare function listClaudeSessions(claudeHome: string): string[];
|
|
28
|
+
export declare function selectClaudeSession(files: string[], targetCwd: string, recentFiles?: string[]): string | null;
|
|
29
|
+
export declare function findSession(options: DiscoverOptions): FoundSession;
|
|
30
|
+
export declare function gitChangedFiles(cwd: string): string[];
|
|
31
|
+
/** Read `cwd` from the head of a session file. The first record normally carries it. */
|
|
32
|
+
export declare function sniffCwd(file: string): string | undefined;
|
package/dist/discover.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { parseClaude } from "./adapters/claude.js";
|
|
6
|
+
export class NoSessionError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "NoSessionError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Claude config dir. `CLAUDE_CONFIG_DIR` is honored when set; otherwise `~/.claude`. */
|
|
13
|
+
export function defaultClaudeHome(env = process.env, home = os.homedir()) {
|
|
14
|
+
return env.CLAUDE_CONFIG_DIR || path.join(home, ".claude");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Directory slug Claude Code uses under `projects/`.
|
|
18
|
+
* Replaces ":", "\", and "/" with "-". The encoding is lossy when the path
|
|
19
|
+
* itself contains dashes, so selection still reads the `cwd` field.
|
|
20
|
+
*/
|
|
21
|
+
export function claudeProjectSlug(cwd) {
|
|
22
|
+
return path.resolve(cwd).replace(/[:\\/]/g, "-");
|
|
23
|
+
}
|
|
24
|
+
export function pathsRelated(leftPath, rightPath) {
|
|
25
|
+
const left = path.resolve(leftPath);
|
|
26
|
+
const right = path.resolve(rightPath);
|
|
27
|
+
return left === right || right.startsWith(`${left}${path.sep}`) || left.startsWith(`${right}${path.sep}`);
|
|
28
|
+
}
|
|
29
|
+
export function listClaudeSessions(claudeHome) {
|
|
30
|
+
const projects = path.join(claudeHome, "projects");
|
|
31
|
+
if (!fs.existsSync(projects))
|
|
32
|
+
return [];
|
|
33
|
+
const sessions = [];
|
|
34
|
+
let slugs;
|
|
35
|
+
try {
|
|
36
|
+
slugs = fs.readdirSync(projects, { withFileTypes: true });
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
for (const slug of slugs) {
|
|
42
|
+
if (!slug.isDirectory())
|
|
43
|
+
continue;
|
|
44
|
+
const dir = path.join(projects, slug.name);
|
|
45
|
+
let entries;
|
|
46
|
+
try {
|
|
47
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
if (!entry.isFile() || !entry.name.endsWith(".jsonl"))
|
|
54
|
+
continue;
|
|
55
|
+
sessions.push(path.join(dir, entry.name));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return sessions;
|
|
59
|
+
}
|
|
60
|
+
export function selectClaudeSession(files, targetCwd, recentFiles = []) {
|
|
61
|
+
const related = [];
|
|
62
|
+
const others = [];
|
|
63
|
+
for (const file of files) {
|
|
64
|
+
let mtime = 0;
|
|
65
|
+
try {
|
|
66
|
+
mtime = fs.statSync(file).mtimeMs;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const cwd = sniffCwd(file);
|
|
72
|
+
if (cwd && pathsRelated(cwd, targetCwd))
|
|
73
|
+
related.push({ file, mtime });
|
|
74
|
+
else
|
|
75
|
+
others.push({ file, mtime });
|
|
76
|
+
}
|
|
77
|
+
if (related.length > 0) {
|
|
78
|
+
related.sort((a, b) => b.mtime - a.mtime);
|
|
79
|
+
return related[0]?.file ?? null;
|
|
80
|
+
}
|
|
81
|
+
others.sort((a, b) => b.mtime - a.mtime);
|
|
82
|
+
let best = null;
|
|
83
|
+
for (const candidate of others.slice(0, 8)) {
|
|
84
|
+
let summary;
|
|
85
|
+
try {
|
|
86
|
+
summary = parseClaude(fs.readFileSync(candidate.file, "utf8"), path.basename(candidate.file));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const score = overlapScore(summary.files.map((file) => file.path), targetCwd, recentFiles);
|
|
92
|
+
if (score <= 0)
|
|
93
|
+
continue;
|
|
94
|
+
if (!best || score > best.score || (score === best.score && candidate.mtime > best.mtime)) {
|
|
95
|
+
best = { file: candidate.file, score, mtime: candidate.mtime };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return best?.file ?? null;
|
|
99
|
+
}
|
|
100
|
+
export function findSession(options) {
|
|
101
|
+
const recent = options.recentFiles ?? gitChangedFiles(options.cwd);
|
|
102
|
+
const claude = selectClaudeSession(listClaudeSessions(options.claudeHome), options.cwd, recent);
|
|
103
|
+
if (!claude)
|
|
104
|
+
throw new NoSessionError(missingClaude(options.cwd));
|
|
105
|
+
return { source: "claude-code", path: claude };
|
|
106
|
+
}
|
|
107
|
+
export function gitChangedFiles(cwd) {
|
|
108
|
+
const names = new Set();
|
|
109
|
+
for (const args of [
|
|
110
|
+
["diff", "--name-only", "HEAD"],
|
|
111
|
+
["diff", "--name-only", "--cached"],
|
|
112
|
+
["ls-files", "--others", "--exclude-standard"],
|
|
113
|
+
]) {
|
|
114
|
+
for (const line of gitLines(cwd, args))
|
|
115
|
+
names.add(line);
|
|
116
|
+
}
|
|
117
|
+
return [...names];
|
|
118
|
+
}
|
|
119
|
+
function gitLines(cwd, args) {
|
|
120
|
+
const result = spawnSync("git", args, { cwd, encoding: "utf8" });
|
|
121
|
+
if (result.status !== 0 || !result.stdout)
|
|
122
|
+
return [];
|
|
123
|
+
return result.stdout
|
|
124
|
+
.split("\n")
|
|
125
|
+
.map((line) => line.trim())
|
|
126
|
+
.filter(Boolean);
|
|
127
|
+
}
|
|
128
|
+
function overlapScore(paths, targetCwd, recentFiles) {
|
|
129
|
+
if (recentFiles.length === 0)
|
|
130
|
+
return 0;
|
|
131
|
+
const root = path.resolve(targetCwd);
|
|
132
|
+
let score = 0;
|
|
133
|
+
for (const filePath of paths) {
|
|
134
|
+
for (const changed of recentFiles) {
|
|
135
|
+
const changedAbs = path.resolve(root, changed);
|
|
136
|
+
const fileAbs = path.isAbsolute(filePath) ? path.resolve(filePath) : path.resolve(root, filePath);
|
|
137
|
+
if (filePath === changed || fileAbs === changedAbs || filePath.endsWith(`/${changed}`))
|
|
138
|
+
score += 1;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return score;
|
|
142
|
+
}
|
|
143
|
+
/** Read `cwd` from the head of a session file. The first record normally carries it. */
|
|
144
|
+
export function sniffCwd(file) {
|
|
145
|
+
let fd;
|
|
146
|
+
try {
|
|
147
|
+
fd = fs.openSync(file, "r");
|
|
148
|
+
const buf = Buffer.alloc(256 * 1024);
|
|
149
|
+
const count = fs.readSync(fd, buf, 0, buf.length, 0);
|
|
150
|
+
const text = buf.subarray(0, count).toString("utf8");
|
|
151
|
+
const lines = text.split(/\r?\n/);
|
|
152
|
+
if (count === buf.length)
|
|
153
|
+
lines.pop();
|
|
154
|
+
for (const line of lines) {
|
|
155
|
+
if (!line.trim())
|
|
156
|
+
continue;
|
|
157
|
+
try {
|
|
158
|
+
const record = JSON.parse(line);
|
|
159
|
+
if (typeof record.cwd === "string" && record.cwd.trim())
|
|
160
|
+
return record.cwd;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Keep scanning. Discovery must tolerate a bad line.
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
if (fd !== undefined)
|
|
172
|
+
fs.closeSync(fd);
|
|
173
|
+
}
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
function missingClaude(cwd) {
|
|
177
|
+
return `No Claude Code session for ${cwd}. Looked under the Claude projects directory for a session whose cwd matches this directory, or that edited the files git currently shows as changed. Pass --session <file.jsonl> to choose one.`;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { RedactOptions } from "./redact.js";
|
|
2
|
+
import type { SessionSummary } from "./types.js";
|
|
3
|
+
/** Locked KEY DECISION copy. The short form drops the second clause. */
|
|
4
|
+
export declare const LOCKED_DECISION = "Ship the redacted timeline; secrets stay off the PR.";
|
|
5
|
+
export interface Presented {
|
|
6
|
+
summary: SessionSummary;
|
|
7
|
+
/** True when a secret was removed from a string a reviewer might read. */
|
|
8
|
+
secretsStripped: boolean;
|
|
9
|
+
/** How many secret spans were removed. Drives the `redacted ×N` badge only. */
|
|
10
|
+
maskedCount: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Reviewer-facing copy. Sentences and shell assignments that contain a secret
|
|
14
|
+
* are deleted. Nothing is replaced with a `[REDACTED_*]` token.
|
|
15
|
+
*/
|
|
16
|
+
export declare function presentSummary(input: SessionSummary, options?: RedactOptions): Presented;
|
|
17
|
+
export declare function scrubTitle(text: string, options?: RedactOptions): string;
|
|
18
|
+
/** Drop Claude Code wrappers such as `<pasted_content id="...">...</pasted_content>`. */
|
|
19
|
+
export declare function stripPastedWrappers(text: string): string;
|
|
20
|
+
export declare function scrubProse(text: string, options?: RedactOptions): string;
|
|
21
|
+
/**
|
|
22
|
+
* A sentence whose job is to point at a private path. Drop the whole sentence
|
|
23
|
+
* so deletion does not leave "完整輸出存在 。" or "The full output is saved at ."
|
|
24
|
+
*/
|
|
25
|
+
export declare function isPathReferenceSentence(sentence: string): boolean;
|
|
26
|
+
/** Drop markdown markers and empty code spans left behind when a path was deleted. */
|
|
27
|
+
export declare function cleanDisplayMarkdown(text: string): string;
|
|
28
|
+
export declare function scrubCommand(command: string, options?: RedactOptions): string;
|