@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,356 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import matter from 'gray-matter';
4
+ export class MarkdownStorageAdapter {
5
+ basePath;
6
+ proposalsPath;
7
+ configPath;
8
+ agentsPath;
9
+ constructor(basePath = '.gait') {
10
+ this.basePath = basePath;
11
+ this.proposalsPath = path.join(basePath, 'proposals');
12
+ this.configPath = path.join(basePath, 'config.json');
13
+ this.agentsPath = path.join(basePath, 'agents');
14
+ }
15
+ async init() {
16
+ // Create .gait directory structure
17
+ await fs.mkdir(this.basePath, { recursive: true });
18
+ await fs.mkdir(this.proposalsPath, { recursive: true });
19
+ await fs.mkdir(this.agentsPath, { recursive: true });
20
+ // Create default config if it doesn't exist
21
+ const configExists = await this.fileExists(this.configPath);
22
+ if (!configExists) {
23
+ const defaultConfig = {
24
+ version: '1.0.0',
25
+ repository: {
26
+ name: path.basename(process.cwd()),
27
+ description: 'GAIT-managed repository'
28
+ },
29
+ policies: {
30
+ requireApproval: true,
31
+ minApprovers: 1,
32
+ allowSelfApproval: false,
33
+ autoMerge: false
34
+ },
35
+ storage: {
36
+ type: 'file',
37
+ path: this.basePath
38
+ }
39
+ };
40
+ await this.saveConfig(defaultConfig);
41
+ }
42
+ }
43
+ async saveProposal(proposal) {
44
+ const filePath = path.join(this.proposalsPath, `${proposal.id}.md`);
45
+ // Create frontmatter (filter out undefined values)
46
+ const frontmatter = {
47
+ id: proposal.id,
48
+ intent: proposal.intent,
49
+ author: {
50
+ name: proposal.author.name,
51
+ role: this.getAuthorRole(proposal.author),
52
+ type: proposal.author.type
53
+ },
54
+ status: proposal.status,
55
+ createdAt: proposal.metadata.createdAt.toISOString(),
56
+ updatedAt: proposal.metadata.updatedAt.toISOString()
57
+ };
58
+ // Add optional fields only if they have values
59
+ if (proposal.author.email) {
60
+ frontmatter.author.email = proposal.author.email;
61
+ }
62
+ if (proposal.featureFlags.length > 0) {
63
+ frontmatter.featureFlags = proposal.featureFlags.map(f => f.name);
64
+ }
65
+ if (proposal.experiments.length > 0) {
66
+ frontmatter.experiments = proposal.experiments.map(e => e.name);
67
+ }
68
+ if (proposal.metadata.reviewers && proposal.metadata.reviewers.length > 0) {
69
+ frontmatter.reviewers = proposal.metadata.reviewers;
70
+ }
71
+ if (proposal.metadata.tags && proposal.metadata.tags.length > 0) {
72
+ frontmatter.tags = proposal.metadata.tags;
73
+ }
74
+ if (proposal.metadata.priority) {
75
+ frontmatter.priority = proposal.metadata.priority;
76
+ }
77
+ if (proposal.productSpecRef) {
78
+ frontmatter.productSpecRef = proposal.productSpecRef;
79
+ }
80
+ // Create markdown content
81
+ const content = this.generateMarkdownContent(proposal);
82
+ // Combine frontmatter and content
83
+ const fileContent = matter.stringify(content, frontmatter);
84
+ await fs.writeFile(filePath, fileContent, 'utf-8');
85
+ }
86
+ async loadProposal(id) {
87
+ const filePath = path.join(this.proposalsPath, `${id}.md`);
88
+ if (!(await this.fileExists(filePath))) {
89
+ return null;
90
+ }
91
+ const fileContent = await fs.readFile(filePath, 'utf-8');
92
+ const parsed = matter(fileContent);
93
+ const frontmatter = parsed.data;
94
+ // Parse the markdown content to extract structured data
95
+ const structuredData = this.parseMarkdownContent(parsed.content);
96
+ const proposal = {
97
+ id: frontmatter.id,
98
+ intent: frontmatter.intent,
99
+ author: {
100
+ type: frontmatter.author.type,
101
+ id: frontmatter.author.email || `${frontmatter.author.name}@local`,
102
+ name: frontmatter.author.name,
103
+ email: frontmatter.author.email
104
+ },
105
+ productSpecRef: frontmatter.productSpecRef,
106
+ planSteps: structuredData.planSteps,
107
+ evidence: structuredData.evidence,
108
+ policies: structuredData.policies,
109
+ featureFlags: structuredData.featureFlags,
110
+ experiments: structuredData.experiments,
111
+ telemetryContracts: structuredData.telemetryContracts,
112
+ releasePlan: structuredData.releasePlan,
113
+ status: frontmatter.status,
114
+ metadata: {
115
+ createdAt: new Date(frontmatter.createdAt),
116
+ updatedAt: new Date(frontmatter.updatedAt),
117
+ reviewers: frontmatter.reviewers || [],
118
+ aiInteractions: structuredData.aiInteractions,
119
+ tags: frontmatter.tags,
120
+ priority: frontmatter.priority
121
+ }
122
+ };
123
+ return proposal;
124
+ }
125
+ async loadAllProposals() {
126
+ const files = await fs.readdir(this.proposalsPath);
127
+ const proposals = [];
128
+ for (const file of files) {
129
+ if (file.endsWith('.md')) {
130
+ const id = path.basename(file, '.md');
131
+ const proposal = await this.loadProposal(id);
132
+ if (proposal) {
133
+ proposals.push(proposal);
134
+ }
135
+ }
136
+ }
137
+ return proposals;
138
+ }
139
+ async deleteProposal(id) {
140
+ const filePath = path.join(this.proposalsPath, `${id}.md`);
141
+ if (!(await this.fileExists(filePath))) {
142
+ return false;
143
+ }
144
+ await fs.unlink(filePath);
145
+ return true;
146
+ }
147
+ async saveConfig(config) {
148
+ const data = JSON.stringify(config, null, 2);
149
+ await fs.writeFile(this.configPath, data, 'utf-8');
150
+ }
151
+ async loadConfig() {
152
+ if (!(await this.fileExists(this.configPath))) {
153
+ return null;
154
+ }
155
+ const data = await fs.readFile(this.configPath, 'utf-8');
156
+ return JSON.parse(data);
157
+ }
158
+ async fileExists(filePath) {
159
+ try {
160
+ await fs.access(filePath);
161
+ return true;
162
+ }
163
+ catch {
164
+ return false;
165
+ }
166
+ }
167
+ getAuthorRole(author) {
168
+ // Try to infer role from email domain or default to generic role
169
+ if (author.email?.includes('@')) {
170
+ const domain = author.email.split('@')[1];
171
+ if (domain.includes('product') || domain.includes('pm'))
172
+ return 'Product Manager';
173
+ if (domain.includes('design'))
174
+ return 'Designer';
175
+ if (domain.includes('eng') || domain.includes('dev'))
176
+ return 'Engineer';
177
+ }
178
+ return author.type === 'agent' ? 'AI Agent' : 'Team Member';
179
+ }
180
+ generateMarkdownContent(proposal) {
181
+ let content = `# ${proposal.intent}\n\n`;
182
+ // Problem Statement
183
+ content += `## Problem Statement\n`;
184
+ content += `*Describe the problem this change proposal aims to solve.*\n\n`;
185
+ // Success Criteria
186
+ content += `## Success Criteria\n`;
187
+ if (proposal.planSteps.length > 0) {
188
+ proposal.planSteps.forEach(step => {
189
+ const checked = step.status === 'completed' ? 'x' : ' ';
190
+ content += `- [${checked}] ${step.description}\n`;
191
+ });
192
+ }
193
+ else {
194
+ content += `- [ ] Define success criteria for this proposal\n`;
195
+ }
196
+ content += `\n`;
197
+ // Implementation Plan
198
+ content += `## Implementation Plan\n`;
199
+ if (proposal.planSteps.length > 0) {
200
+ proposal.planSteps.forEach((step, index) => {
201
+ content += `${index + 1}. **${step.description}**\n`;
202
+ if (step.command) {
203
+ content += ` - Command: \`${step.command}\`\n`;
204
+ }
205
+ if (step.expectedOutcome) {
206
+ content += ` - Expected: ${step.expectedOutcome}\n`;
207
+ }
208
+ if (step.status !== 'pending') {
209
+ content += ` - Status: ${step.status}\n`;
210
+ }
211
+ content += `\n`;
212
+ });
213
+ }
214
+ else {
215
+ content += `1. **Define implementation steps** - Break down the work into actionable steps\n`;
216
+ content += `2. **Execute plan** - Implement the changes\n`;
217
+ content += `3. **Validate results** - Ensure the changes work as expected\n\n`;
218
+ }
219
+ // Design Artifacts
220
+ content += `## Design Artifacts\n`;
221
+ content += `*Links to design files, mockups, or other relevant artifacts*\n\n`;
222
+ // Evidence
223
+ if (proposal.evidence.length > 0) {
224
+ content += `## Evidence\n`;
225
+ proposal.evidence.forEach(evidence => {
226
+ content += `### ${evidence.type.toUpperCase()}: ${evidence.description}\n`;
227
+ content += `*Collected on ${evidence.timestamp.toLocaleDateString()}*\n\n`;
228
+ });
229
+ }
230
+ // Feature Flags
231
+ if (proposal.featureFlags.length > 0) {
232
+ content += `## Feature Flags\n`;
233
+ proposal.featureFlags.forEach(flag => {
234
+ content += `- **${flag.name}**: ${flag.description}\n`;
235
+ });
236
+ content += `\n`;
237
+ }
238
+ // Experiments
239
+ if (proposal.experiments.length > 0) {
240
+ content += `## Experiments\n`;
241
+ proposal.experiments.forEach(exp => {
242
+ content += `- **${exp.name}**: ${exp.hypothesis}\n`;
243
+ });
244
+ content += `\n`;
245
+ }
246
+ // AI Suggestions
247
+ content += `## AI Suggestions\n`;
248
+ content += `*Last updated by AI Assistant on ${new Date().toLocaleDateString()}*\n\n`;
249
+ if (proposal.metadata.aiInteractions.length > 0) {
250
+ const lastInteraction = proposal.metadata.aiInteractions[proposal.metadata.aiInteractions.length - 1];
251
+ content += `${lastInteraction.response}\n\n`;
252
+ }
253
+ else {
254
+ content += `*No AI suggestions yet. Use \`gait ask\` to get AI assistance with this proposal.*\n\n`;
255
+ }
256
+ return content;
257
+ }
258
+ parseMarkdownContent(_content) {
259
+ // For now, return empty structures - this would be enhanced to parse the markdown
260
+ // and extract structured data from the content sections
261
+ return {
262
+ planSteps: [],
263
+ evidence: [],
264
+ policies: [],
265
+ featureFlags: [],
266
+ experiments: [],
267
+ telemetryContracts: [],
268
+ releasePlan: { strategy: 'immediate' },
269
+ aiInteractions: []
270
+ };
271
+ }
272
+ /**
273
+ * Check if GAIT is initialized in the current directory
274
+ */
275
+ async isInitialized() {
276
+ return this.fileExists(this.configPath);
277
+ }
278
+ /**
279
+ * Get the base path for storage
280
+ */
281
+ getBasePath() {
282
+ return this.basePath;
283
+ }
284
+ // Agent Management Methods
285
+ async saveAgent(agent) {
286
+ const filePath = path.join(this.agentsPath, `${agent.id}.md`);
287
+ // Create frontmatter for agent
288
+ const frontmatter = {
289
+ name: agent.name,
290
+ description: agent.description
291
+ };
292
+ // Add optional fields if they exist
293
+ if (agent.tools && agent.tools.length > 0) {
294
+ frontmatter.tools = agent.tools;
295
+ }
296
+ if (agent.metadata) {
297
+ frontmatter.createdAt = agent.metadata.createdAt.toISOString();
298
+ frontmatter.updatedAt = agent.metadata.updatedAt.toISOString();
299
+ if (agent.metadata.version) {
300
+ frontmatter.version = agent.metadata.version;
301
+ }
302
+ }
303
+ // Create markdown content with frontmatter
304
+ const content = agent.content || '';
305
+ const fileContent = matter.stringify(content, frontmatter);
306
+ await fs.writeFile(filePath, fileContent, 'utf-8');
307
+ }
308
+ async loadAgent(id) {
309
+ const filePath = path.join(this.agentsPath, `${id}.md`);
310
+ if (!(await this.fileExists(filePath))) {
311
+ return null;
312
+ }
313
+ const fileContent = await fs.readFile(filePath, 'utf-8');
314
+ const parsed = matter(fileContent);
315
+ const frontmatter = parsed.data;
316
+ const agent = {
317
+ id,
318
+ name: frontmatter.name || '',
319
+ description: frontmatter.description || '',
320
+ tools: frontmatter.tools,
321
+ content: parsed.content.trim() || undefined,
322
+ metadata: {
323
+ createdAt: frontmatter.createdAt ? new Date(frontmatter.createdAt) : new Date(),
324
+ updatedAt: frontmatter.updatedAt ? new Date(frontmatter.updatedAt) : new Date(),
325
+ author: { type: 'human', id: 'current-user', name: 'Current User' },
326
+ version: frontmatter.version
327
+ }
328
+ };
329
+ return agent;
330
+ }
331
+ async loadAllAgents() {
332
+ const files = await fs.readdir(this.agentsPath);
333
+ const agents = [];
334
+ for (const file of files) {
335
+ if (file.endsWith('.md')) {
336
+ const id = path.basename(file, '.md');
337
+ const agent = await this.loadAgent(id);
338
+ if (agent) {
339
+ agents.push(agent);
340
+ }
341
+ }
342
+ }
343
+ return agents;
344
+ }
345
+ async deleteAgent(id) {
346
+ const filePath = path.join(this.agentsPath, `${id}.md`);
347
+ if (!(await this.fileExists(filePath))) {
348
+ return false;
349
+ }
350
+ await fs.unlink(filePath);
351
+ return true;
352
+ }
353
+ }
354
+ // Export a singleton instance
355
+ export const markdownStorage = new MarkdownStorageAdapter();
356
+ //# sourceMappingURL=markdown-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-storage.js","sourceRoot":"","sources":["../src/markdown-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export interface MigrationOptions {
2
+ basePath?: string;
3
+ backupOriginals?: boolean;
4
+ dryRun?: boolean;
5
+ }
6
+ export interface MigrationResult {
7
+ success: boolean;
8
+ migratedCount: number;
9
+ errors: Array<{
10
+ id: string;
11
+ error: string;
12
+ }>;
13
+ backupPath?: string;
14
+ }
15
+ export declare class MigrationManager {
16
+ private jsonStorage;
17
+ private markdownStorage;
18
+ constructor(basePath?: string);
19
+ /**
20
+ * Migrate all JSON proposals to markdown format
21
+ */
22
+ migrateToMarkdown(options?: MigrationOptions): Promise<MigrationResult>;
23
+ /**
24
+ * Migrate from markdown back to JSON (rollback)
25
+ */
26
+ migrateToJson(options?: MigrationOptions): Promise<MigrationResult>;
27
+ /**
28
+ * Check what format is currently being used
29
+ */
30
+ detectCurrentFormat(): Promise<'json' | 'markdown' | 'mixed' | 'none'>;
31
+ /**
32
+ * Validate that all proposals can be successfully migrated
33
+ */
34
+ validateMigration(): Promise<{
35
+ valid: boolean;
36
+ issues: string[];
37
+ }>;
38
+ /**
39
+ * Create a backup of all JSON proposals
40
+ */
41
+ private createBackup;
42
+ /**
43
+ * Create a backup of all markdown proposals
44
+ */
45
+ private createMarkdownBackup;
46
+ /**
47
+ * Get migration statistics
48
+ */
49
+ getMigrationStats(): Promise<{
50
+ format: 'json' | 'markdown' | 'mixed' | 'none';
51
+ jsonCount: number;
52
+ markdownCount: number;
53
+ totalCount: number;
54
+ }>;
55
+ }
56
+ export declare const migrationManager: MigrationManager;
57
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,eAAe,CAAyB;gBAEpC,QAAQ,GAAE,MAAgB;IAKtC;;OAEG;IACG,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAgEjF;;OAEG;IACG,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAgE7E;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IAsB5E;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAoCxE;;OAEG;YACW,YAAY;IAmB1B;;OAEG;YACW,oBAAoB;IAmBlC;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC;QACjC,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;KACpB,CAAC;CAwBH;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}