@lovelybunch/core 1.0.3

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,403 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { MarkdownStorageAdapter } from './markdown-storage.js';
5
+ export class FileStorageAdapter {
6
+ basePath;
7
+ proposalsPath;
8
+ configPath;
9
+ agentsPath;
10
+ constructor(basePath = '.gait') {
11
+ this.basePath = basePath;
12
+ this.proposalsPath = path.join(basePath, 'proposals');
13
+ this.configPath = path.join(basePath, 'config.json');
14
+ this.agentsPath = path.join(basePath, 'agents');
15
+ }
16
+ async init() {
17
+ // Create .gait directory structure
18
+ await fs.mkdir(this.basePath, { recursive: true });
19
+ await fs.mkdir(this.proposalsPath, { recursive: true });
20
+ await fs.mkdir(this.agentsPath, { recursive: true });
21
+ // Create additional directories
22
+ await fs.mkdir(path.join(this.basePath, 'specs'), { recursive: true });
23
+ await fs.mkdir(path.join(this.basePath, 'flags'), { recursive: true });
24
+ await fs.mkdir(path.join(this.basePath, 'experiments'), { recursive: true });
25
+ await fs.mkdir(path.join(this.basePath, 'templates'), { recursive: true });
26
+ await fs.mkdir(path.join(this.basePath, 'context'), { recursive: true });
27
+ await fs.mkdir(path.join(this.basePath, 'context', 'decisions'), { recursive: true });
28
+ await fs.mkdir(path.join(this.basePath, 'context', 'knowledge'), { recursive: true });
29
+ // Create default config if it doesn't exist
30
+ const configExists = await this.fileExists(this.configPath);
31
+ if (!configExists) {
32
+ const defaultConfig = {
33
+ version: '1.0.0',
34
+ repository: {
35
+ name: path.basename(process.cwd()),
36
+ description: 'GAIT-managed repository'
37
+ },
38
+ policies: {
39
+ requireApproval: true,
40
+ minApprovers: 1,
41
+ allowSelfApproval: false,
42
+ autoMerge: false
43
+ },
44
+ storage: {
45
+ type: 'file',
46
+ path: this.basePath
47
+ }
48
+ };
49
+ await this.saveConfig(defaultConfig);
50
+ }
51
+ // Create context system files
52
+ await this.createContextSystem();
53
+ }
54
+ async createContextSystem() {
55
+ // Copy template files to context directory
56
+ await this.copyTemplateFiles();
57
+ }
58
+ async copyTemplateFiles() {
59
+ const templateBasePath = this.getTemplatePath();
60
+ const contextTemplatePath = path.join(templateBasePath, 'context');
61
+ // Check if template directory exists
62
+ if (!(await this.fileExists(contextTemplatePath))) {
63
+ console.warn('Template directory not found, falling back to minimal context files');
64
+ await this.createMinimalContext();
65
+ return;
66
+ }
67
+ // Copy template files
68
+ await this.copyTemplateDirectory(contextTemplatePath, path.join(this.basePath, 'context'));
69
+ }
70
+ getTemplatePath() {
71
+ // Get current file path and navigate to packages/shared/template
72
+ const currentFile = fileURLToPath(import.meta.url);
73
+ const currentDir = path.dirname(currentFile);
74
+ // Navigate up from packages/core/dist (or src) to packages/shared/template
75
+ return path.resolve(currentDir, '../../shared/template');
76
+ }
77
+ async copyTemplateDirectory(sourceDir, targetDir) {
78
+ // Ensure target directory exists
79
+ await fs.mkdir(targetDir, { recursive: true });
80
+ const entries = await fs.readdir(sourceDir, { withFileTypes: true });
81
+ for (const entry of entries) {
82
+ const sourcePath = path.join(sourceDir, entry.name);
83
+ const targetPath = path.join(targetDir, entry.name);
84
+ if (entry.isDirectory()) {
85
+ await this.copyTemplateDirectory(sourcePath, targetPath);
86
+ }
87
+ else if (entry.isFile()) {
88
+ // Only copy if target doesn't exist
89
+ if (!(await this.fileExists(targetPath))) {
90
+ const content = await fs.readFile(sourcePath, 'utf-8');
91
+ const processedContent = this.processTemplateContent(content);
92
+ await fs.writeFile(targetPath, processedContent, 'utf-8');
93
+ }
94
+ }
95
+ }
96
+ }
97
+ processTemplateContent(content) {
98
+ const projectName = path.basename(process.cwd());
99
+ const date = new Date().toISOString().split('T')[0];
100
+ return content
101
+ .replace(/\{\{projectName\}\}/g, projectName)
102
+ .replace(/\{\{date\}\}/g, date);
103
+ }
104
+ async createMinimalContext() {
105
+ // Fallback: create minimal context files if templates aren't available
106
+ const minimalProject = `---
107
+ version: "1.0"
108
+ updated: "${new Date().toISOString().split('T')[0]}"
109
+ type: project-context
110
+ ---
111
+
112
+ # ${path.basename(process.cwd())} - Project Context
113
+
114
+ This project uses GAIT for intent-driven development.
115
+
116
+ ## Getting Started
117
+
118
+ 1. Initialize GAIT: \`gait init\`
119
+ 2. Create proposals: \`gait propose "Your intent"\`
120
+ 3. View proposals: \`gait list\`
121
+ `;
122
+ await this.createContextFile('project.md', minimalProject);
123
+ }
124
+ async createContextFile(relativePath, content) {
125
+ const filePath = path.join(this.basePath, 'context', relativePath);
126
+ const fileExists = await this.fileExists(filePath);
127
+ if (!fileExists) {
128
+ await fs.writeFile(filePath, content, 'utf-8');
129
+ }
130
+ }
131
+ async saveProposal(proposal) {
132
+ const filePath = path.join(this.proposalsPath, `${proposal.id}.json`);
133
+ const data = JSON.stringify(proposal, null, 2);
134
+ await fs.writeFile(filePath, data, 'utf-8');
135
+ }
136
+ async loadProposal(id) {
137
+ const filePath = path.join(this.proposalsPath, `${id}.json`);
138
+ if (!(await this.fileExists(filePath))) {
139
+ return null;
140
+ }
141
+ const data = await fs.readFile(filePath, 'utf-8');
142
+ const proposal = JSON.parse(data);
143
+ // Convert date strings back to Date objects
144
+ this.hydrateDates(proposal);
145
+ return proposal;
146
+ }
147
+ async loadAllProposals() {
148
+ const files = await fs.readdir(this.proposalsPath);
149
+ const proposals = [];
150
+ for (const file of files) {
151
+ if (file.endsWith('.json')) {
152
+ const filePath = path.join(this.proposalsPath, file);
153
+ const data = await fs.readFile(filePath, 'utf-8');
154
+ const proposal = JSON.parse(data);
155
+ this.hydrateDates(proposal);
156
+ proposals.push(proposal);
157
+ }
158
+ }
159
+ return proposals;
160
+ }
161
+ async deleteProposal(id) {
162
+ const filePath = path.join(this.proposalsPath, `${id}.json`);
163
+ if (!(await this.fileExists(filePath))) {
164
+ return false;
165
+ }
166
+ await fs.unlink(filePath);
167
+ return true;
168
+ }
169
+ async saveConfig(config) {
170
+ const data = JSON.stringify(config, null, 2);
171
+ await fs.writeFile(this.configPath, data, 'utf-8');
172
+ }
173
+ async loadConfig() {
174
+ if (!(await this.fileExists(this.configPath))) {
175
+ return null;
176
+ }
177
+ const data = await fs.readFile(this.configPath, 'utf-8');
178
+ return JSON.parse(data);
179
+ }
180
+ async fileExists(filePath) {
181
+ try {
182
+ await fs.access(filePath);
183
+ return true;
184
+ }
185
+ catch {
186
+ return false;
187
+ }
188
+ }
189
+ hydrateDates(proposal) {
190
+ // Convert date strings back to Date objects
191
+ proposal.metadata.createdAt = new Date(proposal.metadata.createdAt);
192
+ proposal.metadata.updatedAt = new Date(proposal.metadata.updatedAt);
193
+ // Convert other date fields
194
+ proposal.planSteps.forEach(step => {
195
+ if (step.executedAt) {
196
+ step.executedAt = new Date(step.executedAt);
197
+ }
198
+ });
199
+ proposal.evidence.forEach(e => {
200
+ e.timestamp = new Date(e.timestamp);
201
+ });
202
+ proposal.policies.forEach(p => {
203
+ if (p.checkedAt) {
204
+ p.checkedAt = new Date(p.checkedAt);
205
+ }
206
+ });
207
+ proposal.featureFlags.forEach(f => {
208
+ f.createdAt = new Date(f.createdAt);
209
+ f.updatedAt = new Date(f.updatedAt);
210
+ });
211
+ proposal.experiments.forEach(e => {
212
+ if (e.startedAt) {
213
+ e.startedAt = new Date(e.startedAt);
214
+ }
215
+ if (e.endedAt) {
216
+ e.endedAt = new Date(e.endedAt);
217
+ }
218
+ });
219
+ proposal.telemetryContracts.forEach(t => {
220
+ t.approvals.forEach(a => {
221
+ a.approvedAt = new Date(a.approvedAt);
222
+ });
223
+ });
224
+ if (proposal.releasePlan.schedule) {
225
+ proposal.releasePlan.schedule = new Date(proposal.releasePlan.schedule);
226
+ }
227
+ proposal.metadata.aiInteractions.forEach(ai => {
228
+ ai.timestamp = new Date(ai.timestamp);
229
+ });
230
+ }
231
+ /**
232
+ * Check if GAIT is initialized in the current directory
233
+ */
234
+ async isInitialized() {
235
+ return this.fileExists(this.configPath);
236
+ }
237
+ /**
238
+ * Get the base path for storage
239
+ */
240
+ getBasePath() {
241
+ return this.basePath;
242
+ }
243
+ // Agent Management Methods
244
+ async saveAgent(agent) {
245
+ const content = this.agentToMarkdown(agent);
246
+ // For new agents, save to root directory
247
+ // For existing agents, find their current location and save there
248
+ let filePath;
249
+ const existingPath = await this.findAgentPath(agent.id);
250
+ if (existingPath) {
251
+ filePath = existingPath;
252
+ }
253
+ else {
254
+ filePath = path.join(this.agentsPath, `${agent.id}.md`);
255
+ }
256
+ // Ensure directory exists
257
+ const dir = path.dirname(filePath);
258
+ await fs.mkdir(dir, { recursive: true });
259
+ await fs.writeFile(filePath, content, 'utf-8');
260
+ }
261
+ async findAgentPath(id) {
262
+ // First try the direct path
263
+ const directPath = path.join(this.agentsPath, `${id}.md`);
264
+ if (await this.fileExists(directPath)) {
265
+ return directPath;
266
+ }
267
+ // Search in subdirectories
268
+ const agentFiles = await this.findAgentFiles(this.agentsPath);
269
+ for (const agentPath of agentFiles) {
270
+ const relativePath = path.relative(this.agentsPath, agentPath);
271
+ const agentId = this.pathToId(relativePath);
272
+ if (agentId === id) {
273
+ return agentPath;
274
+ }
275
+ }
276
+ return null;
277
+ }
278
+ pathToId(relativePath) {
279
+ return relativePath.replace(/\.md$/, '').replace(/[\/\\]/g, '-');
280
+ }
281
+ async loadAgent(id) {
282
+ // First try the direct path (for backward compatibility)
283
+ let filePath = path.join(this.agentsPath, `${id}.md`);
284
+ if (await this.fileExists(filePath)) {
285
+ const content = await fs.readFile(filePath, 'utf-8');
286
+ return this.markdownToAgent(content, id);
287
+ }
288
+ // If not found directly, search for it in subdirectories
289
+ const agentFiles = await this.findAgentFiles(this.agentsPath);
290
+ for (const agentPath of agentFiles) {
291
+ const relativePath = path.relative(this.agentsPath, agentPath);
292
+ const agentId = this.pathToId(relativePath);
293
+ if (agentId === id) {
294
+ const content = await fs.readFile(agentPath, 'utf-8');
295
+ return this.markdownToAgent(content, id);
296
+ }
297
+ }
298
+ return null;
299
+ }
300
+ async loadAllAgents() {
301
+ const agentFiles = await this.findAgentFiles(this.agentsPath);
302
+ const agents = [];
303
+ for (const filePath of agentFiles) {
304
+ const content = await fs.readFile(filePath, 'utf-8');
305
+ const relativePath = path.relative(this.agentsPath, filePath);
306
+ const id = this.pathToId(relativePath);
307
+ const agent = this.markdownToAgent(content, id);
308
+ if (agent) {
309
+ agents.push(agent);
310
+ }
311
+ }
312
+ return agents;
313
+ }
314
+ async findAgentFiles(dir) {
315
+ const files = [];
316
+ try {
317
+ const entries = await fs.readdir(dir, { withFileTypes: true });
318
+ for (const entry of entries) {
319
+ const fullPath = path.join(dir, entry.name);
320
+ if (entry.isDirectory()) {
321
+ // Recursively search subdirectories
322
+ const subFiles = await this.findAgentFiles(fullPath);
323
+ files.push(...subFiles);
324
+ }
325
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
326
+ files.push(fullPath);
327
+ }
328
+ }
329
+ }
330
+ catch (error) {
331
+ // If directory doesn't exist or can't be read, return empty array
332
+ console.warn(`Could not read directory ${dir}:`, error);
333
+ }
334
+ return files;
335
+ }
336
+ async deleteAgent(id) {
337
+ // First try the direct path (for backward compatibility)
338
+ let filePath = path.join(this.agentsPath, `${id}.md`);
339
+ if (await this.fileExists(filePath)) {
340
+ await fs.unlink(filePath);
341
+ return true;
342
+ }
343
+ // If not found directly, search for it in subdirectories
344
+ const agentFiles = await this.findAgentFiles(this.agentsPath);
345
+ for (const agentPath of agentFiles) {
346
+ const relativePath = path.relative(this.agentsPath, agentPath);
347
+ const agentId = this.pathToId(relativePath);
348
+ if (agentId === id) {
349
+ await fs.unlink(agentPath);
350
+ return true;
351
+ }
352
+ }
353
+ return false;
354
+ }
355
+ agentToMarkdown(agent) {
356
+ const frontmatter = {
357
+ name: agent.name,
358
+ description: agent.description,
359
+ ...(agent.tools && agent.tools.length > 0 && { tools: agent.tools.join(', ') }),
360
+ ...(agent.metadata && {
361
+ createdAt: agent.metadata.createdAt.toISOString(),
362
+ updatedAt: agent.metadata.updatedAt.toISOString(),
363
+ ...(agent.metadata.version && { version: agent.metadata.version })
364
+ })
365
+ };
366
+ const yamlFrontmatter = Object.entries(frontmatter)
367
+ .map(([key, value]) => `${key}: ${typeof value === 'string' && value.includes(':') ? `"${value}"` : value}`)
368
+ .join('\n');
369
+ return `---\n${yamlFrontmatter}\n---\n\n${agent.content || ''}`;
370
+ }
371
+ markdownToAgent(content, id) {
372
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
373
+ if (!frontmatterMatch) {
374
+ return null;
375
+ }
376
+ const [, frontmatter, agentContent] = frontmatterMatch;
377
+ const metadata = {};
378
+ frontmatter.split('\n').forEach(line => {
379
+ const [key, ...values] = line.split(':');
380
+ if (key && values.length > 0) {
381
+ const value = values.join(':').trim().replace(/^"(.*)"$/, '$1');
382
+ metadata[key.trim()] = value;
383
+ }
384
+ });
385
+ const tools = metadata.tools ? metadata.tools.split(',').map(t => t.trim()) : undefined;
386
+ return {
387
+ id,
388
+ name: metadata.name || '',
389
+ description: metadata.description || '',
390
+ tools,
391
+ content: agentContent.trim() || undefined,
392
+ metadata: {
393
+ createdAt: new Date(metadata.createdAt || Date.now()),
394
+ updatedAt: new Date(metadata.updatedAt || Date.now()),
395
+ author: { type: 'human', id: 'current-user', name: 'Current User' },
396
+ version: metadata.version
397
+ }
398
+ };
399
+ }
400
+ }
401
+ // Export a singleton instance using MarkdownStorageAdapter for markdown file support
402
+ export const fileStorage = new MarkdownStorageAdapter();
403
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { ChangeProposal, GaitConfig } from '@lovelybunch/types';
2
+ import type { StorageAdapter } from './storage.js';
3
+ /**
4
+ * Unified storage adapter that automatically detects and handles both JSON and Markdown formats
5
+ * Provides backward compatibility during the migration period
6
+ */
7
+ export declare class UnifiedStorageAdapter implements StorageAdapter {
8
+ private jsonStorage;
9
+ private markdownStorage;
10
+ private preferredFormat;
11
+ constructor(basePath?: string, preferredFormat?: 'json' | 'markdown');
12
+ init(): Promise<void>;
13
+ saveProposal(proposal: ChangeProposal): Promise<void>;
14
+ loadProposal(id: string): Promise<ChangeProposal | null>;
15
+ loadAllProposals(): Promise<ChangeProposal[]>;
16
+ deleteProposal(id: string): Promise<boolean>;
17
+ saveConfig(config: GaitConfig): Promise<void>;
18
+ loadConfig(): Promise<GaitConfig | null>;
19
+ isInitialized(): Promise<boolean>;
20
+ getBasePath(): string;
21
+ /**
22
+ * Get the current storage format being used
23
+ */
24
+ getCurrentFormat(): Promise<'json' | 'markdown' | 'mixed' | 'none'>;
25
+ /**
26
+ * Set the preferred format for new proposals
27
+ */
28
+ setPreferredFormat(format: 'json' | 'markdown'): void;
29
+ /**
30
+ * Get the preferred format
31
+ */
32
+ getPreferredFormat(): 'json' | 'markdown';
33
+ /**
34
+ * Auto-migrate to preferred format if needed
35
+ */
36
+ autoMigrate(options?: {
37
+ force?: boolean;
38
+ }): Promise<boolean>;
39
+ /**
40
+ * Get storage statistics
41
+ */
42
+ getStorageStats(): Promise<{
43
+ format: 'json' | 'markdown' | 'mixed' | 'none';
44
+ jsonCount: number;
45
+ markdownCount: number;
46
+ totalCount: number;
47
+ preferredFormat: 'json' | 'markdown';
48
+ }>;
49
+ /**
50
+ * Validate storage integrity
51
+ */
52
+ validateStorage(): Promise<{
53
+ valid: boolean;
54
+ issues: string[];
55
+ duplicates: string[];
56
+ }>;
57
+ }
58
+ export declare const unifiedStorage: UnifiedStorageAdapter;
59
+ //# sourceMappingURL=unified-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-storage.d.ts","sourceRoot":"","sources":["../src/unified-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,eAAe,CAAsB;gBAEjC,QAAQ,GAAE,MAAgB,EAAE,eAAe,GAAE,MAAM,GAAG,UAAuB;IAMnF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAmBxD,gBAAgB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IA0B7C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5C,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,UAAU,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIxC,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIvC,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IAIzE;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIrD;;OAEG;IACH,kBAAkB,IAAI,MAAM,GAAG,UAAU;IAIzC;;OAEG;IACG,WAAW,CAAC,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAiCtE;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAC/B,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;QAC/C,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,GAAG,UAAU,CAAC;KACtC,CAAC;IAQF;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAC/B,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CA6CH;AAGD,eAAO,MAAM,cAAc,uBAAiD,CAAC"}