rubric-chat 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.
Files changed (41) hide show
  1. package/dist/commands/list.js +34 -0
  2. package/dist/commands/list.js.map +1 -0
  3. package/dist/commands/login.js +110 -0
  4. package/dist/commands/login.js.map +1 -0
  5. package/dist/commands/logout.js +7 -0
  6. package/dist/commands/logout.js.map +1 -0
  7. package/dist/commands/rate.js +116 -0
  8. package/dist/commands/rate.js.map +1 -0
  9. package/dist/commands/status.js +47 -0
  10. package/dist/commands/status.js.map +1 -0
  11. package/dist/commands/whoami.js +20 -0
  12. package/dist/commands/whoami.js.map +1 -0
  13. package/dist/commands/wizard.js +107 -0
  14. package/dist/commands/wizard.js.map +1 -0
  15. package/dist/index.js +70 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/lib/api.js +53 -0
  18. package/dist/lib/api.js.map +1 -0
  19. package/dist/lib/config.js +80 -0
  20. package/dist/lib/config.js.map +1 -0
  21. package/dist/lib/local-server.js +126 -0
  22. package/dist/lib/local-server.js.map +1 -0
  23. package/dist/lib/render.js +38 -0
  24. package/dist/lib/render.js.map +1 -0
  25. package/dist/sources/claudeCode.js +200 -0
  26. package/dist/sources/claudeCode.js.map +1 -0
  27. package/dist/sources/claudeCode.test.js +55 -0
  28. package/dist/sources/claudeCode.test.js.map +1 -0
  29. package/dist/sources/codex.js +200 -0
  30. package/dist/sources/codex.js.map +1 -0
  31. package/dist/sources/codex.test.js +64 -0
  32. package/dist/sources/codex.test.js.map +1 -0
  33. package/dist/sources/generic.js +169 -0
  34. package/dist/sources/generic.js.map +1 -0
  35. package/dist/sources/index.js +12 -0
  36. package/dist/sources/index.js.map +1 -0
  37. package/dist/sources/types.js +2 -0
  38. package/dist/sources/types.js.map +1 -0
  39. package/dist/types.js +4 -0
  40. package/dist/types.js.map +1 -0
  41. package/package.json +64 -0
