slait.dev 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 (59) hide show
  1. package/README.md +149 -0
  2. package/dist/commands/config.d.ts +2 -0
  3. package/dist/commands/config.js +22 -0
  4. package/dist/commands/config.js.map +1 -0
  5. package/dist/commands/hooks.d.ts +17 -0
  6. package/dist/commands/hooks.js +372 -0
  7. package/dist/commands/hooks.js.map +1 -0
  8. package/dist/commands/init.d.ts +3 -0
  9. package/dist/commands/init.js +41 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/setup.d.ts +7 -0
  12. package/dist/commands/setup.js +85 -0
  13. package/dist/commands/setup.js.map +1 -0
  14. package/dist/commands/status.d.ts +1 -0
  15. package/dist/commands/status.js +29 -0
  16. package/dist/commands/status.js.map +1 -0
  17. package/dist/commands/upload.d.ts +6 -0
  18. package/dist/commands/upload.js +75 -0
  19. package/dist/commands/upload.js.map +1 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.js +89 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/lib/api.d.ts +62 -0
  24. package/dist/lib/api.js +92 -0
  25. package/dist/lib/api.js.map +1 -0
  26. package/dist/lib/claude-artifacts.d.ts +18 -0
  27. package/dist/lib/claude-artifacts.js +181 -0
  28. package/dist/lib/claude-artifacts.js.map +1 -0
  29. package/dist/lib/claude-hooks.d.ts +13 -0
  30. package/dist/lib/claude-hooks.js +87 -0
  31. package/dist/lib/claude-hooks.js.map +1 -0
  32. package/dist/lib/config.d.ts +10 -0
  33. package/dist/lib/config.js +52 -0
  34. package/dist/lib/config.js.map +1 -0
  35. package/dist/lib/cursor-artifacts.d.ts +13 -0
  36. package/dist/lib/cursor-artifacts.js +83 -0
  37. package/dist/lib/cursor-artifacts.js.map +1 -0
  38. package/dist/lib/cursor-hooks.d.ts +14 -0
  39. package/dist/lib/cursor-hooks.js +112 -0
  40. package/dist/lib/cursor-hooks.js.map +1 -0
  41. package/dist/lib/discover.d.ts +8 -0
  42. package/dist/lib/discover.js +65 -0
  43. package/dist/lib/discover.js.map +1 -0
  44. package/dist/lib/format.d.ts +17 -0
  45. package/dist/lib/format.js +134 -0
  46. package/dist/lib/format.js.map +1 -0
  47. package/dist/lib/project-link.d.ts +11 -0
  48. package/dist/lib/project-link.js +32 -0
  49. package/dist/lib/project-link.js.map +1 -0
  50. package/dist/lib/session-events.d.ts +8 -0
  51. package/dist/lib/session-events.js +44 -0
  52. package/dist/lib/session-events.js.map +1 -0
  53. package/dist/lib/state.d.ts +11 -0
  54. package/dist/lib/state.js +31 -0
  55. package/dist/lib/state.js.map +1 -0
  56. package/dist/lib/transcript.d.ts +15 -0
  57. package/dist/lib/transcript.js +44 -0
  58. package/dist/lib/transcript.js.map +1 -0
  59. package/package.json +40 -0
