@ascenda-one/history-import 0.1.12
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/README.md +127 -0
- package/dist/cli.js +3889 -0
- package/dist/cli.js.map +1 -0
- package/dist/daySlice.js +98 -0
- package/dist/daySlice.js.map +1 -0
- package/dist/extractors/claudeCode.js +779 -0
- package/dist/extractors/claudeCode.js.map +1 -0
- package/dist/extractors/cursor.js +601 -0
- package/dist/extractors/cursor.js.map +1 -0
- package/dist/extractors/git.js +9 -0
- package/dist/extractors/git.js.map +1 -0
- package/dist/extractors/vscode.js +615 -0
- package/dist/extractors/vscode.js.map +1 -0
- package/dist/localHandoff.js +238 -0
- package/dist/localHandoff.js.map +1 -0
- package/dist/retention.js +68 -0
- package/dist/retention.js.map +1 -0
- package/dist/scan.js +220 -0
- package/dist/scan.js.map +1 -0
- package/dist/ship.js +208 -0
- package/dist/ship.js.map +1 -0
- package/dist/staging.js +121 -0
- package/dist/staging.js.map +1 -0
- package/dist/stores.js +25 -0
- package/dist/stores.js.map +1 -0
- package/dist/types.js +74 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vscode.js","sourceRoot":"","sources":["../../src/extractors/vscode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local handoff into the desktop app's sandbox container.
|
|
3
|
+
*
|
|
4
|
+
* The problem this solves: the macOS app is sandboxed and can never read
|
|
5
|
+
* `~/.claude` or `~/.ascenda`, but it CAN read its own container — and the
|
|
6
|
+
* live-presence bus already establishes the pattern of an unsandboxed
|
|
7
|
+
* collector writing into `~/Library/Containers/<bundle>/Data/.ascenda/`
|
|
8
|
+
* (see tool-kit's `liveBusSocketCandidates`). The importer writes its
|
|
9
|
+
* session digest there and the app picks it up with no entitlement, no
|
|
10
|
+
* Powerbox prompt, and no backend round-trip.
|
|
11
|
+
*
|
|
12
|
+
* Why local at all, when the events already ship to the backend: the
|
|
13
|
+
* timeline is a local-first surface, and the demand view that would
|
|
14
|
+
* otherwise carry this is Pro-gated. Historical notches are part of the
|
|
15
|
+
* free first-run experience, so they must not depend on an entitlement or
|
|
16
|
+
* on the network.
|
|
17
|
+
*
|
|
18
|
+
* This file is a TRANSFER BUFFER, not a store of record. The app copies
|
|
19
|
+
* what it needs into its own journal and may delete it afterwards; a lost
|
|
20
|
+
* or stale handoff costs a re-run of the importer, nothing more.
|
|
21
|
+
*
|
|
22
|
+
* Privacy: this file never leaves the machine, so it may carry the
|
|
23
|
+
* human-readable project label the app needs to name a notch. It still
|
|
24
|
+
* carries no prompt text, response text, or file contents — the same
|
|
25
|
+
* metrics-only rule as the wire, minus the hashing that only exists to
|
|
26
|
+
* keep paths from reaching a server.
|
|
27
|
+
*/
|
|
28
|
+
import { LOCAL_TIMEZONE } from "./daySlice.js";
|
|
29
|
+
import * as fs from "node:fs/promises";
|
|
30
|
+
import * as os from "node:os";
|
|
31
|
+
import * as path from "node:path";
|
|
32
|
+
const APP_BUNDLE_ID = "one.ascenda.ascendaMissionControl";
|
|
33
|
+
/** Schema version of the handoff file. The app must refuse a version it
|
|
34
|
+
* does not know rather than guess at fields — same rule the extractors
|
|
35
|
+
* apply to upstream stores. */
|
|
36
|
+
/**
|
|
37
|
+
* Bumped to 2 for per-day session slices (`days`, `timezone`). Additive —
|
|
38
|
+
* every schema-1 field is still written and still means what it meant — but
|
|
39
|
+
* a reader has to be able to tell a handoff that omits `days` from one whose
|
|
40
|
+
* sessions genuinely span no extra day, because the fallback for the first
|
|
41
|
+
* (place the session on its end day) would be wrong for the second.
|
|
42
|
+
*/
|
|
43
|
+
export const HANDOFF_SCHEMA = 2;
|
|
44
|
+
export function handoffDir(home = os.homedir()) {
|
|
45
|
+
return path.join(home, "Library", "Containers", APP_BUNDLE_ID, "Data", ".ascenda", "history-import");
|
|
46
|
+
}
|
|
47
|
+
/** One handoff file per store — `store` names the file (`claude_code.json`,
|
|
48
|
+
* `cursor.json`, …) so each extractor's digest lands separately and a
|
|
49
|
+
* missing/stale one never clobbers another store's. */
|
|
50
|
+
export function handoffFilePath(home = os.homedir(), store = "claude_code") {
|
|
51
|
+
return path.join(handoffDir(home), `${store}.json`);
|
|
52
|
+
}
|
|
53
|
+
/** Last path segment of a repo path — "asc-ascenda-app-workspace" from a
|
|
54
|
+
* full cwd. Falls back to the raw ref when it is already a slug. */
|
|
55
|
+
export function projectLabelOf(repoRef) {
|
|
56
|
+
if (!repoRef)
|
|
57
|
+
return null;
|
|
58
|
+
const trimmed = repoRef.replace(/\/+$/, "");
|
|
59
|
+
const segment = trimmed.split("/").filter(Boolean).pop() ?? null;
|
|
60
|
+
return segment && segment.length > 0 ? segment : null;
|
|
61
|
+
}
|
|
62
|
+
export function buildHandoff(events, extractionId, generatedAt) {
|
|
63
|
+
const sessions = [];
|
|
64
|
+
let windowOldest = null;
|
|
65
|
+
let windowNewest = null;
|
|
66
|
+
for (const event of events) {
|
|
67
|
+
if (event.eventKind === "extraction_epoch") {
|
|
68
|
+
const oldest = event.metrics.windowOldest;
|
|
69
|
+
const newest = event.metrics.windowNewest;
|
|
70
|
+
if (typeof oldest === "string")
|
|
71
|
+
windowOldest = oldest;
|
|
72
|
+
if (typeof newest === "string")
|
|
73
|
+
windowNewest = newest;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (event.eventKind !== "create_focus_session")
|
|
77
|
+
continue;
|
|
78
|
+
sessions.push({
|
|
79
|
+
at: event.occurredAt,
|
|
80
|
+
startedAt: typeof event.metrics.sessionStartedAt === "string" ? event.metrics.sessionStartedAt : null,
|
|
81
|
+
sessionRef: event.sessionRef,
|
|
82
|
+
projectLabel: projectLabelOf(event.repoRef),
|
|
83
|
+
promptCount: Number(event.metrics.promptCount ?? 0),
|
|
84
|
+
durationBucket: String(event.metrics.durationBucket ?? "unknown"),
|
|
85
|
+
afterHoursPrompts: Number(event.metrics.afterHoursPrompts ?? 0),
|
|
86
|
+
primaryModel: typeof event.metrics.primaryModel === "string" ? event.metrics.primaryModel : null,
|
|
87
|
+
activeMinutes: Number(event.metrics.activeMinutes ?? 0),
|
|
88
|
+
compactionCount: Number(event.metrics.compactionCount ?? 0),
|
|
89
|
+
toolFailureCount: Number(event.metrics.toolFailureCount ?? 0),
|
|
90
|
+
contextWindowPeakPct: Number(event.metrics.contextWindowPeakPct ?? 0),
|
|
91
|
+
userModifiedEditCount: Number(event.metrics.userModifiedEditCount ?? 0),
|
|
92
|
+
subagentTranscripts: Number(event.metrics.subagentTranscripts ?? 0),
|
|
93
|
+
days: event.dayBreakdown ?? [],
|
|
94
|
+
provenance: event.provenance
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
sessions.sort((a, b) => a.at.localeCompare(b.at));
|
|
98
|
+
return {
|
|
99
|
+
schema: HANDOFF_SCHEMA,
|
|
100
|
+
extractionId,
|
|
101
|
+
generatedAt,
|
|
102
|
+
timezone: LOCAL_TIMEZONE,
|
|
103
|
+
store: "claude_code",
|
|
104
|
+
windowOldest,
|
|
105
|
+
windowNewest,
|
|
106
|
+
sessions
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export function buildCursorHandoff(events, extractionId, generatedAt) {
|
|
110
|
+
const sessions = [];
|
|
111
|
+
let windowOldest = null;
|
|
112
|
+
let windowNewest = null;
|
|
113
|
+
for (const event of events) {
|
|
114
|
+
if (event.eventKind === "extraction_epoch") {
|
|
115
|
+
const oldest = event.metrics.windowOldest;
|
|
116
|
+
const newest = event.metrics.windowNewest;
|
|
117
|
+
if (typeof oldest === "string")
|
|
118
|
+
windowOldest = oldest;
|
|
119
|
+
if (typeof newest === "string")
|
|
120
|
+
windowNewest = newest;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (event.eventKind !== "create_focus_session")
|
|
124
|
+
continue;
|
|
125
|
+
sessions.push({
|
|
126
|
+
at: event.occurredAt,
|
|
127
|
+
startedAt: typeof event.metrics.sessionStartedAt === "string" ? event.metrics.sessionStartedAt : null,
|
|
128
|
+
sessionRef: event.sessionRef,
|
|
129
|
+
projectLabel: projectLabelOf(event.repoRef),
|
|
130
|
+
promptCount: Number(event.metrics.promptCount ?? 0),
|
|
131
|
+
durationBucket: String(event.metrics.durationBucket ?? "unknown"),
|
|
132
|
+
afterHoursPrompts: Number(event.metrics.afterHoursPrompts ?? 0),
|
|
133
|
+
primaryModel: typeof event.metrics.primaryModel === "string" ? event.metrics.primaryModel : null,
|
|
134
|
+
linesAdded: Number(event.metrics.linesAdded ?? 0),
|
|
135
|
+
linesRemoved: Number(event.metrics.linesRemoved ?? 0),
|
|
136
|
+
filesChangedCount: Number(event.metrics.filesChangedCount ?? 0),
|
|
137
|
+
contextUsagePercent: typeof event.metrics.contextUsagePercent === "number" ? event.metrics.contextUsagePercent : null,
|
|
138
|
+
humanChangesCount: Number(event.metrics.humanChangesCount ?? 0),
|
|
139
|
+
approximateLintErrorsCount: Number(event.metrics.approximateLintErrorsCount ?? 0),
|
|
140
|
+
subagentComposers: Number(event.metrics.subagentComposers ?? 0),
|
|
141
|
+
days: event.dayBreakdown ?? [],
|
|
142
|
+
provenance: event.provenance
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
sessions.sort((a, b) => a.at.localeCompare(b.at));
|
|
146
|
+
return {
|
|
147
|
+
schema: HANDOFF_SCHEMA,
|
|
148
|
+
extractionId,
|
|
149
|
+
generatedAt,
|
|
150
|
+
timezone: LOCAL_TIMEZONE,
|
|
151
|
+
store: "cursor",
|
|
152
|
+
windowOldest,
|
|
153
|
+
windowNewest,
|
|
154
|
+
sessions
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export function buildVsCodeHandoff(events, extractionId, generatedAt) {
|
|
158
|
+
const editDays = [];
|
|
159
|
+
const chatSessions = [];
|
|
160
|
+
let windowOldest = null;
|
|
161
|
+
let windowNewest = null;
|
|
162
|
+
for (const event of events) {
|
|
163
|
+
if (event.eventKind === "extraction_epoch") {
|
|
164
|
+
const oldest = event.metrics.windowOldest;
|
|
165
|
+
const newest = event.metrics.windowNewest;
|
|
166
|
+
if (typeof oldest === "string")
|
|
167
|
+
windowOldest = oldest;
|
|
168
|
+
if (typeof newest === "string")
|
|
169
|
+
windowNewest = newest;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (event.eventKind === "editor_activity") {
|
|
173
|
+
editDays.push({
|
|
174
|
+
date: typeof event.metrics.date === "string" ? event.metrics.date : event.occurredAt.slice(0, 10),
|
|
175
|
+
projectLabel: projectLabelOf(event.repoRef),
|
|
176
|
+
chatEditCount: Number(event.metrics.chatEditCount ?? 0),
|
|
177
|
+
totalEntryCount: Number(event.metrics.totalEntryCount ?? 0),
|
|
178
|
+
provenance: event.provenance
|
|
179
|
+
});
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (event.eventKind !== "create_focus_session")
|
|
183
|
+
continue;
|
|
184
|
+
chatSessions.push({
|
|
185
|
+
at: event.occurredAt,
|
|
186
|
+
startedAt: typeof event.metrics.sessionStartedAt === "string" ? event.metrics.sessionStartedAt : null,
|
|
187
|
+
sessionRef: event.sessionRef,
|
|
188
|
+
projectLabel: projectLabelOf(event.repoRef),
|
|
189
|
+
requestCount: Number(event.metrics.requestCount ?? 0),
|
|
190
|
+
durationBucket: String(event.metrics.durationBucket ?? "unknown"),
|
|
191
|
+
afterHoursRequests: Number(event.metrics.afterHoursRequests ?? 0),
|
|
192
|
+
primaryModel: typeof event.metrics.primaryModel === "string" ? event.metrics.primaryModel : null,
|
|
193
|
+
canceledCount: Number(event.metrics.canceledCount ?? 0),
|
|
194
|
+
errorCount: Number(event.metrics.errorCount ?? 0),
|
|
195
|
+
days: event.dayBreakdown ?? [],
|
|
196
|
+
provenance: event.provenance
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
editDays.sort((a, b) => a.date.localeCompare(b.date) || (a.projectLabel ?? "").localeCompare(b.projectLabel ?? ""));
|
|
200
|
+
chatSessions.sort((a, b) => a.at.localeCompare(b.at));
|
|
201
|
+
return {
|
|
202
|
+
schema: HANDOFF_SCHEMA,
|
|
203
|
+
extractionId,
|
|
204
|
+
generatedAt,
|
|
205
|
+
timezone: LOCAL_TIMEZONE,
|
|
206
|
+
store: "vscode",
|
|
207
|
+
windowOldest,
|
|
208
|
+
windowNewest,
|
|
209
|
+
editDays,
|
|
210
|
+
chatSessions
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Write the handoff atomically: the app may be reading this file at any
|
|
215
|
+
* moment, and a half-written JSON document is indistinguishable from a
|
|
216
|
+
* corrupt one. Write-then-rename makes the swap atomic on the same volume.
|
|
217
|
+
*
|
|
218
|
+
* Returns null (rather than throwing) when the container does not exist —
|
|
219
|
+
* the app simply is not installed, which is a normal state for a CLI that
|
|
220
|
+
* also serves people who only ship to the backend.
|
|
221
|
+
*/
|
|
222
|
+
export async function writeHandoff(handoff, home = os.homedir()) {
|
|
223
|
+
const containerRoot = path.join(home, "Library", "Containers", APP_BUNDLE_ID, "Data");
|
|
224
|
+
try {
|
|
225
|
+
await fs.stat(containerRoot);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
const dir = handoffDir(home);
|
|
231
|
+
await fs.mkdir(dir, { recursive: true });
|
|
232
|
+
const target = handoffFilePath(home, handoff.store);
|
|
233
|
+
const temp = `${target}.tmp`;
|
|
234
|
+
await fs.writeFile(temp, JSON.stringify(handoff, null, 2) + "\n", "utf8");
|
|
235
|
+
await fs.rename(temp, target);
|
|
236
|
+
return target;
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=localHandoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localHandoff.js","sourceRoot":"","sources":["../src/localHandoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Stop the bleeding at install."
|
|
3
|
+
*
|
|
4
|
+
* Two settings on the user's machine decide whether the historical window
|
|
5
|
+
* keeps shrinking after Flow arrives. Both changes are proposed as data
|
|
6
|
+
* first (so the consent surface can show exactly what would change) and
|
|
7
|
+
* applied only by an explicit second call — the importer never modifies a
|
|
8
|
+
* user's config as a side effect of scanning or extracting.
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from "node:fs/promises";
|
|
11
|
+
/** High enough to stop the purge mattering, finite so we are not writing
|
|
12
|
+
* "never delete" into someone's config unasked. */
|
|
13
|
+
export const PROPOSED_CLEANUP_PERIOD_DAYS = 3650;
|
|
14
|
+
export async function planClaudeRetentionFix(paths) {
|
|
15
|
+
let current = null;
|
|
16
|
+
try {
|
|
17
|
+
const settings = JSON.parse(await fs.readFile(paths.claudeSettings, "utf8"));
|
|
18
|
+
if (typeof settings.cleanupPeriodDays === "number")
|
|
19
|
+
current = settings.cleanupPeriodDays;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Missing or unreadable settings file — the 30-day default is live.
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
settingsPath: paths.claudeSettings,
|
|
26
|
+
currentCleanupPeriodDays: current,
|
|
27
|
+
proposedCleanupPeriodDays: PROPOSED_CLEANUP_PERIOD_DAYS,
|
|
28
|
+
changeNeeded: current === null || current < PROPOSED_CLEANUP_PERIOD_DAYS
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Apply the plan by MERGING into the existing settings — `settings.json`
|
|
33
|
+
* holds the user's whole Claude Code configuration, and clobbering it to set
|
|
34
|
+
* one key would be a far worse outcome than the purge we are preventing. If
|
|
35
|
+
* the file exists but does not parse, refuse: overwriting something we could
|
|
36
|
+
* not read is exactly the mistake the merge rule exists to prevent.
|
|
37
|
+
*/
|
|
38
|
+
export async function applyClaudeRetentionFix(plan) {
|
|
39
|
+
if (!plan.changeNeeded)
|
|
40
|
+
return;
|
|
41
|
+
let settings = {};
|
|
42
|
+
let raw = null;
|
|
43
|
+
try {
|
|
44
|
+
raw = await fs.readFile(plan.settingsPath, "utf8");
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// No file yet — we create one holding only our key.
|
|
48
|
+
}
|
|
49
|
+
if (raw !== null) {
|
|
50
|
+
try {
|
|
51
|
+
settings = JSON.parse(raw);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new Error(`${plan.settingsPath} exists but is not valid JSON — refusing to overwrite it`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
settings.cleanupPeriodDays = plan.proposedCleanupPeriodDays;
|
|
58
|
+
await fs.writeFile(plan.settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf8");
|
|
59
|
+
}
|
|
60
|
+
/** The zsh side: `EXTENDED_HISTORY` makes shell history timestamped from now
|
|
61
|
+
* on — purely prospective, but the scan's "no timestamps" note is the reason
|
|
62
|
+
* to offer it. Left as a plan-only stub: appending to a user's .zshrc has
|
|
63
|
+
* enough sharp edges (which rc file, oh-my-zsh, symlinks) that it warrants
|
|
64
|
+
* its own careful implementation, not a scaffold one. */
|
|
65
|
+
export function zshExtendedHistorySnippet() {
|
|
66
|
+
return "setopt EXTENDED_HISTORY # Ascenda: timestamp shell history";
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../src/retention.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGvC;mDACmD;AACnD,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAUjD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAiB;IAC5D,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7E,IAAI,OAAO,QAAQ,CAAC,iBAAiB,KAAK,QAAQ;YAAE,OAAO,GAAG,QAAQ,CAAC,iBAAiB,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;IACtE,CAAC;IACD,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,cAAc;QAClC,wBAAwB,EAAE,OAAO;QACjC,yBAAyB,EAAE,4BAA4B;QACvD,YAAY,EAAE,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,4BAA4B;KACzE,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAyB;IACrE,IAAI,CAAC,IAAI,CAAC,YAAY;QAAE,OAAO;IAC/B,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,GAAG,GAAkB,IAAI,CAAC;IAC9B,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,CAAC,YAAY,0DAA0D,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IACD,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1F,CAAC;AAED;;;;yDAIyD;AACzD,MAAM,UAAU,yBAAyB;IACvC,OAAO,6DAA6D,CAAC;AACvE,CAAC"}
|
package/dist/scan.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store inventory without parsing content.
|
|
3
|
+
*
|
|
4
|
+
* `scan` is what the onboarding surface shows the user BEFORE asking for
|
|
5
|
+
* consent — "here is what exists, how deep it goes, and what is evaporating".
|
|
6
|
+
* It must therefore be cheap, read-only, and must not open a single record's
|
|
7
|
+
* content: counts, file timestamps and sizes only. Anything that reads inside
|
|
8
|
+
* a record belongs to `extract`, behind consent.
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from "node:fs/promises";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { execFile } from "node:child_process";
|
|
13
|
+
import { promisify } from "node:util";
|
|
14
|
+
const execFileAsync = promisify(execFile);
|
|
15
|
+
async function statOrNull(p) {
|
|
16
|
+
try {
|
|
17
|
+
return await fs.stat(p);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Tracks a min/max mtime window as files are visited. */
|
|
24
|
+
class Window {
|
|
25
|
+
oldest = null;
|
|
26
|
+
newest = null;
|
|
27
|
+
see(d) {
|
|
28
|
+
if (!this.oldest || d < this.oldest)
|
|
29
|
+
this.oldest = d;
|
|
30
|
+
if (!this.newest || d > this.newest)
|
|
31
|
+
this.newest = d;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function scanClaudeCode(paths) {
|
|
35
|
+
const inv = {
|
|
36
|
+
store: "claude_code",
|
|
37
|
+
rootPath: paths.claudeProjects,
|
|
38
|
+
present: false,
|
|
39
|
+
counts: {},
|
|
40
|
+
notes: []
|
|
41
|
+
};
|
|
42
|
+
const root = await statOrNull(paths.claudeProjects);
|
|
43
|
+
if (!root)
|
|
44
|
+
return inv;
|
|
45
|
+
inv.present = true;
|
|
46
|
+
const window = new Window();
|
|
47
|
+
let transcripts = 0;
|
|
48
|
+
let bytes = 0;
|
|
49
|
+
const projects = await fs.readdir(paths.claudeProjects, { withFileTypes: true });
|
|
50
|
+
for (const project of projects) {
|
|
51
|
+
if (!project.isDirectory())
|
|
52
|
+
continue;
|
|
53
|
+
const dir = path.join(paths.claudeProjects, project.name);
|
|
54
|
+
for (const entry of await fs.readdir(dir)) {
|
|
55
|
+
if (!entry.endsWith(".jsonl"))
|
|
56
|
+
continue;
|
|
57
|
+
const st = await statOrNull(path.join(dir, entry));
|
|
58
|
+
if (!st)
|
|
59
|
+
continue;
|
|
60
|
+
transcripts += 1;
|
|
61
|
+
bytes += st.size;
|
|
62
|
+
window.see(st.mtime);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
inv.counts = { projects: projects.length, transcripts, bytes };
|
|
66
|
+
inv.oldest = window.oldest?.toISOString();
|
|
67
|
+
inv.newest = window.newest?.toISOString();
|
|
68
|
+
// The purge is the reason this store scans (and later extracts) first. A
|
|
69
|
+
// missing cleanupPeriodDays means the 30-day default is live, and the
|
|
70
|
+
// oldest-transcript date shows exactly how short the window already is.
|
|
71
|
+
let cleanupPeriodDays = null;
|
|
72
|
+
try {
|
|
73
|
+
const settings = JSON.parse(await fs.readFile(paths.claudeSettings, "utf8"));
|
|
74
|
+
if (typeof settings.cleanupPeriodDays === "number") {
|
|
75
|
+
cleanupPeriodDays = settings.cleanupPeriodDays;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// No settings file, or unreadable JSON — same consequence: default purge.
|
|
80
|
+
}
|
|
81
|
+
if (cleanupPeriodDays === null || cleanupPeriodDays <= 30) {
|
|
82
|
+
inv.retentionRisk = `rolling purge active (cleanupPeriodDays: ${cleanupPeriodDays ?? "30 by default"}) — the oldest transcript is deleted daily`;
|
|
83
|
+
}
|
|
84
|
+
return inv;
|
|
85
|
+
}
|
|
86
|
+
export async function scanCursor(paths) {
|
|
87
|
+
const inv = {
|
|
88
|
+
store: "cursor",
|
|
89
|
+
rootPath: paths.cursorStateDb,
|
|
90
|
+
present: false,
|
|
91
|
+
counts: {},
|
|
92
|
+
notes: []
|
|
93
|
+
};
|
|
94
|
+
const st = await statOrNull(paths.cursorStateDb);
|
|
95
|
+
if (!st)
|
|
96
|
+
return inv;
|
|
97
|
+
inv.present = true;
|
|
98
|
+
inv.counts = { bytes: st.size };
|
|
99
|
+
inv.newest = st.mtime.toISOString();
|
|
100
|
+
// Counting rows needs SQLite, but the scan must not add a native dependency
|
|
101
|
+
// for it — macOS ships /usr/bin/sqlite3, and `immutable=1` keeps a WAL-mode
|
|
102
|
+
// db safe to read while Cursor is running. If the binary or the query
|
|
103
|
+
// fails, the scan degrades to file facts rather than failing the inventory.
|
|
104
|
+
try {
|
|
105
|
+
const uri = `file:${paths.cursorStateDb}?mode=ro&immutable=1`;
|
|
106
|
+
const { stdout } = await execFileAsync("sqlite3", [
|
|
107
|
+
uri,
|
|
108
|
+
"SELECT " +
|
|
109
|
+
"(SELECT count(*) FROM cursorDiskKV WHERE key LIKE 'composerData:%'), " +
|
|
110
|
+
"(SELECT count(*) FROM cursorDiskKV WHERE key LIKE 'bubbleId:%');"
|
|
111
|
+
]);
|
|
112
|
+
const [conversations, bubbles] = stdout.trim().split("|").map(Number);
|
|
113
|
+
if (Number.isFinite(conversations))
|
|
114
|
+
inv.counts.conversations = conversations;
|
|
115
|
+
if (Number.isFinite(bubbles))
|
|
116
|
+
inv.counts.bubbles = bubbles;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
inv.notes.push(`row counts unavailable (${error instanceof Error ? error.message.split("\n")[0] : "sqlite3 failed"}); file-level facts only`);
|
|
120
|
+
}
|
|
121
|
+
return inv;
|
|
122
|
+
}
|
|
123
|
+
export async function scanVsCode(paths) {
|
|
124
|
+
const inv = {
|
|
125
|
+
store: "vscode",
|
|
126
|
+
rootPath: paths.vscodeHistory,
|
|
127
|
+
present: false,
|
|
128
|
+
counts: {},
|
|
129
|
+
notes: []
|
|
130
|
+
};
|
|
131
|
+
const root = await statOrNull(paths.vscodeHistory);
|
|
132
|
+
if (root) {
|
|
133
|
+
inv.present = true;
|
|
134
|
+
const window = new Window();
|
|
135
|
+
let fileHistories = 0;
|
|
136
|
+
for (const entry of await fs.readdir(paths.vscodeHistory, { withFileTypes: true })) {
|
|
137
|
+
if (!entry.isDirectory())
|
|
138
|
+
continue;
|
|
139
|
+
fileHistories += 1;
|
|
140
|
+
const st = await statOrNull(path.join(paths.vscodeHistory, entry.name));
|
|
141
|
+
if (st)
|
|
142
|
+
window.see(st.mtime);
|
|
143
|
+
}
|
|
144
|
+
inv.counts.fileHistories = fileHistories;
|
|
145
|
+
inv.oldest = window.oldest?.toISOString();
|
|
146
|
+
inv.newest = window.newest?.toISOString();
|
|
147
|
+
}
|
|
148
|
+
// Copilot chat sessions live under a different root; count them into the
|
|
149
|
+
// same inventory since they ship in the same extractor.
|
|
150
|
+
let chatSessions = 0;
|
|
151
|
+
const wsRoot = await statOrNull(paths.vscodeWorkspaceStorage);
|
|
152
|
+
if (wsRoot) {
|
|
153
|
+
inv.present = true;
|
|
154
|
+
for (const ws of await fs.readdir(paths.vscodeWorkspaceStorage, { withFileTypes: true })) {
|
|
155
|
+
if (!ws.isDirectory())
|
|
156
|
+
continue;
|
|
157
|
+
const sessions = path.join(paths.vscodeWorkspaceStorage, ws.name, "chatSessions");
|
|
158
|
+
try {
|
|
159
|
+
chatSessions += (await fs.readdir(sessions)).filter((f) => f.endsWith(".json")).length;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Most workspaces have no chatSessions dir; absence is the norm.
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
inv.counts.chatSessions = chatSessions;
|
|
167
|
+
return inv;
|
|
168
|
+
}
|
|
169
|
+
export async function scanGit(paths) {
|
|
170
|
+
const inv = {
|
|
171
|
+
store: "git",
|
|
172
|
+
rootPath: paths.devRoot,
|
|
173
|
+
present: false,
|
|
174
|
+
counts: {},
|
|
175
|
+
notes: ["the only fully durable, fully supported source — the spine other stores hang off"]
|
|
176
|
+
};
|
|
177
|
+
const root = await statOrNull(paths.devRoot);
|
|
178
|
+
if (!root)
|
|
179
|
+
return inv;
|
|
180
|
+
inv.present = true;
|
|
181
|
+
// Two levels deep matches the ~/Dev/<org>/<repo> and ~/Dev/<repo> layouts
|
|
182
|
+
// without walking the world. Deeper nesting is a config concern, not a
|
|
183
|
+
// scan concern.
|
|
184
|
+
let repos = 0;
|
|
185
|
+
const level1 = await fs.readdir(paths.devRoot, { withFileTypes: true });
|
|
186
|
+
for (const entry of level1) {
|
|
187
|
+
if (!entry.isDirectory())
|
|
188
|
+
continue;
|
|
189
|
+
const dir = path.join(paths.devRoot, entry.name);
|
|
190
|
+
if (await statOrNull(path.join(dir, ".git"))) {
|
|
191
|
+
repos += 1;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
let nested = [];
|
|
195
|
+
try {
|
|
196
|
+
nested = await fs.readdir(dir, { withFileTypes: true });
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
for (const sub of nested) {
|
|
202
|
+
if (!sub.isDirectory())
|
|
203
|
+
continue;
|
|
204
|
+
if (await statOrNull(path.join(dir, sub.name, ".git")))
|
|
205
|
+
repos += 1;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
inv.counts.repos = repos;
|
|
209
|
+
return inv;
|
|
210
|
+
}
|
|
211
|
+
export async function scanAll(paths) {
|
|
212
|
+
// Report order is evaporation order — the same order extraction runs in.
|
|
213
|
+
return [
|
|
214
|
+
await scanClaudeCode(paths),
|
|
215
|
+
await scanCursor(paths),
|
|
216
|
+
await scanVsCode(paths),
|
|
217
|
+
await scanGit(paths)
|
|
218
|
+
];
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=scan.js.map
|
package/dist/scan.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|