@buildlog/types 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.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/index.cjs +456 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2515 -0
- package/dist/index.d.ts +2515 -0
- package/dist/index.js +406 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 buildlogai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# @buildlog/types
|
|
2
|
+
|
|
3
|
+
Type definitions and Zod schemas for the `.buildlog` file format.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @buildlog/types
|
|
9
|
+
# or
|
|
10
|
+
pnpm add @buildlog/types
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
### TypeScript Types
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import type { BuildlogFile, BuildlogEvent, PromptEvent } from '@buildlog/types';
|
|
19
|
+
|
|
20
|
+
const buildlog: BuildlogFile = {
|
|
21
|
+
version: '1.0.0',
|
|
22
|
+
metadata: { /* ... */ },
|
|
23
|
+
initialState: { files: [] },
|
|
24
|
+
events: [],
|
|
25
|
+
finalState: { files: [] },
|
|
26
|
+
};
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Validation
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { validateBuildlog, parseBuildlog } from '@buildlog/types';
|
|
33
|
+
|
|
34
|
+
// Validate unknown data
|
|
35
|
+
const result = validateBuildlog(data);
|
|
36
|
+
if (result.valid) {
|
|
37
|
+
console.log('Valid buildlog!');
|
|
38
|
+
} else {
|
|
39
|
+
console.error('Errors:', result.errors);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Parse and validate JSON
|
|
43
|
+
const buildlog = parseBuildlog(jsonString);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Utilities
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
import {
|
|
50
|
+
isBuildlogFile,
|
|
51
|
+
computeStats,
|
|
52
|
+
formatDuration,
|
|
53
|
+
detectLanguage,
|
|
54
|
+
} from '@buildlog/types';
|
|
55
|
+
|
|
56
|
+
isBuildlogFile('session.buildlog'); // true
|
|
57
|
+
detectLanguage('app.tsx'); // 'typescript'
|
|
58
|
+
formatDuration(125); // '2:05'
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## File Format
|
|
62
|
+
|
|
63
|
+
See [buildlog.ai/docs/format](https://buildlog.ai/docs/format) for the full specification.
|
|
64
|
+
|
|
65
|
+
## License
|
|
66
|
+
|
|
67
|
+
MIT
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zod = require('zod');
|
|
4
|
+
|
|
5
|
+
// src/schema.ts
|
|
6
|
+
var EditorTypeSchema = zod.z.enum([
|
|
7
|
+
"cursor",
|
|
8
|
+
"vscode",
|
|
9
|
+
"windsurf",
|
|
10
|
+
"zed",
|
|
11
|
+
"neovim",
|
|
12
|
+
"jetbrains",
|
|
13
|
+
"openclaw",
|
|
14
|
+
"other"
|
|
15
|
+
]);
|
|
16
|
+
var AIProviderSchema = zod.z.enum([
|
|
17
|
+
"claude",
|
|
18
|
+
"gpt",
|
|
19
|
+
"copilot",
|
|
20
|
+
"gemini",
|
|
21
|
+
"other"
|
|
22
|
+
]);
|
|
23
|
+
var ChangeSourceSchema = zod.z.enum([
|
|
24
|
+
"manual",
|
|
25
|
+
"ai_accepted",
|
|
26
|
+
"ai_partial",
|
|
27
|
+
"ai_rejected_then_manual"
|
|
28
|
+
]);
|
|
29
|
+
var NoteCategorySchema = zod.z.enum([
|
|
30
|
+
"explanation",
|
|
31
|
+
"gotcha",
|
|
32
|
+
"tip",
|
|
33
|
+
"warning",
|
|
34
|
+
"todo"
|
|
35
|
+
]);
|
|
36
|
+
var ErrorCategorySchema = zod.z.enum([
|
|
37
|
+
"build",
|
|
38
|
+
"runtime",
|
|
39
|
+
"lint",
|
|
40
|
+
"type",
|
|
41
|
+
"test",
|
|
42
|
+
"other"
|
|
43
|
+
]);
|
|
44
|
+
var BuildlogAuthorSchema = zod.z.object({
|
|
45
|
+
name: zod.z.string().optional(),
|
|
46
|
+
username: zod.z.string().optional(),
|
|
47
|
+
url: zod.z.string().url().optional(),
|
|
48
|
+
avatarUrl: zod.z.string().url().optional()
|
|
49
|
+
});
|
|
50
|
+
var BuildlogProjectSchema = zod.z.object({
|
|
51
|
+
name: zod.z.string().optional(),
|
|
52
|
+
repository: zod.z.string().optional(),
|
|
53
|
+
branch: zod.z.string().optional(),
|
|
54
|
+
commit: zod.z.string().optional()
|
|
55
|
+
});
|
|
56
|
+
var FileSnapshotSchema = zod.z.object({
|
|
57
|
+
path: zod.z.string().min(1),
|
|
58
|
+
content: zod.z.string(),
|
|
59
|
+
language: zod.z.string(),
|
|
60
|
+
sizeBytes: zod.z.number().int().nonnegative().optional(),
|
|
61
|
+
hash: zod.z.string().optional()
|
|
62
|
+
});
|
|
63
|
+
var BuildlogStateSchema = zod.z.object({
|
|
64
|
+
files: zod.z.array(FileSnapshotSchema),
|
|
65
|
+
fileTree: zod.z.array(zod.z.string()).optional()
|
|
66
|
+
});
|
|
67
|
+
var TextSelectionSchema = zod.z.object({
|
|
68
|
+
filePath: zod.z.string(),
|
|
69
|
+
startLine: zod.z.number().int().nonnegative(),
|
|
70
|
+
endLine: zod.z.number().int().nonnegative(),
|
|
71
|
+
text: zod.z.string()
|
|
72
|
+
});
|
|
73
|
+
var CodeBlockSchema = zod.z.object({
|
|
74
|
+
language: zod.z.string(),
|
|
75
|
+
code: zod.z.string(),
|
|
76
|
+
filePath: zod.z.string().optional(),
|
|
77
|
+
startLine: zod.z.number().int().nonnegative().optional()
|
|
78
|
+
});
|
|
79
|
+
var TokenUsageSchema = zod.z.object({
|
|
80
|
+
input: zod.z.number().int().nonnegative().optional(),
|
|
81
|
+
output: zod.z.number().int().nonnegative().optional()
|
|
82
|
+
});
|
|
83
|
+
var LinesChangedSchema = zod.z.object({
|
|
84
|
+
added: zod.z.number().int().nonnegative(),
|
|
85
|
+
removed: zod.z.number().int().nonnegative()
|
|
86
|
+
});
|
|
87
|
+
var NoteReferenceSchema = zod.z.object({
|
|
88
|
+
filePath: zod.z.string(),
|
|
89
|
+
startLine: zod.z.number().int().nonnegative().optional(),
|
|
90
|
+
endLine: zod.z.number().int().nonnegative().optional()
|
|
91
|
+
});
|
|
92
|
+
var BaseEventSchema = zod.z.object({
|
|
93
|
+
id: zod.z.string().uuid(),
|
|
94
|
+
timestamp: zod.z.number().nonnegative(),
|
|
95
|
+
sequence: zod.z.number().int().nonnegative()
|
|
96
|
+
});
|
|
97
|
+
var PromptEventSchema = BaseEventSchema.extend({
|
|
98
|
+
type: zod.z.literal("prompt"),
|
|
99
|
+
content: zod.z.string().min(1),
|
|
100
|
+
contextFiles: zod.z.array(zod.z.string()).optional(),
|
|
101
|
+
selection: TextSelectionSchema.optional(),
|
|
102
|
+
provider: AIProviderSchema.optional(),
|
|
103
|
+
model: zod.z.string().optional()
|
|
104
|
+
});
|
|
105
|
+
var AIResponseEventSchema = BaseEventSchema.extend({
|
|
106
|
+
type: zod.z.literal("ai_response"),
|
|
107
|
+
content: zod.z.string(),
|
|
108
|
+
codeBlocks: zod.z.array(CodeBlockSchema).optional(),
|
|
109
|
+
promptEventId: zod.z.string().uuid().optional(),
|
|
110
|
+
provider: AIProviderSchema.optional(),
|
|
111
|
+
model: zod.z.string().optional(),
|
|
112
|
+
tokenUsage: TokenUsageSchema.optional()
|
|
113
|
+
});
|
|
114
|
+
var CodeChangeEventSchema = BaseEventSchema.extend({
|
|
115
|
+
type: zod.z.literal("code_change"),
|
|
116
|
+
filePath: zod.z.string().min(1),
|
|
117
|
+
diff: zod.z.string(),
|
|
118
|
+
source: ChangeSourceSchema,
|
|
119
|
+
linesChanged: LinesChangedSchema.optional(),
|
|
120
|
+
aiResponseEventId: zod.z.string().uuid().optional()
|
|
121
|
+
});
|
|
122
|
+
var FileCreateEventSchema = BaseEventSchema.extend({
|
|
123
|
+
type: zod.z.literal("file_create"),
|
|
124
|
+
filePath: zod.z.string().min(1),
|
|
125
|
+
content: zod.z.string(),
|
|
126
|
+
language: zod.z.string(),
|
|
127
|
+
source: zod.z.enum(["manual", "ai_accepted"]),
|
|
128
|
+
aiResponseEventId: zod.z.string().uuid().optional()
|
|
129
|
+
});
|
|
130
|
+
var FileDeleteEventSchema = BaseEventSchema.extend({
|
|
131
|
+
type: zod.z.literal("file_delete"),
|
|
132
|
+
filePath: zod.z.string().min(1),
|
|
133
|
+
previousContent: zod.z.string().optional()
|
|
134
|
+
});
|
|
135
|
+
var FileRenameEventSchema = BaseEventSchema.extend({
|
|
136
|
+
type: zod.z.literal("file_rename"),
|
|
137
|
+
fromPath: zod.z.string().min(1),
|
|
138
|
+
toPath: zod.z.string().min(1)
|
|
139
|
+
});
|
|
140
|
+
var TerminalEventSchema = BaseEventSchema.extend({
|
|
141
|
+
type: zod.z.literal("terminal"),
|
|
142
|
+
command: zod.z.string().min(1),
|
|
143
|
+
output: zod.z.string().optional(),
|
|
144
|
+
exitCode: zod.z.number().int().optional(),
|
|
145
|
+
cwd: zod.z.string().optional(),
|
|
146
|
+
durationSeconds: zod.z.number().nonnegative().optional()
|
|
147
|
+
});
|
|
148
|
+
var NoteEventSchema = BaseEventSchema.extend({
|
|
149
|
+
type: zod.z.literal("note"),
|
|
150
|
+
content: zod.z.string().min(1),
|
|
151
|
+
category: NoteCategorySchema.optional(),
|
|
152
|
+
reference: NoteReferenceSchema.optional()
|
|
153
|
+
});
|
|
154
|
+
var CheckpointEventSchema = BaseEventSchema.extend({
|
|
155
|
+
type: zod.z.literal("checkpoint"),
|
|
156
|
+
name: zod.z.string().min(1),
|
|
157
|
+
description: zod.z.string().optional(),
|
|
158
|
+
state: BuildlogStateSchema.optional()
|
|
159
|
+
});
|
|
160
|
+
var ErrorEventSchema = BaseEventSchema.extend({
|
|
161
|
+
type: zod.z.literal("error"),
|
|
162
|
+
message: zod.z.string().min(1),
|
|
163
|
+
category: ErrorCategorySchema,
|
|
164
|
+
filePath: zod.z.string().optional(),
|
|
165
|
+
line: zod.z.number().int().nonnegative().optional(),
|
|
166
|
+
stackTrace: zod.z.string().optional(),
|
|
167
|
+
resolved: zod.z.boolean().optional(),
|
|
168
|
+
resolvedByEventId: zod.z.string().uuid().optional()
|
|
169
|
+
});
|
|
170
|
+
var BuildlogEventSchema = zod.z.discriminatedUnion("type", [
|
|
171
|
+
PromptEventSchema,
|
|
172
|
+
AIResponseEventSchema,
|
|
173
|
+
CodeChangeEventSchema,
|
|
174
|
+
FileCreateEventSchema,
|
|
175
|
+
FileDeleteEventSchema,
|
|
176
|
+
FileRenameEventSchema,
|
|
177
|
+
TerminalEventSchema,
|
|
178
|
+
NoteEventSchema,
|
|
179
|
+
CheckpointEventSchema,
|
|
180
|
+
ErrorEventSchema
|
|
181
|
+
]);
|
|
182
|
+
var BuildlogMetadataSchema = zod.z.object({
|
|
183
|
+
id: zod.z.string().uuid(),
|
|
184
|
+
title: zod.z.string().min(1).max(200),
|
|
185
|
+
description: zod.z.string().max(2e3).optional(),
|
|
186
|
+
author: BuildlogAuthorSchema.optional(),
|
|
187
|
+
createdAt: zod.z.string().datetime(),
|
|
188
|
+
updatedAt: zod.z.string().datetime().optional(),
|
|
189
|
+
durationSeconds: zod.z.number().int().nonnegative(),
|
|
190
|
+
editor: EditorTypeSchema,
|
|
191
|
+
aiProviders: zod.z.array(AIProviderSchema).optional(),
|
|
192
|
+
primaryLanguage: zod.z.string().optional(),
|
|
193
|
+
languages: zod.z.array(zod.z.string()).optional(),
|
|
194
|
+
tags: zod.z.array(zod.z.string().max(50)).max(20).optional(),
|
|
195
|
+
project: BuildlogProjectSchema.optional(),
|
|
196
|
+
custom: zod.z.record(zod.z.unknown()).optional()
|
|
197
|
+
});
|
|
198
|
+
var BuildlogFileSchema = zod.z.object({
|
|
199
|
+
version: zod.z.literal("1.0.0"),
|
|
200
|
+
metadata: BuildlogMetadataSchema,
|
|
201
|
+
initialState: BuildlogStateSchema,
|
|
202
|
+
events: zod.z.array(BuildlogEventSchema),
|
|
203
|
+
finalState: BuildlogStateSchema
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// src/constants.ts
|
|
207
|
+
var BUILDLOG_VERSION = "1.0.0";
|
|
208
|
+
var BUILDLOG_MIME_TYPE = "application/vnd.buildlog+json";
|
|
209
|
+
var BUILDLOG_EXTENSIONS = [".buildlog", ".vibe"];
|
|
210
|
+
var BUILDLOG_DEFAULT_EXTENSION = ".buildlog";
|
|
211
|
+
var BUILDLOG_MAX_SIZE_BYTES = 10 * 1024 * 1024;
|
|
212
|
+
var BUILDLOG_MAX_EVENTS = 1e4;
|
|
213
|
+
var BUILDLOG_MAX_TITLE_LENGTH = 200;
|
|
214
|
+
var BUILDLOG_MAX_DESCRIPTION_LENGTH = 2e3;
|
|
215
|
+
var BUILDLOG_MAX_TAGS = 20;
|
|
216
|
+
var BUILDLOG_MAX_TAG_LENGTH = 50;
|
|
217
|
+
|
|
218
|
+
// src/utils.ts
|
|
219
|
+
function isBuildlogFile(filename) {
|
|
220
|
+
const lower = filename.toLowerCase();
|
|
221
|
+
return BUILDLOG_EXTENSIONS.some((ext) => lower.endsWith(ext));
|
|
222
|
+
}
|
|
223
|
+
function getBuildlogExtension() {
|
|
224
|
+
return ".buildlog";
|
|
225
|
+
}
|
|
226
|
+
function getBuildlogMimeType() {
|
|
227
|
+
return BUILDLOG_MIME_TYPE;
|
|
228
|
+
}
|
|
229
|
+
function validateBuildlog(data) {
|
|
230
|
+
const result = BuildlogFileSchema.safeParse(data);
|
|
231
|
+
if (result.success) {
|
|
232
|
+
return { valid: true };
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
valid: false,
|
|
236
|
+
errors: result.error.issues.map((issue) => ({
|
|
237
|
+
path: issue.path.join("."),
|
|
238
|
+
message: issue.message,
|
|
239
|
+
code: issue.code
|
|
240
|
+
}))
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function parseBuildlog(json) {
|
|
244
|
+
const data = JSON.parse(json);
|
|
245
|
+
const result = BuildlogFileSchema.parse(data);
|
|
246
|
+
return result;
|
|
247
|
+
}
|
|
248
|
+
function safeParseBuildlog(json) {
|
|
249
|
+
try {
|
|
250
|
+
return parseBuildlog(json);
|
|
251
|
+
} catch {
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function computeStats(buildlog) {
|
|
256
|
+
const stats = {
|
|
257
|
+
durationSeconds: buildlog.metadata.durationSeconds,
|
|
258
|
+
eventCount: buildlog.events.length,
|
|
259
|
+
promptCount: 0,
|
|
260
|
+
responseCount: 0,
|
|
261
|
+
fileCount: buildlog.finalState.files.length,
|
|
262
|
+
linesAdded: 0,
|
|
263
|
+
linesRemoved: 0,
|
|
264
|
+
languages: []
|
|
265
|
+
};
|
|
266
|
+
const languageSet = /* @__PURE__ */ new Set();
|
|
267
|
+
for (const event of buildlog.events) {
|
|
268
|
+
switch (event.type) {
|
|
269
|
+
case "prompt":
|
|
270
|
+
stats.promptCount++;
|
|
271
|
+
break;
|
|
272
|
+
case "ai_response":
|
|
273
|
+
stats.responseCount++;
|
|
274
|
+
break;
|
|
275
|
+
case "code_change":
|
|
276
|
+
if (event.linesChanged) {
|
|
277
|
+
stats.linesAdded += event.linesChanged.added;
|
|
278
|
+
stats.linesRemoved += event.linesChanged.removed;
|
|
279
|
+
}
|
|
280
|
+
break;
|
|
281
|
+
case "file_create":
|
|
282
|
+
languageSet.add(event.language);
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
for (const file of buildlog.finalState.files) {
|
|
287
|
+
languageSet.add(file.language);
|
|
288
|
+
}
|
|
289
|
+
stats.languages = Array.from(languageSet).sort();
|
|
290
|
+
return stats;
|
|
291
|
+
}
|
|
292
|
+
function formatDuration(seconds) {
|
|
293
|
+
const hours = Math.floor(seconds / 3600);
|
|
294
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
295
|
+
const secs = seconds % 60;
|
|
296
|
+
if (hours > 0) {
|
|
297
|
+
return `${hours}:${minutes.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}`;
|
|
298
|
+
}
|
|
299
|
+
return `${minutes}:${secs.toString().padStart(2, "0")}`;
|
|
300
|
+
}
|
|
301
|
+
function getEventIcon(event) {
|
|
302
|
+
const icons = {
|
|
303
|
+
prompt: "\u{1F4AC}",
|
|
304
|
+
ai_response: "\u{1F916}",
|
|
305
|
+
code_change: "\u270F\uFE0F",
|
|
306
|
+
file_create: "\u{1F4C4}",
|
|
307
|
+
file_delete: "\u{1F5D1}\uFE0F",
|
|
308
|
+
file_rename: "\u{1F4C1}",
|
|
309
|
+
terminal: "\u{1F5A5}\uFE0F",
|
|
310
|
+
note: "\u{1F4DD}",
|
|
311
|
+
checkpoint: "\u{1F6A9}",
|
|
312
|
+
error: "\u274C"
|
|
313
|
+
};
|
|
314
|
+
return icons[event.type];
|
|
315
|
+
}
|
|
316
|
+
function getEventLabel(event) {
|
|
317
|
+
const labels = {
|
|
318
|
+
prompt: "Prompt",
|
|
319
|
+
ai_response: "AI Response",
|
|
320
|
+
code_change: "Code Change",
|
|
321
|
+
file_create: "File Created",
|
|
322
|
+
file_delete: "File Deleted",
|
|
323
|
+
file_rename: "File Renamed",
|
|
324
|
+
terminal: "Terminal",
|
|
325
|
+
note: "Note",
|
|
326
|
+
checkpoint: "Checkpoint",
|
|
327
|
+
error: "Error"
|
|
328
|
+
};
|
|
329
|
+
return labels[event.type];
|
|
330
|
+
}
|
|
331
|
+
function detectLanguage(filePath) {
|
|
332
|
+
const ext = filePath.split(".").pop()?.toLowerCase();
|
|
333
|
+
const languageMap = {
|
|
334
|
+
ts: "typescript",
|
|
335
|
+
tsx: "typescript",
|
|
336
|
+
js: "javascript",
|
|
337
|
+
jsx: "javascript",
|
|
338
|
+
mjs: "javascript",
|
|
339
|
+
cjs: "javascript",
|
|
340
|
+
py: "python",
|
|
341
|
+
rb: "ruby",
|
|
342
|
+
go: "go",
|
|
343
|
+
rs: "rust",
|
|
344
|
+
java: "java",
|
|
345
|
+
kt: "kotlin",
|
|
346
|
+
kts: "kotlin",
|
|
347
|
+
swift: "swift",
|
|
348
|
+
cpp: "cpp",
|
|
349
|
+
cc: "cpp",
|
|
350
|
+
cxx: "cpp",
|
|
351
|
+
c: "c",
|
|
352
|
+
h: "c",
|
|
353
|
+
hpp: "cpp",
|
|
354
|
+
cs: "csharp",
|
|
355
|
+
php: "php",
|
|
356
|
+
css: "css",
|
|
357
|
+
scss: "scss",
|
|
358
|
+
sass: "sass",
|
|
359
|
+
less: "less",
|
|
360
|
+
html: "html",
|
|
361
|
+
htm: "html",
|
|
362
|
+
vue: "vue",
|
|
363
|
+
svelte: "svelte",
|
|
364
|
+
json: "json",
|
|
365
|
+
yaml: "yaml",
|
|
366
|
+
yml: "yaml",
|
|
367
|
+
toml: "toml",
|
|
368
|
+
xml: "xml",
|
|
369
|
+
md: "markdown",
|
|
370
|
+
mdx: "markdown",
|
|
371
|
+
sql: "sql",
|
|
372
|
+
sh: "bash",
|
|
373
|
+
bash: "bash",
|
|
374
|
+
zsh: "bash",
|
|
375
|
+
fish: "fish",
|
|
376
|
+
ps1: "powershell",
|
|
377
|
+
dockerfile: "dockerfile",
|
|
378
|
+
makefile: "makefile",
|
|
379
|
+
cmake: "cmake",
|
|
380
|
+
tf: "terraform",
|
|
381
|
+
hcl: "hcl",
|
|
382
|
+
graphql: "graphql",
|
|
383
|
+
gql: "graphql",
|
|
384
|
+
proto: "protobuf",
|
|
385
|
+
r: "r",
|
|
386
|
+
scala: "scala",
|
|
387
|
+
clj: "clojure",
|
|
388
|
+
ex: "elixir",
|
|
389
|
+
exs: "elixir",
|
|
390
|
+
erl: "erlang",
|
|
391
|
+
hs: "haskell",
|
|
392
|
+
lua: "lua",
|
|
393
|
+
pl: "perl",
|
|
394
|
+
dart: "dart",
|
|
395
|
+
nim: "nim",
|
|
396
|
+
zig: "zig",
|
|
397
|
+
v: "v",
|
|
398
|
+
sol: "solidity"
|
|
399
|
+
};
|
|
400
|
+
return languageMap[ext || ""] || "plaintext";
|
|
401
|
+
}
|
|
402
|
+
function slugify(title) {
|
|
403
|
+
return title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 50);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
exports.AIProviderSchema = AIProviderSchema;
|
|
407
|
+
exports.AIResponseEventSchema = AIResponseEventSchema;
|
|
408
|
+
exports.BUILDLOG_DEFAULT_EXTENSION = BUILDLOG_DEFAULT_EXTENSION;
|
|
409
|
+
exports.BUILDLOG_EXTENSIONS = BUILDLOG_EXTENSIONS;
|
|
410
|
+
exports.BUILDLOG_MAX_DESCRIPTION_LENGTH = BUILDLOG_MAX_DESCRIPTION_LENGTH;
|
|
411
|
+
exports.BUILDLOG_MAX_EVENTS = BUILDLOG_MAX_EVENTS;
|
|
412
|
+
exports.BUILDLOG_MAX_SIZE_BYTES = BUILDLOG_MAX_SIZE_BYTES;
|
|
413
|
+
exports.BUILDLOG_MAX_TAGS = BUILDLOG_MAX_TAGS;
|
|
414
|
+
exports.BUILDLOG_MAX_TAG_LENGTH = BUILDLOG_MAX_TAG_LENGTH;
|
|
415
|
+
exports.BUILDLOG_MAX_TITLE_LENGTH = BUILDLOG_MAX_TITLE_LENGTH;
|
|
416
|
+
exports.BUILDLOG_MIME_TYPE = BUILDLOG_MIME_TYPE;
|
|
417
|
+
exports.BUILDLOG_VERSION = BUILDLOG_VERSION;
|
|
418
|
+
exports.BuildlogAuthorSchema = BuildlogAuthorSchema;
|
|
419
|
+
exports.BuildlogEventSchema = BuildlogEventSchema;
|
|
420
|
+
exports.BuildlogFileSchema = BuildlogFileSchema;
|
|
421
|
+
exports.BuildlogMetadataSchema = BuildlogMetadataSchema;
|
|
422
|
+
exports.BuildlogProjectSchema = BuildlogProjectSchema;
|
|
423
|
+
exports.BuildlogStateSchema = BuildlogStateSchema;
|
|
424
|
+
exports.ChangeSourceSchema = ChangeSourceSchema;
|
|
425
|
+
exports.CheckpointEventSchema = CheckpointEventSchema;
|
|
426
|
+
exports.CodeBlockSchema = CodeBlockSchema;
|
|
427
|
+
exports.CodeChangeEventSchema = CodeChangeEventSchema;
|
|
428
|
+
exports.EditorTypeSchema = EditorTypeSchema;
|
|
429
|
+
exports.ErrorCategorySchema = ErrorCategorySchema;
|
|
430
|
+
exports.ErrorEventSchema = ErrorEventSchema;
|
|
431
|
+
exports.FileCreateEventSchema = FileCreateEventSchema;
|
|
432
|
+
exports.FileDeleteEventSchema = FileDeleteEventSchema;
|
|
433
|
+
exports.FileRenameEventSchema = FileRenameEventSchema;
|
|
434
|
+
exports.FileSnapshotSchema = FileSnapshotSchema;
|
|
435
|
+
exports.LinesChangedSchema = LinesChangedSchema;
|
|
436
|
+
exports.NoteCategorySchema = NoteCategorySchema;
|
|
437
|
+
exports.NoteEventSchema = NoteEventSchema;
|
|
438
|
+
exports.NoteReferenceSchema = NoteReferenceSchema;
|
|
439
|
+
exports.PromptEventSchema = PromptEventSchema;
|
|
440
|
+
exports.TerminalEventSchema = TerminalEventSchema;
|
|
441
|
+
exports.TextSelectionSchema = TextSelectionSchema;
|
|
442
|
+
exports.TokenUsageSchema = TokenUsageSchema;
|
|
443
|
+
exports.computeStats = computeStats;
|
|
444
|
+
exports.detectLanguage = detectLanguage;
|
|
445
|
+
exports.formatDuration = formatDuration;
|
|
446
|
+
exports.getBuildlogExtension = getBuildlogExtension;
|
|
447
|
+
exports.getBuildlogMimeType = getBuildlogMimeType;
|
|
448
|
+
exports.getEventIcon = getEventIcon;
|
|
449
|
+
exports.getEventLabel = getEventLabel;
|
|
450
|
+
exports.isBuildlogFile = isBuildlogFile;
|
|
451
|
+
exports.parseBuildlog = parseBuildlog;
|
|
452
|
+
exports.safeParseBuildlog = safeParseBuildlog;
|
|
453
|
+
exports.slugify = slugify;
|
|
454
|
+
exports.validateBuildlog = validateBuildlog;
|
|
455
|
+
//# sourceMappingURL=index.cjs.map
|
|
456
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema.ts","../src/constants.ts","../src/utils.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from 'zod';\n\n// =============================================================================\n// ENUMS & PRIMITIVES\n// =============================================================================\n\nexport const EditorTypeSchema = z.enum([\n \"cursor\", \"vscode\", \"windsurf\", \"zed\", \"neovim\", \"jetbrains\", \"openclaw\", \"other\"\n]);\n\nexport const AIProviderSchema = z.enum([\n \"claude\", \"gpt\", \"copilot\", \"gemini\", \"other\"\n]);\n\nexport const ChangeSourceSchema = z.enum([\n \"manual\", \"ai_accepted\", \"ai_partial\", \"ai_rejected_then_manual\"\n]);\n\nexport const NoteCategorySchema = z.enum([\n \"explanation\", \"gotcha\", \"tip\", \"warning\", \"todo\"\n]);\n\nexport const ErrorCategorySchema = z.enum([\n \"build\", \"runtime\", \"lint\", \"type\", \"test\", \"other\"\n]);\n\n// =============================================================================\n// NESTED SCHEMAS\n// =============================================================================\n\nexport const BuildlogAuthorSchema = z.object({\n name: z.string().optional(),\n username: z.string().optional(),\n url: z.string().url().optional(),\n avatarUrl: z.string().url().optional(),\n});\n\nexport const BuildlogProjectSchema = z.object({\n name: z.string().optional(),\n repository: z.string().optional(),\n branch: z.string().optional(),\n commit: z.string().optional(),\n});\n\nexport const FileSnapshotSchema = z.object({\n path: z.string().min(1),\n content: z.string(),\n language: z.string(),\n sizeBytes: z.number().int().nonnegative().optional(),\n hash: z.string().optional(),\n});\n\nexport const BuildlogStateSchema = z.object({\n files: z.array(FileSnapshotSchema),\n fileTree: z.array(z.string()).optional(),\n});\n\nexport const TextSelectionSchema = z.object({\n filePath: z.string(),\n startLine: z.number().int().nonnegative(),\n endLine: z.number().int().nonnegative(),\n text: z.string(),\n});\n\nexport const CodeBlockSchema = z.object({\n language: z.string(),\n code: z.string(),\n filePath: z.string().optional(),\n startLine: z.number().int().nonnegative().optional(),\n});\n\nexport const TokenUsageSchema = z.object({\n input: z.number().int().nonnegative().optional(),\n output: z.number().int().nonnegative().optional(),\n});\n\nexport const LinesChangedSchema = z.object({\n added: z.number().int().nonnegative(),\n removed: z.number().int().nonnegative(),\n});\n\nexport const NoteReferenceSchema = z.object({\n filePath: z.string(),\n startLine: z.number().int().nonnegative().optional(),\n endLine: z.number().int().nonnegative().optional(),\n});\n\n// =============================================================================\n// EVENT SCHEMAS\n// =============================================================================\n\nconst BaseEventSchema = z.object({\n id: z.string().uuid(),\n timestamp: z.number().nonnegative(),\n sequence: z.number().int().nonnegative(),\n});\n\nexport const PromptEventSchema = BaseEventSchema.extend({\n type: z.literal(\"prompt\"),\n content: z.string().min(1),\n contextFiles: z.array(z.string()).optional(),\n selection: TextSelectionSchema.optional(),\n provider: AIProviderSchema.optional(),\n model: z.string().optional(),\n});\n\nexport const AIResponseEventSchema = BaseEventSchema.extend({\n type: z.literal(\"ai_response\"),\n content: z.string(),\n codeBlocks: z.array(CodeBlockSchema).optional(),\n promptEventId: z.string().uuid().optional(),\n provider: AIProviderSchema.optional(),\n model: z.string().optional(),\n tokenUsage: TokenUsageSchema.optional(),\n});\n\nexport const CodeChangeEventSchema = BaseEventSchema.extend({\n type: z.literal(\"code_change\"),\n filePath: z.string().min(1),\n diff: z.string(),\n source: ChangeSourceSchema,\n linesChanged: LinesChangedSchema.optional(),\n aiResponseEventId: z.string().uuid().optional(),\n});\n\nexport const FileCreateEventSchema = BaseEventSchema.extend({\n type: z.literal(\"file_create\"),\n filePath: z.string().min(1),\n content: z.string(),\n language: z.string(),\n source: z.enum([\"manual\", \"ai_accepted\"]),\n aiResponseEventId: z.string().uuid().optional(),\n});\n\nexport const FileDeleteEventSchema = BaseEventSchema.extend({\n type: z.literal(\"file_delete\"),\n filePath: z.string().min(1),\n previousContent: z.string().optional(),\n});\n\nexport const FileRenameEventSchema = BaseEventSchema.extend({\n type: z.literal(\"file_rename\"),\n fromPath: z.string().min(1),\n toPath: z.string().min(1),\n});\n\nexport const TerminalEventSchema = BaseEventSchema.extend({\n type: z.literal(\"terminal\"),\n command: z.string().min(1),\n output: z.string().optional(),\n exitCode: z.number().int().optional(),\n cwd: z.string().optional(),\n durationSeconds: z.number().nonnegative().optional(),\n});\n\nexport const NoteEventSchema = BaseEventSchema.extend({\n type: z.literal(\"note\"),\n content: z.string().min(1),\n category: NoteCategorySchema.optional(),\n reference: NoteReferenceSchema.optional(),\n});\n\nexport const CheckpointEventSchema = BaseEventSchema.extend({\n type: z.literal(\"checkpoint\"),\n name: z.string().min(1),\n description: z.string().optional(),\n state: BuildlogStateSchema.optional(),\n});\n\nexport const ErrorEventSchema = BaseEventSchema.extend({\n type: z.literal(\"error\"),\n message: z.string().min(1),\n category: ErrorCategorySchema,\n filePath: z.string().optional(),\n line: z.number().int().nonnegative().optional(),\n stackTrace: z.string().optional(),\n resolved: z.boolean().optional(),\n resolvedByEventId: z.string().uuid().optional(),\n});\n\nexport const BuildlogEventSchema = z.discriminatedUnion(\"type\", [\n PromptEventSchema,\n AIResponseEventSchema,\n CodeChangeEventSchema,\n FileCreateEventSchema,\n FileDeleteEventSchema,\n FileRenameEventSchema,\n TerminalEventSchema,\n NoteEventSchema,\n CheckpointEventSchema,\n ErrorEventSchema,\n]);\n\n// =============================================================================\n// METADATA SCHEMA\n// =============================================================================\n\nexport const BuildlogMetadataSchema = z.object({\n id: z.string().uuid(),\n title: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n author: BuildlogAuthorSchema.optional(),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime().optional(),\n durationSeconds: z.number().int().nonnegative(),\n editor: EditorTypeSchema,\n aiProviders: z.array(AIProviderSchema).optional(),\n primaryLanguage: z.string().optional(),\n languages: z.array(z.string()).optional(),\n tags: z.array(z.string().max(50)).max(20).optional(),\n project: BuildlogProjectSchema.optional(),\n custom: z.record(z.unknown()).optional(),\n});\n\n// =============================================================================\n// ROOT FILE SCHEMA\n// =============================================================================\n\nexport const BuildlogFileSchema = z.object({\n version: z.literal(\"1.0.0\"),\n metadata: BuildlogMetadataSchema,\n initialState: BuildlogStateSchema,\n events: z.array(BuildlogEventSchema),\n finalState: BuildlogStateSchema,\n});\n\n// Type inference from schemas\nexport type BuildlogFileFromSchema = z.infer<typeof BuildlogFileSchema>;\nexport type BuildlogEventFromSchema = z.infer<typeof BuildlogEventSchema>;\n","/** Current buildlog schema version */\nexport const BUILDLOG_VERSION = '1.0.0';\n\n/** MIME type for buildlog files */\nexport const BUILDLOG_MIME_TYPE = 'application/vnd.buildlog+json';\n\n/** Valid file extensions for buildlog files */\nexport const BUILDLOG_EXTENSIONS = ['.buildlog', '.vibe'];\n\n/** Default file extension */\nexport const BUILDLOG_DEFAULT_EXTENSION = '.buildlog';\n\n/** Maximum recommended file size for a single buildlog (10MB) */\nexport const BUILDLOG_MAX_SIZE_BYTES = 10 * 1024 * 1024;\n\n/** Maximum recommended events per buildlog */\nexport const BUILDLOG_MAX_EVENTS = 10000;\n\n/** Maximum title length */\nexport const BUILDLOG_MAX_TITLE_LENGTH = 200;\n\n/** Maximum description length */\nexport const BUILDLOG_MAX_DESCRIPTION_LENGTH = 2000;\n\n/** Maximum tags */\nexport const BUILDLOG_MAX_TAGS = 20;\n\n/** Maximum tag length */\nexport const BUILDLOG_MAX_TAG_LENGTH = 50;\n","import type { \n BuildlogFile, \n BuildlogEvent, \n BuildlogStats,\n ValidationResult \n} from './types';\nimport { BuildlogFileSchema } from './schema';\nimport { BUILDLOG_EXTENSIONS, BUILDLOG_MIME_TYPE } from './constants';\n\n/**\n * Check if a filename has a valid buildlog extension\n */\nexport function isBuildlogFile(filename: string): boolean {\n const lower = filename.toLowerCase();\n return BUILDLOG_EXTENSIONS.some(ext => lower.endsWith(ext));\n}\n\n/**\n * Get the file extension for buildlog files\n */\nexport function getBuildlogExtension(): string {\n return '.buildlog';\n}\n\n/**\n * Get the MIME type for buildlog files\n */\nexport function getBuildlogMimeType(): string {\n return BUILDLOG_MIME_TYPE;\n}\n\n/**\n * Validate a buildlog file\n */\nexport function validateBuildlog(data: unknown): ValidationResult {\n const result = BuildlogFileSchema.safeParse(data);\n \n if (result.success) {\n return { valid: true };\n }\n \n return {\n valid: false,\n errors: result.error.issues.map(issue => ({\n path: issue.path.join('.'),\n message: issue.message,\n code: issue.code,\n })),\n };\n}\n\n/**\n * Parse and validate a buildlog JSON string\n */\nexport function parseBuildlog(json: string): BuildlogFile {\n const data = JSON.parse(json);\n const result = BuildlogFileSchema.parse(data);\n return result as BuildlogFile;\n}\n\n/**\n * Safely parse a buildlog, returning null on failure\n */\nexport function safeParseBuildlog(json: string): BuildlogFile | null {\n try {\n return parseBuildlog(json);\n } catch {\n return null;\n }\n}\n\n/**\n * Compute statistics from a buildlog\n */\nexport function computeStats(buildlog: BuildlogFile): BuildlogStats {\n const stats: BuildlogStats = {\n durationSeconds: buildlog.metadata.durationSeconds,\n eventCount: buildlog.events.length,\n promptCount: 0,\n responseCount: 0,\n fileCount: buildlog.finalState.files.length,\n linesAdded: 0,\n linesRemoved: 0,\n languages: [],\n };\n\n const languageSet = new Set<string>();\n\n for (const event of buildlog.events) {\n switch (event.type) {\n case 'prompt':\n stats.promptCount++;\n break;\n case 'ai_response':\n stats.responseCount++;\n break;\n case 'code_change':\n if (event.linesChanged) {\n stats.linesAdded += event.linesChanged.added;\n stats.linesRemoved += event.linesChanged.removed;\n }\n break;\n case 'file_create':\n languageSet.add(event.language);\n break;\n }\n }\n\n for (const file of buildlog.finalState.files) {\n languageSet.add(file.language);\n }\n\n stats.languages = Array.from(languageSet).sort();\n \n return stats;\n}\n\n/**\n * Format duration in seconds to human readable string\n */\nexport function formatDuration(seconds: number): string {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n if (hours > 0) {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n }\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n}\n\n/**\n * Get event icon for display\n */\nexport function getEventIcon(event: BuildlogEvent): string {\n const icons: Record<BuildlogEvent['type'], string> = {\n prompt: '💬',\n ai_response: '🤖',\n code_change: '✏️',\n file_create: '📄',\n file_delete: '🗑️',\n file_rename: '📁',\n terminal: '🖥️',\n note: '📝',\n checkpoint: '🚩',\n error: '❌',\n };\n return icons[event.type];\n}\n\n/**\n * Get human readable event type label\n */\nexport function getEventLabel(event: BuildlogEvent): string {\n const labels: Record<BuildlogEvent['type'], string> = {\n prompt: 'Prompt',\n ai_response: 'AI Response',\n code_change: 'Code Change',\n file_create: 'File Created',\n file_delete: 'File Deleted',\n file_rename: 'File Renamed',\n terminal: 'Terminal',\n note: 'Note',\n checkpoint: 'Checkpoint',\n error: 'Error',\n };\n return labels[event.type];\n}\n\n/**\n * Detect programming language from file path\n */\nexport function detectLanguage(filePath: string): string {\n const ext = filePath.split('.').pop()?.toLowerCase();\n \n const languageMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n py: 'python',\n rb: 'ruby',\n go: 'go',\n rs: 'rust',\n java: 'java',\n kt: 'kotlin',\n kts: 'kotlin',\n swift: 'swift',\n cpp: 'cpp',\n cc: 'cpp',\n cxx: 'cpp',\n c: 'c',\n h: 'c',\n hpp: 'cpp',\n cs: 'csharp',\n php: 'php',\n css: 'css',\n scss: 'scss',\n sass: 'sass',\n less: 'less',\n html: 'html',\n htm: 'html',\n vue: 'vue',\n svelte: 'svelte',\n json: 'json',\n yaml: 'yaml',\n yml: 'yaml',\n toml: 'toml',\n xml: 'xml',\n md: 'markdown',\n mdx: 'markdown',\n sql: 'sql',\n sh: 'bash',\n bash: 'bash',\n zsh: 'bash',\n fish: 'fish',\n ps1: 'powershell',\n dockerfile: 'dockerfile',\n makefile: 'makefile',\n cmake: 'cmake',\n tf: 'terraform',\n hcl: 'hcl',\n graphql: 'graphql',\n gql: 'graphql',\n proto: 'protobuf',\n r: 'r',\n scala: 'scala',\n clj: 'clojure',\n ex: 'elixir',\n exs: 'elixir',\n erl: 'erlang',\n hs: 'haskell',\n lua: 'lua',\n pl: 'perl',\n dart: 'dart',\n nim: 'nim',\n zig: 'zig',\n v: 'v',\n sol: 'solidity',\n };\n\n return languageMap[ext || ''] || 'plaintext';\n}\n\n/**\n * Generate a slug from a title\n */\nexport function slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 50);\n}\n"]}
|