@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.
@@ -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.
@@ -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: false,
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;AAEhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAmBlE,gGAAgG;AAChG,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAA4B;IAC5C,aAAa,EAAE;QACb,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;QACzD,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC;YAC7C,UAAU,EAAE,wDAAwD;SACrE,CAAC;KACH;IAED,KAAK,EAAE;QACL,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC;YAC7C,UAAU,EAAE,4CAA4C;SACzD,CAAC;KACH;IAED,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC;YAC7C,UAAU,EAAE,6CAA6C;SAC1D,CAAC;KACH;CACF,CAAC;AAEF,4EAA4E;AAC5E,MAAM,OAAO,GAA2B;IACtC,MAAM,EAAE,aAAa;IACrB,aAAa,EAAE,aAAa;IAC5B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supersession/sup",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Your AI coding session, superseded — hand it off to any tool and keep going.",
5
5
  "type": "module",
6
6
  "bin": {