@@ -0,0 +1,200 @@
1
+ import { readFile, readdir, stat } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { basename, join } from "node:path";
4
+ import { CLI_VERSION } from "../lib/config.js";
5
+ const CODEX_SESSIONS_ROOT = join(homedir(), ".codex", "sessions");
6
+ export const codexSource = {
7
+ id: "codex",
8
+ label: "Codex CLI",
9
+ async discover(limit = 50) {
10
+ const files = await collectJsonl(CODEX_SESSIONS_ROOT);
11
+ files.sort((a, b) => b.last_modified.localeCompare(a.last_modified));
12
+ const stubs = [];
13
+ for (const file of files.slice(0, limit)) {
14
+ try {
15
+ const { turnCount, preview } = await peekSession(file.path);
16
+ if (turnCount === 0)
17
+ continue;
18
+ stubs.push({
19
+ id: idFromFilename(basename(file.path)),
20
+ path: file.path,
21
+ last_modified: file.last_modified,
22
+ turn_count: turnCount,
23
+ preview,
24
+ source: "codex"
25
+ });
26
+ }
27
+ catch {
28
+ // Skip unreadable files.
29
+ }
30
+ }
31
+ return stubs;
32
+ },
33
+ async load(stub) {
34
+ return loadCodexSession(stub.path);
35
+ }
36
+ };
37
+ export async function loadCodexSession(path) {
38
+ const content = await readFile(path, "utf8");
39
+ const lines = content.split(/\r?\n/).filter((line) => line.trim().length > 0);
40
+ const turns = [];
41
+ let lastAssistantSummary;
42
+ let lastAssistantText = "";
43
+ for (const line of lines) {
44
+ let event;
45
+ try {
46
+ event = JSON.parse(line);
47
+ }
48
+ catch {
49
+ continue;
50
+ }
51
+ if (!event || typeof event !== "object")
52
+ continue;
53
+ const payload = event.payload;
54
+ if (!payload || typeof payload !== "object")
55
+ continue;
56
+ const rec = payload;
57
+ if (rec.type !== "message")
58
+ continue;
59
+ const role = rec.role;
60
+ const text = extractMessageText(rec);
61
+ if (!text.trim())
62
+ continue;
63
+ if (role === "assistant") {
64
+ lastAssistantText += (lastAssistantText ? "\n" : "") + text;
65
+ lastAssistantSummary = {
66
+ response_length_chars: lastAssistantText.length,
67
+ contained_code_block: lastAssistantText.includes("```"),
68
+ contained_error: /\berror\b|\bexception\b|\bfailed\b/i.test(lastAssistantText)
69
+ };
70
+ continue;
71
+ }
72
+ if (role === "user") {
73
+ if (isSystemInjected(text))
74
+ continue;
75
+ turns.push({
76
+ index: turns.length,
77
+ text,
78
+ preceded_by_assistant: lastAssistantSummary
79
+ });
80
+ lastAssistantSummary = undefined;
81
+ lastAssistantText = "";
82
+ }
83
+ }
84
+ return {
85
+ schema_version: "1.0",
86
+ target_tool: "codex",
87
+ source_client: "cli",
88
+ source_client_version: CLI_VERSION,
89
+ ingested_at: new Date().toISOString(),
90
+ turns
91
+ };
92
+ }
93
+ function extractMessageText(message) {
94
+ const content = message.content;
95
+ if (typeof content === "string")
96
+ return content;
97
+ if (Array.isArray(content)) {
98
+ return content
99
+ .map((part) => {
100
+ if (typeof part === "string")
101
+ return part;
102
+ if (part && typeof part === "object") {
103
+ const obj = part;
104
+ if (typeof obj.text === "string")
105
+ return obj.text;
106
+ }
107
+ return "";
108
+ })
109
+ .filter(Boolean)
110
+ .join("\n");
111
+ }
112
+ if (content && typeof content === "object") {
113
+ const obj = content;
114
+ if (typeof obj.text === "string")
115
+ return obj.text;
116
+ }
117
+ return "";
118
+ }
119
+ function isSystemInjected(text) {
120
+ // Codex prepends environment metadata as the first "user" message of every session.
121
+ const trimmed = text.trim();
122
+ if (trimmed.startsWith("<environment_context>"))
123
+ return true;
124
+ if (trimmed.startsWith("<user_instructions>") && trimmed.endsWith("</user_instructions>")) {
125
+ // System-managed user instructions block, not a real prompt.
126
+ return true;
127
+ }
128
+ return false;
129
+ }
130
+ function idFromFilename(name) {
131
+ // rollout-2026-05-06T17-16-40-019dfd1c-8f90-7d73-9444-63c15233ec7c.jsonl
132
+ const stripped = name.replace(/\.jsonl$/, "").replace(/^rollout-/, "");
133
+ // Trailing UUID is the most identifying piece; expose first 12 chars of it.
134
+ const uuidMatch = stripped.match(/([0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12})$/i);
135
+ if (uuidMatch)
136
+ return uuidMatch[1];
137
+ return stripped;
138
+ }
139
+ async function peekSession(path) {
140
+ const content = await readFile(path, "utf8");
141
+ const lines = content.split(/\r?\n/).filter((line) => line.trim().length > 0);
142
+ let turnCount = 0;
143
+ let preview = "";
144
+ for (const line of lines) {
145
+ let event;
146
+ try {
147
+ event = JSON.parse(line);
148
+ }
149
+ catch {
150
+ continue;
151
+ }
152
+ if (!event || typeof event !== "object")
153
+ continue;
154
+ const payload = event.payload;
155
+ if (!payload || typeof payload !== "object")
156
+ continue;
157
+ const rec = payload;
158
+ if (rec.type !== "message" || rec.role !== "user")
159
+ continue;
160
+ const text = extractMessageText(rec);
161
+ if (!text.trim() || isSystemInjected(text))
162
+ continue;
163
+ if (!preview)
164
+ preview = text.replace(/\s+/g, " ").slice(0, 80);
165
+ turnCount += 1;
166
+ }
167
+ return { turnCount, preview };
168
+ }
169
+ async function collectJsonl(root) {
170
+ const out = [];
171
+ const stack = [root];
172
+ while (stack.length > 0) {
173
+ const current = stack.pop();
174
+ let entries;
175
+ try {
176
+ entries = (await readdir(current, { withFileTypes: true }));
177
+ }
178
+ catch {
179
+ continue;
180
+ }
181
+ for (const entry of entries) {
182
+ const name = entry.name;
183
+ const full = join(current, name);
184
+ if (entry.isDirectory()) {
185
+ stack.push(full);
186
+ }
187
+ else if (entry.isFile() && name.endsWith(".jsonl")) {
188
+ try {
189
+ const s = await stat(full);
190
+ out.push({ path: full, last_modified: s.mtime.toISOString() });
191
+ }
192
+ catch {
193
+ // ignore
194
+ }
195
+ }
196
+ }
197
+ }
198
+ return out;
199
+ }
200
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/sources/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAI3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,WAAW;IAElB,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE;QACvB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QAErE,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5D,IAAI,SAAS,KAAK,CAAC;oBAAE,SAAS;gBAC9B,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,UAAU,EAAE,SAAS;oBACrB,OAAO;oBACP,MAAM,EAAE,OAAO;iBAChB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAiB;QAC1B,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,IAAI,oBAAkD,CAAC;IACvD,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,OAAO,GAAI,KAAiC,CAAC,OAAO,CAAC;QAC3D,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QACtD,MAAM,GAAG,GAAG,OAAkC,CAAC;QAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QAErC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACtB,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAE3B,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,iBAAiB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;YAC5D,oBAAoB,GAAG;gBACrB,qBAAqB,EAAE,iBAAiB,CAAC,MAAM;gBAC/C,oBAAoB,EAAE,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvD,eAAe,EAAE,qCAAqC,CAAC,IAAI,CAAC,iBAAiB,CAAC;aAC/E,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,IAAI,gBAAgB,CAAC,IAAI,CAAC;gBAAE,SAAS;YACrC,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,IAAI;gBACJ,qBAAqB,EAAE,oBAAoB;aAC5C,CAAC,CAAC;YACH,oBAAoB,GAAG,SAAS,CAAC;YACjC,iBAAiB,GAAG,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO;QACL,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,OAAO;QACpB,aAAa,EAAE,KAAK;QACpB,qBAAqB,EAAE,WAAW;QAClC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC1C,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,IAA+B,CAAC;gBAC5C,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO,GAAG,CAAC,IAAI,CAAC;YACpD,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,OAAkC,CAAC;QAC/C,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,oFAAoF;IACpF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,uBAAuB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC1F,6DAA6D;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,yEAAyE;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvE,4EAA4E;IAC5E,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACpF,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9E,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,OAAO,GAAI,KAAiC,CAAC,OAAO,CAAC;QAC3D,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QACtD,MAAM,GAAG,GAAG,OAAkC,CAAC;QAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QAC5D,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC,IAAI,CAAC;YAAE,SAAS;QACrD,IAAI,CAAC,OAAO;YAAE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,MAAM,GAAG,GAA8C,EAAE,CAAC;IAC1D,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,CAAC;IAE/B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC7B,IAAI,OAAmC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAA+B,CAAC;QAC5F,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACjE,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { mkdtemp, writeFile, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { loadCodexSession } from "./codex.js";
6
+ const dirs = [];
7
+ afterEach(async () => {
8
+ while (dirs.length > 0) {
9
+ const dir = dirs.pop();
10
+ await rm(dir, { recursive: true, force: true });
11
+ }
12
+ });
13
+ async function tempJsonl(lines) {
14
+ const dir = await mkdtemp(join(tmpdir(), "rubric-codex-"));
15
+ dirs.push(dir);
16
+ const path = join(dir, "rollout-test.jsonl");
17
+ await writeFile(path, lines.map((line) => JSON.stringify(line)).join("\n"));
18
+ return path;
19
+ }
20
+ describe("loadCodexSession", () => {
21
+ it("collects user turns, strips assistant text, drops the env preamble", async () => {
22
+ const path = await tempJsonl([
23
+ { type: "session_meta", payload: { id: "x" } },
24
+ {
25
+ type: "response_item",
26
+ payload: {
27
+ type: "message",
28
+ role: "user",
29
+ content: [{ type: "input_text", text: "<environment_context>\n <cwd>/tmp</cwd>\n</environment_context>" }]
30
+ }
31
+ },
32
+ {
33
+ type: "response_item",
34
+ payload: {
35
+ type: "message",
36
+ role: "user",
37
+ content: [{ type: "input_text", text: "Build me a CRUD app." }]
38
+ }
39
+ },
40
+ {
41
+ type: "response_item",
42
+ payload: {
43
+ type: "message",
44
+ role: "assistant",
45
+ content: [{ type: "output_text", text: "Here is some code\n```js\n1\n```" }]
46
+ }
47
+ },
48
+ {
49
+ type: "response_item",
50
+ payload: {
51
+ type: "message",
52
+ role: "user",
53
+ content: [{ type: "input_text", text: "Now add tests." }]
54
+ }
55
+ }
56
+ ]);
57
+ const session = await loadCodexSession(path);
58
+ expect(session.target_tool).toBe("codex");
59
+ expect(session.turns.map((t) => t.text)).toEqual(["Build me a CRUD app.", "Now add tests."]);
60
+ expect(session.turns[1].preceded_by_assistant?.contained_code_block).toBe(true);
61
+ expect(JSON.stringify(session)).not.toContain("Here is some code");
62
+ });
63
+ });
64
+ //# sourceMappingURL=codex.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.test.js","sourceRoot":"","sources":["../../src/sources/codex.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { CLI_VERSION } from "../lib/config.js";
3
+ import { loadClaudeCodeSession } from "./claudeCode.js";
4
+ export async function loadGenericSession(path) {
5
+ if (path.endsWith(".jsonl")) {
6
+ return loadClaudeCodeSession(path);
7
+ }
8
+ const raw = (await readFile(path, "utf8")).trim();
9
+ if (!raw)
10
+ throw new Error(`File ${path} is empty.`);
11
+ if (raw.startsWith("{") || raw.startsWith("[")) {
12
+ const parsed = JSON.parse(raw);
13
+ if (isNormalizedSession(parsed))
14
+ return parsed;
15
+ const conversation = Array.isArray(parsed) ? parsed[0] : parsed;
16
+ if (looksLikeChatGpt(conversation)) {
17
+ return normalizeChatGptExport(conversation);
18
+ }
19
+ if (looksLikeClaudeWeb(conversation)) {
20
+ return normalizeClaudeWebExport(conversation);
21
+ }
22
+ if (Array.isArray(parsed) && parsed.every((item) => typeof item === "string")) {
23
+ return fromStringArray(parsed, "other");
24
+ }
25
+ throw new Error(`Cannot interpret ${path} as a session. Supported: NormalizedSession JSON, ChatGPT or Claude.ai export, a JSON string array of user turns, or a Claude Code .jsonl file.`);
26
+ }
27
+ const blocks = raw.split(/\n\s*\n/).map((b) => b.trim()).filter(Boolean);
28
+ return fromStringArray(blocks, "other");
29
+ }
30
+ function isNormalizedSession(value) {
31
+ if (!value || typeof value !== "object")
32
+ return false;
33
+ const record = value;
34
+ return record.schema_version === "1.0" && Array.isArray(record.turns);
35
+ }
36
+ function looksLikeChatGpt(value) {
37
+ if (!value || typeof value !== "object")
38
+ return false;
39
+ const record = value;
40
+ return Boolean(record.mapping || record.conversation_id || record.create_time);
41
+ }
42
+ function looksLikeClaudeWeb(value) {
43
+ if (!value || typeof value !== "object")
44
+ return false;
45
+ const record = value;
46
+ return Boolean(record.chat_messages || record.uuid || record.account);
47
+ }
48
+ function normalizeChatGptExport(input) {
49
+ const messages = flattenChatGptMessages(input);
50
+ return collectUserTurns(messages, "chatgpt", (msg) => {
51
+ const wrapper = msg.message ?? msg;
52
+ return extractText(wrapper);
53
+ });
54
+ }
55
+ function normalizeClaudeWebExport(input) {
56
+ const messages = flattenClaudeWebMessages(input);
57
+ return collectUserTurns(messages, "claude_web", (msg) => extractText(msg));
58
+ }
59
+ function flattenChatGptMessages(input) {
60
+ if (!input || typeof input !== "object")
61
+ return [];
62
+ const record = input;
63
+ if (Array.isArray(record.messages))
64
+ return record.messages;
65
+ if (record.mapping && typeof record.mapping === "object") {
66
+ return Object.values(record.mapping)
67
+ .map((node) => node && typeof node === "object" ? node.message : undefined)
68
+ .filter((value) => Boolean(value));
69
+ }
70
+ return [];
71
+ }
72
+ function flattenClaudeWebMessages(input) {
73
+ if (!input || typeof input !== "object")
74
+ return [];
75
+ const record = input;
76
+ for (const key of ["chat_messages", "messages", "conversation"]) {
77
+ if (Array.isArray(record[key]))
78
+ return record[key];
79
+ }
80
+ return [];
81
+ }
82
+ function collectUserTurns(messages, tool, textOf) {
83
+ const turns = [];
84
+ let lastAssistant;
85
+ for (const message of messages) {
86
+ const role = roleOf(message);
87
+ if (role === "assistant") {
88
+ lastAssistant = message;
89
+ continue;
90
+ }
91
+ if (role !== "user" && role !== "human")
92
+ continue;
93
+ const text = textOf(message);
94
+ if (!text.trim())
95
+ continue;
96
+ turns.push({
97
+ index: turns.length,
98
+ text,
99
+ preceded_by_assistant: summarizeAssistant(lastAssistant)
100
+ });
101
+ lastAssistant = undefined;
102
+ }
103
+ return {
104
+ schema_version: "1.0",
105
+ target_tool: tool,
106
+ source_client: "cli",
107
+ source_client_version: CLI_VERSION,
108
+ ingested_at: new Date().toISOString(),
109
+ turns
110
+ };
111
+ }
112
+ function summarizeAssistant(value) {
113
+ const text = extractText(value);
114
+ if (!text.trim())
115
+ return undefined;
116
+ return {
117
+ response_length_chars: text.length,
118
+ contained_code_block: text.includes("```"),
119
+ contained_error: /\berror\b|\bexception\b|\bfailed\b/i.test(text)
120
+ };
121
+ }
122
+ function roleOf(value) {
123
+ if (!value || typeof value !== "object")
124
+ return "";
125
+ const record = value;
126
+ const author = record.author;
127
+ if (author && typeof author === "object") {
128
+ const role = author.role;
129
+ if (typeof role === "string")
130
+ return role;
131
+ }
132
+ for (const key of ["role", "sender", "from"]) {
133
+ if (typeof record[key] === "string")
134
+ return record[key];
135
+ }
136
+ return "";
137
+ }
138
+ function extractText(value) {
139
+ if (typeof value === "string")
140
+ return value;
141
+ if (value == null)
142
+ return "";
143
+ if (Array.isArray(value)) {
144
+ return value.map(extractText).filter(Boolean).join("\n");
145
+ }
146
+ if (typeof value !== "object")
147
+ return String(value);
148
+ const record = value;
149
+ for (const key of ["text", "content", "message", "parts", "markdown", "value"]) {
150
+ const text = extractText(record[key]);
151
+ if (text.trim())
152
+ return text;
153
+ }
154
+ return "";
155
+ }
156
+ function fromStringArray(items, tool) {
157
+ const turns = items
158
+ .filter((text) => text.trim().length > 0)
159
+ .map((text, index) => ({ index, text }));
160
+ return {
161
+ schema_version: "1.0",
162
+ target_tool: tool,
163
+ source_client: "cli",
164
+ source_client_version: CLI_VERSION,
165
+ ingested_at: new Date().toISOString(),
166
+ turns
167
+ };
168
+ }
169
+ //# sourceMappingURL=generic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.js","sourceRoot":"","sources":["../../src/sources/generic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { claudeCodeSource } from "./claudeCode.js";
2
+ import { codexSource } from "./codex.js";
3
+ export const SOURCES = {
4
+ "claude-code": claudeCodeSource,
5
+ codex: codexSource
6
+ };
7
+ export function getSource(name) {
8
+ return SOURCES[name];
9
+ }
10
+ export { claudeCodeSource, codexSource };
11
+ export { loadGenericSession } from "./generic.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,MAAM,CAAC,MAAM,OAAO,GAAkC;IACpD,aAAa,EAAE,gBAAgB;IAC/B,KAAK,EAAE,WAAW;CACnB,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":""}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ // Mirror of packages/shared/types.ts. Kept inline so tsc can build with rootDir=src.
2
+ // Update this file alongside packages/shared/types.ts.
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,uDAAuD"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "rubric-chat",
3
+ "version": "0.1.0",
4
+ "description": "Score your AI chat sessions on a strict 0–100 rubric — Claude Code, Codex CLI, ChatGPT and Claude.ai exports.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "homepage": "https://rubric.chat",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/TPAteeq/rubric.git",
11
+ "directory": "apps/cli"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/TPAteeq/rubric/issues"
15
+ },
16
+ "keywords": [
17
+ "rubric",
18
+ "prompt",
19
+ "prompting",
20
+ "score",
21
+ "claude",
22
+ "chatgpt",
23
+ "ai",
24
+ "llm",
25
+ "claude-code",
26
+ "codex",
27
+ "cli"
28
+ ],
29
+ "bin": {
30
+ "rubric-chat": "dist/index.js"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "README.md"
35
+ ],
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "scripts": {
40
+ "build": "tsc -p tsconfig.json",
41
+ "dev": "tsc -p tsconfig.json --watch",
42
+ "start": "node dist/index.js",
43
+ "test": "vitest run",
44
+ "prepublishOnly": "npm run test && npm run build"
45
+ },
46
+ "dependencies": {
47
+ "commander": "^12.1.0",
48
+ "kleur": "^4.1.5",
49
+ "open": "^10.1.0",
50
+ "prompts": "^2.4.2"
51
+ },
52
+ "optionalDependencies": {
53
+ "keytar": "^7.9.0"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^20.11.0",
57
+ "@types/prompts": "^2.4.9",
58
+ "typescript": "^5.4.0",
59
+ "vitest": "^2.1.0"
60
+ },
61
+ "engines": {
62
+ "node": ">=18"
63
+ }
64
+ }