@supersession/sup 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/cli.js +95 -37
- package/dist/cli.js.map +1 -1
- package/dist/cloud.d.ts +11 -1
- package/dist/cloud.js +6 -1
- package/dist/cloud.js.map +1 -1
- package/dist/config.js +25 -13
- package/dist/config.js.map +1 -1
- package/dist/discover.d.ts +19 -1
- package/dist/discover.js +90 -3
- package/dist/discover.js.map +1 -1
- package/dist/distill/template.d.ts +9 -0
- package/dist/distill/template.js +16 -0
- package/dist/distill/template.js.map +1 -1
- package/dist/engine.d.ts +1 -1
- package/dist/engine.js +5 -6
- package/dist/engine.js.map +1 -1
- package/dist/facts.d.ts +24 -0
- package/dist/facts.js +56 -0
- package/dist/facts.js.map +1 -0
- package/dist/greeting.d.ts +5 -0
- package/dist/greeting.js +38 -0
- package/dist/greeting.js.map +1 -0
- package/dist/nsf.d.ts +2 -0
- package/dist/parsers/codex.d.ts +25 -0
- package/dist/parsers/codex.js +212 -0
- package/dist/parsers/codex.js.map +1 -0
- package/dist/parsers/cursor.d.ts +33 -0
- package/dist/parsers/cursor.js +224 -0
- package/dist/parsers/cursor.js.map +1 -0
- package/dist/redact.d.ts +12 -0
- package/dist/redact.js +15 -0
- package/dist/redact.js.map +1 -1
- package/dist/tools.js +31 -1
- package/dist/tools.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor parser: global state.vscdb (SQLite) -> NSF.
|
|
3
|
+
*
|
|
4
|
+
* Grounded in the REAL on-disk schema (verified 2026-07-15 against a live
|
|
5
|
+
* Cursor install), not a guess:
|
|
6
|
+
* - DB: <appdata>/Cursor/User/globalStorage/state.vscdb
|
|
7
|
+
* - Table `composerHeaders` (composerId, workspaceId, lastUpdatedAt,
|
|
8
|
+
* isSubagent, recency, value JSON) — value carries `name` (the chat title),
|
|
9
|
+
* `workspaceIdentifier.uri.fsPath` (cwd) and `trackedGitRepos[].branches`.
|
|
10
|
+
* - Table `cursorDiskKV`:
|
|
11
|
+
* key `composerData:<composerId>` -> { fullConversationHeadersOnly:
|
|
12
|
+
* [{bubbleId, type}] } — the ordered conversation.
|
|
13
|
+
* key `bubbleId:<composerId>:<bubbleId>` -> the message:
|
|
14
|
+
* { type: 1(user)|2(assistant), text, createdAt (ISO),
|
|
15
|
+
* toolFormerData?: { name, rawArgs, status } }.
|
|
16
|
+
*
|
|
17
|
+
* Uses node:sqlite (built-in, Node >= 22.5) — read-only, no native deps. The
|
|
18
|
+
* DB can be multi-GB, so bubbles are fetched by key, never table-scanned.
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync } from "node:fs";
|
|
21
|
+
import { createRequire } from "node:module";
|
|
22
|
+
import { homedir, platform } from "node:os";
|
|
23
|
+
import { join } from "node:path";
|
|
24
|
+
import { NSF_VERSION } from "../nsf.js";
|
|
25
|
+
export const CURSOR_TOOL_ID = "cursor";
|
|
26
|
+
export function cursorDbPath() {
|
|
27
|
+
const base = platform() === "darwin"
|
|
28
|
+
? join(homedir(), "Library", "Application Support")
|
|
29
|
+
: platform() === "win32"
|
|
30
|
+
? (process.env.APPDATA ?? join(homedir(), "AppData", "Roaming"))
|
|
31
|
+
: (process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"));
|
|
32
|
+
return join(base, "Cursor", "User", "globalStorage", "state.vscdb");
|
|
33
|
+
}
|
|
34
|
+
// node:sqlite is the whole reason this parser has zero dependencies, but it
|
|
35
|
+
// needs Node >= 22.5. Loaded lazily so the rest of sup works on older Nodes.
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
function openDb(path) {
|
|
38
|
+
let sqlite;
|
|
39
|
+
try {
|
|
40
|
+
sqlite = createRequire(import.meta.url)("node:sqlite");
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new Error("Reading Cursor sessions needs Node 22.5+ (built-in node:sqlite).");
|
|
44
|
+
}
|
|
45
|
+
return new sqlite.DatabaseSync(path, { readOnly: true });
|
|
46
|
+
}
|
|
47
|
+
function parseHeaderRow(row) {
|
|
48
|
+
try {
|
|
49
|
+
const v = JSON.parse(row.value);
|
|
50
|
+
if (v.isDraft)
|
|
51
|
+
return undefined;
|
|
52
|
+
const branches = v.trackedGitRepos?.[0]?.branches ?? [];
|
|
53
|
+
const branch = branches.reduce((best, b) => ((b.lastInteractionAt ?? 0) > (best?.lastInteractionAt ?? -1) ? b : best), undefined)?.branchName;
|
|
54
|
+
return {
|
|
55
|
+
composerId: row.composerId,
|
|
56
|
+
lastUpdatedAt: row.lastUpdatedAt,
|
|
57
|
+
name: v.name,
|
|
58
|
+
fsPath: v.workspaceIdentifier?.uri?.fsPath ?? v.trackedGitRepos?.[0]?.repoPath,
|
|
59
|
+
branch,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Newest non-subagent Cursor conversation for a working directory, if any. */
|
|
67
|
+
export function findCursorComposer(cwd) {
|
|
68
|
+
const dbPath = cursorDbPath();
|
|
69
|
+
if (!existsSync(dbPath))
|
|
70
|
+
return undefined;
|
|
71
|
+
let db;
|
|
72
|
+
try {
|
|
73
|
+
db = openDb(dbPath);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return undefined; // old Node or locked DB — discovery degrades gracefully
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const rows = db
|
|
80
|
+
.prepare(`SELECT composerId, lastUpdatedAt, value FROM composerHeaders
|
|
81
|
+
WHERE isSubagent = 0 ORDER BY recency DESC LIMIT 200`)
|
|
82
|
+
.all();
|
|
83
|
+
for (const row of rows) {
|
|
84
|
+
const h = parseHeaderRow(row);
|
|
85
|
+
if (h?.fsPath === cwd)
|
|
86
|
+
return { composerId: h.composerId, mtimeMs: h.lastUpdatedAt };
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
db.close();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Map a Cursor tool name (e.g. "read_file_v2", "ripgrep_raw_search") to NSF. */
|
|
95
|
+
function normalizeCursorTool(name) {
|
|
96
|
+
if (/terminal|shell|command|exec/.test(name))
|
|
97
|
+
return "run";
|
|
98
|
+
if (/edit|apply|write|create|replace/.test(name))
|
|
99
|
+
return "edit";
|
|
100
|
+
if (/read|view|open/.test(name))
|
|
101
|
+
return "read";
|
|
102
|
+
if (/search|grep|glob|codebase|list_dir|ripgrep/.test(name))
|
|
103
|
+
return "search";
|
|
104
|
+
return "other";
|
|
105
|
+
}
|
|
106
|
+
function actionFrom(tfd) {
|
|
107
|
+
const rawName = typeof tfd.name === "string" ? tfd.name : "unknown";
|
|
108
|
+
let path;
|
|
109
|
+
let command;
|
|
110
|
+
const rawArgs = tfd.rawArgs ?? tfd.params;
|
|
111
|
+
if (typeof rawArgs === "string") {
|
|
112
|
+
try {
|
|
113
|
+
const a = JSON.parse(rawArgs);
|
|
114
|
+
const p = a.path ?? a.targetFile ?? a.target_file ?? a.file_path;
|
|
115
|
+
path = typeof p === "string" ? p : undefined;
|
|
116
|
+
command = typeof a.command === "string" ? a.command : undefined;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// unparseable args — the tool name alone is still signal
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
kind: normalizeCursorTool(rawName),
|
|
124
|
+
rawName,
|
|
125
|
+
path,
|
|
126
|
+
command,
|
|
127
|
+
failed: tfd.status === "error" ? true : undefined,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Parse one Cursor conversation into NSF.
|
|
132
|
+
* @param dbPath absolute path to Cursor's global state.vscdb
|
|
133
|
+
* @param composerId the conversation to parse (from findCursorComposer)
|
|
134
|
+
*/
|
|
135
|
+
export function parseCursor(dbPath, composerId) {
|
|
136
|
+
const db = openDb(dbPath);
|
|
137
|
+
try {
|
|
138
|
+
const kv = db.prepare(`SELECT value FROM cursorDiskKV WHERE key = ?`);
|
|
139
|
+
const header = db
|
|
140
|
+
.prepare(`SELECT composerId, lastUpdatedAt, value FROM composerHeaders WHERE composerId = ?`)
|
|
141
|
+
.get(composerId);
|
|
142
|
+
const head = header ? parseHeaderRow(header) : undefined;
|
|
143
|
+
const dataRow = kv.get(`composerData:${composerId}`);
|
|
144
|
+
if (!dataRow)
|
|
145
|
+
throw new Error(`Cursor conversation ${composerId} not found in ${dbPath}`);
|
|
146
|
+
const data = JSON.parse(dataRow.value);
|
|
147
|
+
const order = data.fullConversationHeadersOnly ?? [];
|
|
148
|
+
const turns = [];
|
|
149
|
+
const filesSeen = new Set();
|
|
150
|
+
const filesOrdered = [];
|
|
151
|
+
const gapCounts = new Map();
|
|
152
|
+
const addGap = (reason) => gapCounts.set(reason, (gapCounts.get(reason) ?? 0) + 1);
|
|
153
|
+
let rawBytes = 0;
|
|
154
|
+
for (const { bubbleId } of order) {
|
|
155
|
+
const row = kv.get(`bubbleId:${composerId}:${bubbleId}`);
|
|
156
|
+
if (!row) {
|
|
157
|
+
addGap("missing bubble record");
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
rawBytes += row.value.length;
|
|
161
|
+
let bubble;
|
|
162
|
+
try {
|
|
163
|
+
bubble = JSON.parse(row.value);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
addGap("unparseable bubble");
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const role = bubble.type === 1 ? "user" : bubble.type === 2 ? "assistant" : undefined;
|
|
170
|
+
if (!role) {
|
|
171
|
+
addGap("bubble with unknown type");
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const text = (bubble.text ?? "").trim();
|
|
175
|
+
const actions = [];
|
|
176
|
+
if (bubble.toolFormerData && typeof bubble.toolFormerData === "object") {
|
|
177
|
+
const a = actionFrom(bubble.toolFormerData);
|
|
178
|
+
actions.push(a);
|
|
179
|
+
if (a.path && !filesSeen.has(a.path)) {
|
|
180
|
+
filesSeen.add(a.path);
|
|
181
|
+
filesOrdered.push(a.path);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (!text && actions.length === 0) {
|
|
185
|
+
addGap("empty turn");
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
// Cursor stores each tool call as its own assistant bubble; fold
|
|
189
|
+
// consecutive action-only bubbles into the previous assistant turn so
|
|
190
|
+
// NSF reads as conversation, not a tool ledger.
|
|
191
|
+
const prev = turns[turns.length - 1];
|
|
192
|
+
if (role === "assistant" && !text && prev?.role === "assistant") {
|
|
193
|
+
prev.actions.push(...actions);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
turns.push({
|
|
197
|
+
role,
|
|
198
|
+
text,
|
|
199
|
+
actions,
|
|
200
|
+
timestamp: bubble.createdAt ? Date.parse(bubble.createdAt) : undefined,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
const gaps = [...gapCounts.entries()].map(([reason, count]) => ({ reason, count }));
|
|
204
|
+
return {
|
|
205
|
+
nsfVersion: NSF_VERSION,
|
|
206
|
+
provenance: {
|
|
207
|
+
tool: CURSOR_TOOL_ID,
|
|
208
|
+
sessionId: composerId,
|
|
209
|
+
title: head?.name,
|
|
210
|
+
cwd: head?.fsPath,
|
|
211
|
+
gitBranch: head?.branch,
|
|
212
|
+
rawBytes,
|
|
213
|
+
compactions: 0,
|
|
214
|
+
},
|
|
215
|
+
turns,
|
|
216
|
+
filesTouched: filesOrdered,
|
|
217
|
+
gaps,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
db.close();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/parsers/cursor.ts"],"names":[],"mappings":"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"}
|
package/dist/redact.d.ts
CHANGED
|
@@ -14,6 +14,18 @@ export interface RedactionResult {
|
|
|
14
14
|
}
|
|
15
15
|
/** Redact a single string. Returns the cleaned text and how many hits fired. */
|
|
16
16
|
export declare function redactText(input: string): RedactionResult;
|
|
17
|
+
export interface SecretHit {
|
|
18
|
+
/** Rule that fired, e.g. "github-token". */
|
|
19
|
+
name: string;
|
|
20
|
+
/** The actual matched value. LOCAL USE ONLY — never uploaded or written. */
|
|
21
|
+
value: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Find (don't remove) secrets in a string. Same rules as redactText, opposite
|
|
25
|
+
* output: `sup facts` uses this to surface credentials locally so nobody
|
|
26
|
+
* scrolls a 4-hour transcript hunting for the test password the AI generated.
|
|
27
|
+
*/
|
|
28
|
+
export declare function findSecrets(input: string): SecretHit[];
|
|
17
29
|
/**
|
|
18
30
|
* Redact an entire NSF session in place-safe manner (returns a new session).
|
|
19
31
|
* Cleans turn text and shell commands — the two places secrets actually land.
|
package/dist/redact.js
CHANGED
|
@@ -42,6 +42,21 @@ export function redactText(input) {
|
|
|
42
42
|
}
|
|
43
43
|
return { text, hits };
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Find (don't remove) secrets in a string. Same rules as redactText, opposite
|
|
47
|
+
* output: `sup facts` uses this to surface credentials locally so nobody
|
|
48
|
+
* scrolls a 4-hour transcript hunting for the test password the AI generated.
|
|
49
|
+
*/
|
|
50
|
+
export function findSecrets(input) {
|
|
51
|
+
const hits = [];
|
|
52
|
+
for (const rule of RULES) {
|
|
53
|
+
for (const m of input.matchAll(rule.pattern)) {
|
|
54
|
+
// For env-assignment report the full KEY=value pair, it's the useful unit.
|
|
55
|
+
hits.push({ name: rule.name, value: m[0] });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return hits;
|
|
59
|
+
}
|
|
45
60
|
/**
|
|
46
61
|
* Redact an entire NSF session in place-safe manner (returns a new session).
|
|
47
62
|
* Cleans turn text and shell commands — the two places secrets actually land.
|
package/dist/redact.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import { homedir } from "node:os";
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
import { parseClaudeCode, CLAUDE_CODE_TOOL_ID } from "./parsers/claude-code.js";
|
|
15
|
+
import { parseCodex } from "./parsers/codex.js";
|
|
15
16
|
import { renderBriefMarkdown } from "./writers/brief-markdown.js";
|
|
16
17
|
/** Claude Code project-slug directory: /abs/path -> -abs-path form under ~/.claude/projects. */
|
|
17
18
|
export function claudeCodeProjectDir(cwd) {
|
|
@@ -34,13 +35,29 @@ export const TOOLS = {
|
|
|
34
35
|
codex: {
|
|
35
36
|
id: "codex",
|
|
36
37
|
label: "Codex CLI",
|
|
37
|
-
verified
|
|
38
|
+
// Rollout format verified 2026-07-15 against openai/codex upstream test
|
|
39
|
+
// fixtures (codex-rs/rollout recorder tests).
|
|
40
|
+
verified: true,
|
|
41
|
+
sessionsDir: () => join(homedir(), ".codex", "sessions"),
|
|
42
|
+
parse: parseCodex,
|
|
38
43
|
writeTarget: (brief, sourceLabel) => ({
|
|
39
44
|
file: "AGENTS.md",
|
|
40
45
|
body: renderBriefMarkdown(brief, sourceLabel),
|
|
41
46
|
launchHint: "codex # picks up AGENTS.md automatically",
|
|
42
47
|
}),
|
|
43
48
|
},
|
|
49
|
+
cursor: {
|
|
50
|
+
id: "cursor",
|
|
51
|
+
label: "Cursor",
|
|
52
|
+
// Schema verified 2026-07-15 against a live Cursor install (composerHeaders
|
|
53
|
+
// + cursorDiskKV bubbles in the global state.vscdb).
|
|
54
|
+
verified: true,
|
|
55
|
+
writeTarget: (brief, sourceLabel) => ({
|
|
56
|
+
file: "AGENTS.md",
|
|
57
|
+
body: renderBriefMarkdown(brief, sourceLabel),
|
|
58
|
+
launchHint: "cursor . # Cursor's agent reads AGENTS.md automatically",
|
|
59
|
+
}),
|
|
60
|
+
},
|
|
44
61
|
gemini: {
|
|
45
62
|
id: "gemini",
|
|
46
63
|
label: "Gemini CLI",
|
|
@@ -51,6 +68,16 @@ export const TOOLS = {
|
|
|
51
68
|
launchHint: "gemini # picks up GEMINI.md automatically",
|
|
52
69
|
}),
|
|
53
70
|
},
|
|
71
|
+
antigravity: {
|
|
72
|
+
id: "antigravity",
|
|
73
|
+
label: "Antigravity",
|
|
74
|
+
verified: false,
|
|
75
|
+
writeTarget: (brief, sourceLabel) => ({
|
|
76
|
+
file: "AGENTS.md",
|
|
77
|
+
body: renderBriefMarkdown(brief, sourceLabel),
|
|
78
|
+
launchHint: "open the project in Antigravity — its agent reads AGENTS.md",
|
|
79
|
+
}),
|
|
80
|
+
},
|
|
54
81
|
};
|
|
55
82
|
/** Friendly aliases so `sup claude` == `sup claude-code`, `sup cc`, etc. */
|
|
56
83
|
const ALIASES = {
|
|
@@ -59,6 +86,9 @@ const ALIASES = {
|
|
|
59
86
|
cc: "claude-code",
|
|
60
87
|
codex: "codex",
|
|
61
88
|
gemini: "gemini",
|
|
89
|
+
cursor: "cursor",
|
|
90
|
+
antigravity: "antigravity",
|
|
91
|
+
ag: "antigravity",
|
|
62
92
|
};
|
|
63
93
|
export function resolveTool(id) {
|
|
64
94
|
const key = id.toLowerCase();
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|