@buildlog/openclaw-skill 1.0.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.
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BuildlogExporter = void 0;
4
+ exports.exportSession = exportSession;
5
+ const DEFAULT_OPTIONS = {
6
+ includeSystemMessages: false,
7
+ includeFileContents: true,
8
+ maxFileSizeKb: 100,
9
+ };
10
+ /**
11
+ * BuildlogExporter - Convert session history to buildlog format
12
+ *
13
+ * Supports retroactive export from session_history
14
+ */
15
+ class BuildlogExporter {
16
+ options;
17
+ constructor(options = {}) {
18
+ this.options = { ...DEFAULT_OPTIONS, ...options };
19
+ }
20
+ /**
21
+ * Export a session history to buildlog format
22
+ */
23
+ export(history) {
24
+ const messages = this.filterMessages(history.messages);
25
+ const entries = this.convertToEntries(messages, history);
26
+ const metadata = this.buildMetadata(history, entries);
27
+ return {
28
+ version: '1.0.0',
29
+ metadata,
30
+ entries,
31
+ chapters: this.detectChapters(entries),
32
+ };
33
+ }
34
+ /**
35
+ * Export only the last N messages
36
+ */
37
+ exportLastN(history, n) {
38
+ const limitedHistory = {
39
+ ...history,
40
+ messages: history.messages.slice(-n),
41
+ };
42
+ return this.export(limitedHistory);
43
+ }
44
+ /**
45
+ * Export a range of messages
46
+ */
47
+ exportRange(history, start, end) {
48
+ const limitedHistory = {
49
+ ...history,
50
+ messages: history.messages.slice(start, end),
51
+ };
52
+ return this.export(limitedHistory);
53
+ }
54
+ /**
55
+ * Merge file changes and terminal commands into the timeline
56
+ */
57
+ convertToEntries(messages, history) {
58
+ const entries = [];
59
+ // Create a timeline of all events
60
+ const timeline = [];
61
+ // Add messages to timeline
62
+ for (const msg of messages) {
63
+ timeline.push({
64
+ timestamp: msg.timestamp ?? Date.now(),
65
+ type: 'message',
66
+ data: msg,
67
+ });
68
+ }
69
+ // Add file changes to timeline
70
+ if (history.fileChanges) {
71
+ for (const fc of history.fileChanges) {
72
+ timeline.push({
73
+ timestamp: fc.timestamp ?? Date.now(),
74
+ type: 'file',
75
+ data: fc,
76
+ });
77
+ }
78
+ }
79
+ // Add terminal commands to timeline
80
+ if (history.terminalCommands) {
81
+ for (const cmd of history.terminalCommands) {
82
+ timeline.push({
83
+ timestamp: cmd.timestamp ?? Date.now(),
84
+ type: 'terminal',
85
+ data: cmd,
86
+ });
87
+ }
88
+ }
89
+ // Sort by timestamp
90
+ timeline.sort((a, b) => a.timestamp - b.timestamp);
91
+ // Convert to entries
92
+ for (const event of timeline) {
93
+ switch (event.type) {
94
+ case 'message':
95
+ entries.push(this.messageToEntry(event.data, event.timestamp));
96
+ break;
97
+ case 'file':
98
+ entries.push(this.fileChangeToEntry(event.data, event.timestamp));
99
+ break;
100
+ case 'terminal':
101
+ entries.push(this.terminalToEntry(event.data, event.timestamp));
102
+ break;
103
+ }
104
+ }
105
+ return entries;
106
+ }
107
+ /**
108
+ * Convert a session message to a buildlog entry
109
+ */
110
+ messageToEntry(message, timestamp) {
111
+ const entry = {
112
+ type: message.role === 'user' ? 'user' : 'assistant',
113
+ timestamp,
114
+ content: message.content,
115
+ };
116
+ if (message.toolCalls && message.toolCalls.length > 0) {
117
+ entry.toolCalls = message.toolCalls.map((tc) => ({
118
+ name: tc.name,
119
+ arguments: tc.arguments,
120
+ result: tc.result,
121
+ }));
122
+ }
123
+ if (message.attachments && message.attachments.length > 0) {
124
+ entry.attachments = message.attachments.map((a) => ({
125
+ type: a.type ?? 'file',
126
+ name: a.name,
127
+ content: this.options.includeFileContents
128
+ ? this.truncateContent(a.content)
129
+ : undefined,
130
+ }));
131
+ }
132
+ return entry;
133
+ }
134
+ /**
135
+ * Convert a file change to a buildlog entry
136
+ */
137
+ fileChangeToEntry(fileChange, timestamp) {
138
+ const fc = { ...fileChange };
139
+ if (!this.options.includeFileContents) {
140
+ delete fc.content;
141
+ delete fc.previousContent;
142
+ }
143
+ else {
144
+ if (fc.content) {
145
+ fc.content = this.truncateContent(fc.content);
146
+ }
147
+ if (fc.previousContent) {
148
+ fc.previousContent = this.truncateContent(fc.previousContent);
149
+ }
150
+ }
151
+ return {
152
+ type: 'file_change',
153
+ timestamp,
154
+ fileChange: fc,
155
+ };
156
+ }
157
+ /**
158
+ * Convert a terminal command to a buildlog entry
159
+ */
160
+ terminalToEntry(command, timestamp) {
161
+ return {
162
+ type: 'terminal',
163
+ timestamp,
164
+ command: {
165
+ ...command,
166
+ output: command.output ? this.truncateContent(command.output) : undefined,
167
+ },
168
+ };
169
+ }
170
+ /**
171
+ * Filter messages based on options
172
+ */
173
+ filterMessages(messages) {
174
+ let filtered = messages;
175
+ // Filter out system messages if not included
176
+ if (!this.options.includeSystemMessages) {
177
+ filtered = filtered.filter((m) => m.role !== 'system');
178
+ }
179
+ // Limit to last N if specified
180
+ if (this.options.lastN && this.options.lastN > 0) {
181
+ filtered = filtered.slice(-this.options.lastN);
182
+ }
183
+ return filtered;
184
+ }
185
+ /**
186
+ * Build metadata for the buildlog
187
+ */
188
+ buildMetadata(history, entries) {
189
+ const now = new Date().toISOString();
190
+ const timestamps = entries.map((e) => e.timestamp).filter(Boolean);
191
+ const duration = timestamps.length >= 2
192
+ ? Math.max(...timestamps) - Math.min(...timestamps)
193
+ : 0;
194
+ return {
195
+ id: this.generateId(),
196
+ title: this.options.title ?? this.inferTitle(history) ?? 'Untitled Session',
197
+ description: this.options.description ?? this.inferDescription(history),
198
+ createdAt: now,
199
+ duration,
200
+ entryCount: entries.length,
201
+ tags: this.options.tags ?? this.inferTags(history),
202
+ author: this.options.author,
203
+ ...history.metadata,
204
+ };
205
+ }
206
+ /**
207
+ * Try to infer a title from the session content
208
+ */
209
+ inferTitle(history) {
210
+ // Look for the first substantial user message
211
+ const firstUserMessage = history.messages.find((m) => m.role === 'user' && m.content.length > 10);
212
+ if (!firstUserMessage) {
213
+ return undefined;
214
+ }
215
+ // Extract first line or first 50 chars
216
+ const content = firstUserMessage.content;
217
+ const firstLine = content.split('\n')[0];
218
+ if (firstLine.length <= 60) {
219
+ return firstLine;
220
+ }
221
+ return firstLine.slice(0, 57) + '...';
222
+ }
223
+ /**
224
+ * Try to infer a description from the session
225
+ */
226
+ inferDescription(history) {
227
+ const messageCount = history.messages.filter((m) => m.role !== 'system').length;
228
+ const fileCount = history.fileChanges?.length ?? 0;
229
+ const cmdCount = history.terminalCommands?.length ?? 0;
230
+ const parts = [];
231
+ if (messageCount > 0)
232
+ parts.push(`${messageCount} messages`);
233
+ if (fileCount > 0)
234
+ parts.push(`${fileCount} file changes`);
235
+ if (cmdCount > 0)
236
+ parts.push(`${cmdCount} commands`);
237
+ return parts.length > 0 ? `Session with ${parts.join(', ')}` : undefined;
238
+ }
239
+ /**
240
+ * Try to infer tags from file extensions and content
241
+ */
242
+ inferTags(history) {
243
+ const tags = new Set();
244
+ // Infer from file extensions
245
+ if (history.fileChanges) {
246
+ for (const fc of history.fileChanges) {
247
+ const ext = fc.path.split('.').pop()?.toLowerCase();
248
+ if (ext) {
249
+ const langMap = {
250
+ ts: 'typescript',
251
+ tsx: 'typescript',
252
+ js: 'javascript',
253
+ jsx: 'javascript',
254
+ py: 'python',
255
+ rs: 'rust',
256
+ go: 'go',
257
+ rb: 'ruby',
258
+ java: 'java',
259
+ cpp: 'c++',
260
+ c: 'c',
261
+ cs: 'csharp',
262
+ swift: 'swift',
263
+ kt: 'kotlin',
264
+ };
265
+ if (langMap[ext]) {
266
+ tags.add(langMap[ext]);
267
+ }
268
+ }
269
+ }
270
+ }
271
+ // Look for common keywords in messages
272
+ const allContent = history.messages.map((m) => m.content).join(' ').toLowerCase();
273
+ const keywords = [
274
+ 'react', 'vue', 'angular', 'node', 'express', 'api', 'database',
275
+ 'testing', 'docker', 'kubernetes', 'aws', 'git', 'debug',
276
+ ];
277
+ for (const kw of keywords) {
278
+ if (allContent.includes(kw)) {
279
+ tags.add(kw);
280
+ }
281
+ }
282
+ return Array.from(tags).slice(0, 10);
283
+ }
284
+ /**
285
+ * Detect natural chapter breaks in the content
286
+ */
287
+ detectChapters(entries) {
288
+ const chapters = [];
289
+ for (let i = 0; i < entries.length; i++) {
290
+ const entry = entries[i];
291
+ // Look for user messages that start a new topic
292
+ if (entry.type === 'user' && entry.content) {
293
+ const content = entry.content.toLowerCase();
294
+ // Check for chapter-like phrases
295
+ const chapterPatterns = [
296
+ /^(now|next|let's|let us|can you|please)\s+(create|build|add|implement|fix|update|refactor)/i,
297
+ /^(step|part|phase)\s+\d+/i,
298
+ /^(first|second|third|finally|lastly)/i,
299
+ ];
300
+ for (const pattern of chapterPatterns) {
301
+ if (pattern.test(content)) {
302
+ const title = this.extractChapterTitle(entry.content);
303
+ chapters.push({ title, startIndex: i });
304
+ break;
305
+ }
306
+ }
307
+ }
308
+ }
309
+ return chapters;
310
+ }
311
+ /**
312
+ * Extract a chapter title from a message
313
+ */
314
+ extractChapterTitle(content) {
315
+ const firstLine = content.split('\n')[0];
316
+ if (firstLine.length <= 50) {
317
+ return firstLine;
318
+ }
319
+ return firstLine.slice(0, 47) + '...';
320
+ }
321
+ /**
322
+ * Truncate content to max size
323
+ */
324
+ truncateContent(content) {
325
+ const maxBytes = (this.options.maxFileSizeKb ?? 100) * 1024;
326
+ if (content.length <= maxBytes) {
327
+ return content;
328
+ }
329
+ return content.slice(0, maxBytes) + '\n... [truncated]';
330
+ }
331
+ /**
332
+ * Generate a unique ID
333
+ */
334
+ generateId() {
335
+ return `bl_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
336
+ }
337
+ }
338
+ exports.BuildlogExporter = BuildlogExporter;
339
+ /**
340
+ * Convenience function to export a session
341
+ */
342
+ function exportSession(history, options = {}) {
343
+ const exporter = new BuildlogExporter(options);
344
+ return exporter.export(history);
345
+ }
346
+ //# sourceMappingURL=exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @buildlog/openclaw-skill
3
+ *
4
+ * Record, export, and share your AI coding sessions as replayable buildlogs.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { BuildlogSkill, createBuildlogSkill } from '@buildlog/openclaw-skill';
9
+ *
10
+ * const skill = createBuildlogSkill({
11
+ * apiKey: 'your-api-key',
12
+ * autoUpload: false,
13
+ * defaultPublic: true,
14
+ * });
15
+ *
16
+ * await skill.initialize(openClawContext);
17
+ * ```
18
+ */
19
+ export { BuildlogSkill, createBuildlogSkill } from './skill.js';
20
+ export type { SkillConfig, OpenClawContext, CommandMatch } from './skill.js';
21
+ export { BuildlogRecorder } from './recorder.js';
22
+ export type { RecorderState, RecorderConfig, RecordingSession, Note, Chapter, OpenClawEvent, UserMessageEvent, AssistantMessageEvent, FileChangeEvent, TerminalCommandEvent, } from './recorder.js';
23
+ export { BuildlogExporter, exportSession } from './exporter.js';
24
+ export type { SessionMessage, SessionHistory, ExportOptions, } from './exporter.js';
25
+ export { BuildlogUploader, UploadError, uploadBuildlog } from './uploader.js';
26
+ export type { UploadConfig, UploadOptions, UploadResult, BuildlogInfo, } from './uploader.js';
27
+ export type { Buildlog, BuildlogEntry, BuildlogMetadata, FileChange, TerminalCommand, BuildlogChapter, } from './types.js';
28
+ import { BuildlogSkill } from './skill.js';
29
+ export default BuildlogSkill;
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,IAAI,EACJ,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EACV,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,YAAY,GACb,MAAM,eAAe,CAAC;AAGvB,YAAY,EACV,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,eAAe,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /**
3
+ * @buildlog/openclaw-skill
4
+ *
5
+ * Record, export, and share your AI coding sessions as replayable buildlogs.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { BuildlogSkill, createBuildlogSkill } from '@buildlog/openclaw-skill';
10
+ *
11
+ * const skill = createBuildlogSkill({
12
+ * apiKey: 'your-api-key',
13
+ * autoUpload: false,
14
+ * defaultPublic: true,
15
+ * });
16
+ *
17
+ * await skill.initialize(openClawContext);
18
+ * ```
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.uploadBuildlog = exports.UploadError = exports.BuildlogUploader = exports.exportSession = exports.BuildlogExporter = exports.BuildlogRecorder = exports.createBuildlogSkill = exports.BuildlogSkill = void 0;
22
+ // Main skill export
23
+ var skill_js_1 = require("./skill.js");
24
+ Object.defineProperty(exports, "BuildlogSkill", { enumerable: true, get: function () { return skill_js_1.BuildlogSkill; } });
25
+ Object.defineProperty(exports, "createBuildlogSkill", { enumerable: true, get: function () { return skill_js_1.createBuildlogSkill; } });
26
+ // Recorder exports
27
+ var recorder_js_1 = require("./recorder.js");
28
+ Object.defineProperty(exports, "BuildlogRecorder", { enumerable: true, get: function () { return recorder_js_1.BuildlogRecorder; } });
29
+ // Exporter exports
30
+ var exporter_js_1 = require("./exporter.js");
31
+ Object.defineProperty(exports, "BuildlogExporter", { enumerable: true, get: function () { return exporter_js_1.BuildlogExporter; } });
32
+ Object.defineProperty(exports, "exportSession", { enumerable: true, get: function () { return exporter_js_1.exportSession; } });
33
+ // Uploader exports
34
+ var uploader_js_1 = require("./uploader.js");
35
+ Object.defineProperty(exports, "BuildlogUploader", { enumerable: true, get: function () { return uploader_js_1.BuildlogUploader; } });
36
+ Object.defineProperty(exports, "UploadError", { enumerable: true, get: function () { return uploader_js_1.UploadError; } });
37
+ Object.defineProperty(exports, "uploadBuildlog", { enumerable: true, get: function () { return uploader_js_1.uploadBuildlog; } });
38
+ // Default export for OpenClaw skill registration
39
+ const skill_js_2 = require("./skill.js");
40
+ exports.default = skill_js_2.BuildlogSkill;
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAEH,oBAAoB;AACpB,uCAAgE;AAAvD,yGAAA,aAAa,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAG3C,mBAAmB;AACnB,6CAAiD;AAAxC,+GAAA,gBAAgB,OAAA;AAczB,mBAAmB;AACnB,6CAAgE;AAAvD,+GAAA,gBAAgB,OAAA;AAAE,4GAAA,aAAa,OAAA;AAOxC,mBAAmB;AACnB,6CAA8E;AAArE,+GAAA,gBAAgB,OAAA;AAAE,0GAAA,WAAW,OAAA;AAAE,6GAAA,cAAc,OAAA;AAkBtD,iDAAiD;AACjD,yCAA2C;AAC3C,kBAAe,wBAAa,CAAC"}
@@ -0,0 +1,145 @@
1
+ import type { Buildlog, BuildlogEntry, BuildlogMetadata, FileChange, TerminalCommand } from './types.js';
2
+ export type RecorderState = 'idle' | 'recording' | 'paused';
3
+ export interface RecorderConfig {
4
+ includeFileContents: boolean;
5
+ maxFileSizeKb: number;
6
+ }
7
+ export interface Note {
8
+ timestamp: number;
9
+ text: string;
10
+ entryIndex: number;
11
+ }
12
+ export interface Chapter {
13
+ title: string;
14
+ entryIndex: number;
15
+ timestamp: number;
16
+ }
17
+ export interface RecordingSession {
18
+ id: string;
19
+ title: string;
20
+ startedAt: number;
21
+ entries: BuildlogEntry[];
22
+ notes: Note[];
23
+ chapters: Chapter[];
24
+ metadata: Partial<BuildlogMetadata>;
25
+ }
26
+ export interface OpenClawEvent {
27
+ type: 'user_message' | 'assistant_message' | 'file_change' | 'terminal_command' | 'tool_use';
28
+ timestamp: number;
29
+ data: unknown;
30
+ }
31
+ export interface UserMessageEvent extends OpenClawEvent {
32
+ type: 'user_message';
33
+ data: {
34
+ content: string;
35
+ attachments?: Array<{
36
+ name: string;
37
+ content: string;
38
+ }>;
39
+ };
40
+ }
41
+ export interface AssistantMessageEvent extends OpenClawEvent {
42
+ type: 'assistant_message';
43
+ data: {
44
+ content: string;
45
+ toolCalls?: Array<{
46
+ name: string;
47
+ arguments: Record<string, unknown>;
48
+ }>;
49
+ };
50
+ }
51
+ export interface FileChangeEvent extends OpenClawEvent {
52
+ type: 'file_change';
53
+ data: FileChange;
54
+ }
55
+ export interface TerminalCommandEvent extends OpenClawEvent {
56
+ type: 'terminal_command';
57
+ data: TerminalCommand;
58
+ }
59
+ type EventHandler = (event: OpenClawEvent) => void;
60
+ /**
61
+ * BuildlogRecorder - State machine for recording OpenClaw sessions
62
+ *
63
+ * States: idle -> recording <-> paused -> idle
64
+ */
65
+ export declare class BuildlogRecorder {
66
+ private state;
67
+ private session;
68
+ private config;
69
+ private eventHandlers;
70
+ private pendingUserMessage;
71
+ constructor(config?: Partial<RecorderConfig>);
72
+ /**
73
+ * Get current recorder state
74
+ */
75
+ getState(): RecorderState;
76
+ /**
77
+ * Get current session if recording
78
+ */
79
+ getSession(): RecordingSession | null;
80
+ /**
81
+ * Check if actively recording (not paused)
82
+ */
83
+ isRecording(): boolean;
84
+ /**
85
+ * Start a new recording session
86
+ */
87
+ start(title: string, metadata?: Partial<BuildlogMetadata>): void;
88
+ /**
89
+ * Stop recording and return the session
90
+ */
91
+ stop(): RecordingSession | null;
92
+ /**
93
+ * Pause recording
94
+ */
95
+ pause(): void;
96
+ /**
97
+ * Resume recording
98
+ */
99
+ resume(): void;
100
+ /**
101
+ * Process an OpenClaw event
102
+ */
103
+ handleEvent(event: OpenClawEvent): void;
104
+ /**
105
+ * Add a note at the current position
106
+ */
107
+ addNote(text: string): void;
108
+ /**
109
+ * Add a chapter marker
110
+ */
111
+ addChapter(title: string): void;
112
+ /**
113
+ * Mark the last entry as important
114
+ */
115
+ markImportant(): void;
116
+ /**
117
+ * Get recording status
118
+ */
119
+ getStatus(): {
120
+ state: RecorderState;
121
+ sessionId?: string;
122
+ title?: string;
123
+ entryCount: number;
124
+ duration: number;
125
+ noteCount: number;
126
+ chapterCount: number;
127
+ };
128
+ /**
129
+ * Convert session to Buildlog format
130
+ */
131
+ toBuildlog(): Buildlog | null;
132
+ /**
133
+ * Subscribe to recorder events
134
+ */
135
+ on(event: string, handler: EventHandler): () => void;
136
+ private handleUserMessage;
137
+ private handleAssistantMessage;
138
+ private handleFileChange;
139
+ private handleTerminalCommand;
140
+ private truncateContent;
141
+ private generateId;
142
+ private emit;
143
+ }
144
+ export {};
145
+ //# sourceMappingURL=recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}