@@ -0,0 +1,85 @@
1
+ import { resolve, basename } from "path";
2
+ import { existsSync } from "fs";
3
+ import { homedir } from "os";
4
+ import { readConfig, writeConfig, getBaseUrl } from "../lib/config.js";
5
+ import { getProjectLink, saveProjectLink } from "../lib/project-link.js";
6
+ import { createProject } from "../lib/api.js";
7
+ import { installCursorHooks } from "../lib/cursor-hooks.js";
8
+ import { installClaudeHooks } from "../lib/claude-hooks.js";
9
+ function detectTools(projectRoot) {
10
+ const cursorLocal = existsSync(resolve(projectRoot, ".cursor"));
11
+ const cursorGlobal = existsSync(resolve(homedir(), ".cursor"));
12
+ const claudeLocal = existsSync(resolve(projectRoot, ".claude"));
13
+ const claudeGlobal = existsSync(resolve(homedir(), ".claude"));
14
+ return {
15
+ cursor: cursorLocal || cursorGlobal,
16
+ claude: claudeLocal || claudeGlobal,
17
+ };
18
+ }
19
+ export async function runSetup(apiKey, opts) {
20
+ const cwd = resolve(process.cwd());
21
+ // 1. Save API key
22
+ if (!apiKey.trim()) {
23
+ console.error("Usage: slait setup <api-key>");
24
+ process.exit(1);
25
+ }
26
+ const config = readConfig();
27
+ config.api_key = apiKey.trim();
28
+ writeConfig(config);
29
+ console.log("✓ API key saved");
30
+ // 2. Link project
31
+ let projectId;
32
+ const existing = getProjectLink(cwd);
33
+ if (existing) {
34
+ projectId = existing.projectId;
35
+ console.log(`✓ Project already linked: "${existing.projectName}"`);
36
+ }
37
+ else {
38
+ const projectName = opts.name?.trim() || basename(cwd);
39
+ try {
40
+ const { id } = await createProject(apiKey.trim(), projectName, "cursor");
41
+ const link = {
42
+ projectId: id,
43
+ projectName,
44
+ localPath: cwd,
45
+ source: "cursor",
46
+ linkedAt: new Date().toISOString(),
47
+ };
48
+ saveProjectLink(link);
49
+ projectId = id;
50
+ console.log(`✓ Project linked: "${projectName}"`);
51
+ }
52
+ catch (err) {
53
+ console.error(`Failed to create project: ${err.message}`);
54
+ process.exit(1);
55
+ }
56
+ }
57
+ // 3. Install hooks
58
+ const explicit = opts.cursor || opts.claude;
59
+ const targets = explicit
60
+ ? { cursor: !!opts.cursor, claude: !!opts.claude }
61
+ : detectTools(cwd);
62
+ if (!targets.cursor && !targets.claude) {
63
+ console.log("\n⚠ No Cursor or Claude installation detected.");
64
+ console.log(" Run 'slait hooks install --cursor' or '--claude' later once installed.");
65
+ }
66
+ else {
67
+ if (targets.cursor) {
68
+ const count = installCursorHooks(cwd);
69
+ console.log(count > 0
70
+ ? `✓ Cursor hooks installed (${count} hook${count > 1 ? "s" : ""})`
71
+ : "✓ Cursor hooks already installed");
72
+ }
73
+ if (targets.claude) {
74
+ const count = installClaudeHooks(cwd);
75
+ console.log(count > 0
76
+ ? `✓ Claude hooks installed (${count} hook${count > 1 ? "s" : ""})`
77
+ : "✓ Claude hooks already installed");
78
+ }
79
+ }
80
+ // 4. Summary
81
+ const baseUrl = getBaseUrl();
82
+ console.log(`\nSetup complete! Dashboard: ${baseUrl}/project/${projectId}`);
83
+ console.log("Your AI coding sessions will now appear there automatically.");
84
+ }
85
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runStatus(): void;
@@ -0,0 +1,29 @@
1
+ import { resolve } from "path";
2
+ import { getApiKey, getBaseUrl } from "../lib/config.js";
3
+ import { getProjectLink } from "../lib/project-link.js";
4
+ import { areCursorHooksInstalled } from "../lib/cursor-hooks.js";
5
+ import { areClaudeHooksInstalled } from "../lib/claude-hooks.js";
6
+ export function runStatus() {
7
+ const cwd = resolve(process.cwd());
8
+ const apiKey = getApiKey();
9
+ const baseUrl = getBaseUrl();
10
+ const link = getProjectLink(cwd);
11
+ console.log("Slait CLI Status");
12
+ console.log("─".repeat(40));
13
+ console.log(`API key: ${apiKey ? "configured" : "not set"}`);
14
+ console.log(`Base URL: ${baseUrl}`);
15
+ console.log();
16
+ if (link) {
17
+ console.log(`Project: ${link.projectName}`);
18
+ console.log(`Project ID: ${link.projectId}`);
19
+ console.log(`Dashboard: ${baseUrl}/project/${link.projectId}`);
20
+ console.log(`Linked at: ${link.linkedAt}`);
21
+ }
22
+ else {
23
+ console.log("Project: not linked (run 'slait init')");
24
+ }
25
+ console.log();
26
+ console.log(`Cursor hooks: ${areCursorHooksInstalled(cwd) ? "installed" : "not installed"}`);
27
+ console.log(`Claude hooks: ${areClaudeHooksInstalled(cwd) ? "installed" : "not installed"}`);
28
+ }
29
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAEhE,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;IAEhC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA;IAC/D,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAA;IACrC,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,YAAY,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAC/D,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,iBAAiB,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAA;IAC5F,OAAO,CAAC,GAAG,CAAC,iBAAiB,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAA;AAC9F,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function runUpload(opts: {
2
+ file?: string;
3
+ cursor?: boolean;
4
+ claude?: boolean;
5
+ latest?: boolean;
6
+ }): Promise<void>;
@@ -0,0 +1,75 @@
1
+ import { existsSync, readFileSync } from "fs";
2
+ import { resolve } from "path";
3
+ import { requireApiKey, getBaseUrl } from "../lib/config.js";
4
+ import { getProjectLink } from "../lib/project-link.js";
5
+ import { discoverCursor, discoverClaude } from "../lib/discover.js";
6
+ import { fileToChatLog } from "../lib/format.js";
7
+ import { analyze, createSessionComplete } from "../lib/api.js";
8
+ export async function runUpload(opts) {
9
+ const apiKey = requireApiKey();
10
+ const cwd = resolve(process.cwd());
11
+ const link = getProjectLink(cwd);
12
+ if (!link) {
13
+ console.error("Project not linked. Run 'slait init' first.");
14
+ process.exit(1);
15
+ }
16
+ if (opts.file && existsSync(opts.file)) {
17
+ const source = opts.file.endsWith(".jsonl")
18
+ ? "cursor"
19
+ : opts.file.endsWith(".json")
20
+ ? "claude"
21
+ : "other";
22
+ await uploadFile(apiKey, link.projectId, opts.file, source);
23
+ return;
24
+ }
25
+ if (opts.cursor) {
26
+ const files = discoverCursor();
27
+ if (files.length === 0) {
28
+ console.error("No Cursor transcripts found. Check ~/.cursor/projects/*/agent-transcripts/");
29
+ process.exit(1);
30
+ }
31
+ const file = opts.latest ? files[0] : files[0];
32
+ await uploadFile(apiKey, link.projectId, file.path, "cursor");
33
+ return;
34
+ }
35
+ if (opts.claude) {
36
+ const files = discoverClaude();
37
+ if (files.length === 0) {
38
+ console.error("No Claude logs found.");
39
+ process.exit(1);
40
+ }
41
+ const file = opts.latest ? files[0] : files[0];
42
+ await uploadFile(apiKey, link.projectId, file.path, "claude");
43
+ return;
44
+ }
45
+ if (opts.file) {
46
+ console.error(`File not found: ${opts.file}`);
47
+ process.exit(1);
48
+ }
49
+ console.error("Usage: slait upload [file] | slait upload --cursor | slait upload --claude");
50
+ process.exit(1);
51
+ }
52
+ async function uploadFile(apiKey, projectId, filePath, source) {
53
+ const parseSource = source === "other" ? "cursor" : source;
54
+ const fileName = filePath.split(/[/\\]/).pop() ?? null;
55
+ console.log(`Reading ${filePath}...`);
56
+ const chatLog = fileToChatLog(filePath, parseSource);
57
+ if (!chatLog || chatLog.length < 50) {
58
+ console.error("Chat log is too short or empty.");
59
+ process.exit(1);
60
+ }
61
+ console.log("Analyzing...");
62
+ const analysis = await analyze(chatLog, apiKey);
63
+ console.log("Saving session...");
64
+ const rawLog = readFileSync(filePath, "utf-8");
65
+ const { id } = await createSessionComplete(apiKey, {
66
+ projectId,
67
+ source,
68
+ analysis,
69
+ fileName,
70
+ rawLog,
71
+ });
72
+ const baseUrl = getBaseUrl();
73
+ console.log(`Upload complete -> ${baseUrl}/session/${id}`);
74
+ }
75
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { runConfigSetKey, runConfigSetUrl } from "./commands/config.js";
4
+ import { runInit } from "./commands/init.js";
5
+ import { runSetup } from "./commands/setup.js";
6
+ import { runHooksInstall, runHooksUninstall, runHooksStatus, handleCursorSessionStart, handleCursorStop, handleCursorSessionEnd, handleCursorAfterFileEdit, handleCursorAfterShellExecution, handleCursorPostToolUse, handleCursorPostToolUseFailure, handleClaudeStop, } from "./commands/hooks.js";
7
+ import { runUpload } from "./commands/upload.js";
8
+ import { runStatus } from "./commands/status.js";
9
+ const program = new Command();
10
+ program
11
+ .name("slait")
12
+ .description("Link your Cursor/Claude sessions to the Slait dashboard")
13
+ .version("0.1.0");
14
+ // ── setup ────────────────────────────────────────────────────────────────
15
+ program
16
+ .command("setup <api-key>")
17
+ .description("One-command setup: save API key, link project, install hooks")
18
+ .option("-n, --name <name>", "Project name (default: directory name)")
19
+ .option("--cursor", "Only install Cursor hooks")
20
+ .option("--claude", "Only install Claude hooks")
21
+ .action((apiKey, opts) => {
22
+ runSetup(apiKey, opts);
23
+ });
24
+ // ── config ───────────────────────────────────────────────────────────────
25
+ const config = program.command("config").description("Manage CLI configuration");
26
+ config
27
+ .command("set-key <api_key>")
28
+ .description("Save API key to ~/.slait/config.json")
29
+ .action(runConfigSetKey);
30
+ config
31
+ .command("set-url <url>")
32
+ .description("Set dashboard base URL")
33
+ .action(runConfigSetUrl);
34
+ // ── init ─────────────────────────────────────────────────────────────────
35
+ program
36
+ .command("init")
37
+ .description("Link this project directory to a Slait dashboard project")
38
+ .option("-n, --name <name>", "Project name (default: directory name)")
39
+ .action(runInit);
40
+ // ── hooks ────────────────────────────────────────────────────────────────
41
+ const hooks = program.command("hooks").description("Manage Cursor/Claude hooks");
42
+ hooks
43
+ .command("install")
44
+ .description("Install hooks for live session tracking")
45
+ .option("--cursor", "Install Cursor hooks (.cursor/hooks.json)")
46
+ .option("--claude", "Install Claude hooks (.claude/settings.json)")
47
+ .action(runHooksInstall);
48
+ hooks
49
+ .command("uninstall")
50
+ .description("Remove slait hooks")
51
+ .option("--cursor", "Remove Cursor hooks")
52
+ .option("--claude", "Remove Claude hooks")
53
+ .action(runHooksUninstall);
54
+ hooks
55
+ .command("status")
56
+ .description("Show installed hooks")
57
+ .action(runHooksStatus);
58
+ // Hidden subcommand tree for hook event handlers (called by Cursor/Claude)
59
+ const handle = hooks.command("handle");
60
+ handle.description("Internal hook handlers");
61
+ handle.configureHelp({ showGlobalOptions: false });
62
+ const handleCursor = handle.command("cursor").description("Cursor hook handlers");
63
+ handleCursor.command("session-start").action(handleCursorSessionStart);
64
+ handleCursor.command("stop").action(handleCursorStop);
65
+ handleCursor.command("session-end").action(handleCursorSessionEnd);
66
+ handleCursor.command("after-file-edit").action(handleCursorAfterFileEdit);
67
+ handleCursor.command("after-shell-execution").action(handleCursorAfterShellExecution);
68
+ handleCursor.command("post-tool-use").action(handleCursorPostToolUse);
69
+ handleCursor.command("post-tool-use-failure").action(handleCursorPostToolUseFailure);
70
+ const handleClaude = handle.command("claude").description("Claude hook handlers");
71
+ handleClaude.command("stop").action(handleClaudeStop);
72
+ // ── upload ───────────────────────────────────────────────────────────────
73
+ program
74
+ .command("upload [file]")
75
+ .description("Upload a transcript file for analysis")
76
+ .option("--cursor", "Auto-discover Cursor transcripts")
77
+ .option("--claude", "Auto-discover Claude logs")
78
+ .option("--latest", "Use the most recent transcript")
79
+ .action((file, opts) => {
80
+ runUpload({ file, ...opts });
81
+ });
82
+ // ── status ───────────────────────────────────────────────────────────────
83
+ program
84
+ .command("status")
85
+ .description("Show project link, hooks, and config status")
86
+ .action(runStatus);
87
+ // ── parse ────────────────────────────────────────────────────────────────
88
+ program.parse();
89
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ export interface AIUsageAnalysis {
2
+ overallScore: number;
3
+ confidence: string;
4
+ dimensionScores: Record<string, number>;
5
+ dimensionEvidence?: Record<string, unknown>;
6
+ moduleEval?: unknown;
7
+ annotatedTurns?: unknown[];
8
+ strengths: string[];
9
+ weaknesses: string[];
10
+ detectedPatterns: string[];
11
+ exampleEvidence: Array<{
12
+ behavior: string;
13
+ why_it_matters: string;
14
+ }>;
15
+ hireSignal: string;
16
+ summary: string;
17
+ }
18
+ type SessionSource = "cursor" | "claude" | "chatgpt" | "copilot" | "windsurf" | "other";
19
+ export interface ConfigMetadata {
20
+ plansUsed?: string[];
21
+ rulesUsed?: string[];
22
+ claudeMdPresent?: boolean;
23
+ skillsUsed?: string[];
24
+ pluginsUsed?: string[];
25
+ }
26
+ export declare function analyze(chatLog: string, apiKey: string, supplementaryFiles?: Record<string, string>, configMetadata?: ConfigMetadata): Promise<AIUsageAnalysis>;
27
+ export declare function createProject(apiKey: string, name: string, source: SessionSource): Promise<{
28
+ id: string;
29
+ }>;
30
+ export declare function createSession(apiKey: string, opts: {
31
+ projectId: string;
32
+ source: SessionSource;
33
+ status?: "in_progress" | "complete";
34
+ fileName?: string | null;
35
+ sessionLabel?: string | null;
36
+ }): Promise<{
37
+ id: string;
38
+ created_at: string;
39
+ }>;
40
+ export declare function updateSession(apiKey: string, sessionId: string, data: {
41
+ rawLog?: string;
42
+ turnCount?: number;
43
+ status?: "in_progress" | "complete";
44
+ analysis?: AIUsageAnalysis;
45
+ sessionEvents?: Array<Record<string, unknown>>;
46
+ durationMs?: number;
47
+ endReason?: string;
48
+ errorMessage?: string;
49
+ supplementaryFiles?: Record<string, string> | null;
50
+ configMetadata?: ConfigMetadata | null;
51
+ }): Promise<void>;
52
+ export declare function createSessionComplete(apiKey: string, opts: {
53
+ projectId: string;
54
+ source: SessionSource;
55
+ analysis: AIUsageAnalysis;
56
+ fileName?: string | null;
57
+ rawLog?: string | null;
58
+ }): Promise<{
59
+ id: string;
60
+ created_at: string;
61
+ }>;
62
+ export {};
@@ -0,0 +1,92 @@
1
+ import { getBaseUrl } from "./config.js";
2
+ async function apiFetch(path, apiKey, options = {}) {
3
+ const baseUrl = getBaseUrl();
4
+ const url = `${baseUrl}${path}`;
5
+ const headers = {
6
+ "Content-Type": "application/json",
7
+ Authorization: `Bearer ${apiKey}`,
8
+ ...(options.headers ?? {}),
9
+ };
10
+ let res;
11
+ try {
12
+ res = await fetch(url, { ...options, headers });
13
+ }
14
+ catch (e) {
15
+ const err = e;
16
+ const msg = err.cause?.message ?? err.message ?? "Unknown network error";
17
+ throw new Error(`Request to ${url} failed: ${msg}`);
18
+ }
19
+ if (!res.ok) {
20
+ const body = await res.json().catch(() => ({}));
21
+ throw new Error(body.error ?? `API error: ${res.status}`);
22
+ }
23
+ return res;
24
+ }
25
+ export async function analyze(chatLog, apiKey, supplementaryFiles, configMetadata) {
26
+ const baseUrl = getBaseUrl();
27
+ const payload = { chatLog };
28
+ if (supplementaryFiles && Object.keys(supplementaryFiles).length > 0) {
29
+ payload.supplementaryFiles = supplementaryFiles;
30
+ }
31
+ if (configMetadata) {
32
+ payload.configMetadata = configMetadata;
33
+ }
34
+ let res;
35
+ try {
36
+ res = await fetch(`${baseUrl}/api/analyze`, {
37
+ method: "POST",
38
+ headers: { "Content-Type": "application/json" },
39
+ body: JSON.stringify(payload),
40
+ });
41
+ }
42
+ catch (e) {
43
+ const err = e;
44
+ throw new Error(`Analyze request failed: ${err.cause?.message ?? err.message}`);
45
+ }
46
+ if (!res.ok) {
47
+ const body = await res.json().catch(() => ({}));
48
+ throw new Error(body.error ?? `Analyze failed: ${res.status}`);
49
+ }
50
+ return res.json();
51
+ }
52
+ export async function createProject(apiKey, name, source) {
53
+ const res = await apiFetch("/api/projects", apiKey, {
54
+ method: "POST",
55
+ body: JSON.stringify({ name, source, mode: "link" }),
56
+ });
57
+ return res.json();
58
+ }
59
+ export async function createSession(apiKey, opts) {
60
+ const res = await apiFetch("/api/sessions", apiKey, {
61
+ method: "POST",
62
+ body: JSON.stringify({
63
+ projectId: opts.projectId,
64
+ source: opts.source,
65
+ status: opts.status ?? "in_progress",
66
+ fileName: opts.fileName ?? null,
67
+ sessionLabel: opts.sessionLabel ?? null,
68
+ }),
69
+ });
70
+ return res.json();
71
+ }
72
+ export async function updateSession(apiKey, sessionId, data) {
73
+ await apiFetch(`/api/sessions/${sessionId}`, apiKey, {
74
+ method: "PATCH",
75
+ body: JSON.stringify(data),
76
+ });
77
+ }
78
+ export async function createSessionComplete(apiKey, opts) {
79
+ const res = await apiFetch("/api/sessions", apiKey, {
80
+ method: "POST",
81
+ body: JSON.stringify({
82
+ projectId: opts.projectId,
83
+ source: opts.source,
84
+ status: "complete",
85
+ analysis: opts.analysis,
86
+ fileName: opts.fileName ?? null,
87
+ rawLog: opts.rawLog ?? null,
88
+ }),
89
+ });
90
+ return res.json();
91
+ }
92
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface ClaudeConfigMetadata {
2
+ claudeMdPresent: boolean;
3
+ skillsUsed: string[];
4
+ pluginsUsed: string[];
5
+ }
6
+ /**
7
+ * Extract skills/plugins used from a Claude Code JSONL transcript.
8
+ * Looks for tool_use blocks referencing known skill patterns.
9
+ */
10
+ export declare function extractSkillsFromTranscript(rawJsonl: string): string[];
11
+ /**
12
+ * Collect all Claude supplementary artifacts for a workspace.
13
+ * Returns both supplementary files (for pipeline) and config metadata.
14
+ */
15
+ export declare function readClaudeArtifacts(workspacePath: string, rawTranscript?: string): {
16
+ supplementaryFiles: Record<string, string>;
17
+ configMetadata: ClaudeConfigMetadata;
18
+ };