@lovelybunch/core 1.0.13 → 1.0.18

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lovelybunch/core",
3
- "version": "1.0.13",
4
- "description": "Core GAIT functionality",
3
+ "version": "1.0.18",
4
+ "description": "Core Coconut functionality",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -30,9 +30,10 @@
30
30
  "test": "vitest run"
31
31
  },
32
32
  "dependencies": {
33
- "@lovelybunch/types": "^1.0.13",
33
+ "@lovelybunch/types": "^1.0.18",
34
34
  "gray-matter": "^4.0.3",
35
- "fuse.js": "^7.0.0"
35
+ "fuse.js": "^7.0.0",
36
+ "nanoid": "^5.0.6"
36
37
  },
37
38
  "devDependencies": {
38
39
  "typescript": "^5.3.3",
@@ -1,57 +0,0 @@
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
@@ -1 +0,0 @@
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"}
package/dist/migration.js DELETED
@@ -1,250 +0,0 @@
1
- import { promises as fs } from 'fs';
2
- import path from 'path';
3
- import { FileStorageAdapter } from './storage.js';
4
- import { MarkdownStorageAdapter } from './markdown-storage.js';
5
- export class MigrationManager {
6
- jsonStorage;
7
- markdownStorage;
8
- constructor(basePath = '.gait') {
9
- this.jsonStorage = new FileStorageAdapter(basePath);
10
- this.markdownStorage = new MarkdownStorageAdapter(basePath);
11
- }
12
- /**
13
- * Migrate all JSON proposals to markdown format
14
- */
15
- async migrateToMarkdown(options = {}) {
16
- const { backupOriginals = true, dryRun = false } = options;
17
- const result = {
18
- success: true,
19
- migratedCount: 0,
20
- errors: []
21
- };
22
- try {
23
- // Load all existing JSON proposals
24
- const jsonProposals = await this.jsonStorage.loadAllProposals();
25
- if (jsonProposals.length === 0) {
26
- return result;
27
- }
28
- // Create backup if requested
29
- if (backupOriginals && !dryRun) {
30
- result.backupPath = await this.createBackup();
31
- }
32
- // Initialize markdown storage
33
- if (!dryRun) {
34
- await this.markdownStorage.init();
35
- }
36
- // Migrate each proposal
37
- for (const proposal of jsonProposals) {
38
- try {
39
- if (dryRun) {
40
- console.log(`Would migrate: ${proposal.id}`);
41
- }
42
- else {
43
- // Save as markdown
44
- await this.markdownStorage.saveProposal(proposal);
45
- // Remove original JSON file
46
- await this.jsonStorage.deleteProposal(proposal.id);
47
- }
48
- result.migratedCount++;
49
- }
50
- catch (error) {
51
- result.errors.push({
52
- id: proposal.id,
53
- error: error instanceof Error ? error.message : String(error)
54
- });
55
- result.success = false;
56
- }
57
- }
58
- return result;
59
- }
60
- catch (error) {
61
- result.success = false;
62
- result.errors.push({
63
- id: 'migration',
64
- error: error instanceof Error ? error.message : String(error)
65
- });
66
- return result;
67
- }
68
- }
69
- /**
70
- * Migrate from markdown back to JSON (rollback)
71
- */
72
- async migrateToJson(options = {}) {
73
- const { backupOriginals = true, dryRun = false } = options;
74
- const result = {
75
- success: true,
76
- migratedCount: 0,
77
- errors: []
78
- };
79
- try {
80
- // Load all existing markdown proposals
81
- const markdownProposals = await this.markdownStorage.loadAllProposals();
82
- if (markdownProposals.length === 0) {
83
- return result;
84
- }
85
- // Create backup if requested
86
- if (backupOriginals && !dryRun) {
87
- result.backupPath = await this.createMarkdownBackup();
88
- }
89
- // Initialize JSON storage
90
- if (!dryRun) {
91
- await this.jsonStorage.init();
92
- }
93
- // Migrate each proposal
94
- for (const proposal of markdownProposals) {
95
- try {
96
- if (dryRun) {
97
- console.log(`Would migrate: ${proposal.id}`);
98
- }
99
- else {
100
- // Save as JSON
101
- await this.jsonStorage.saveProposal(proposal);
102
- // Remove original markdown file
103
- await this.markdownStorage.deleteProposal(proposal.id);
104
- }
105
- result.migratedCount++;
106
- }
107
- catch (error) {
108
- result.errors.push({
109
- id: proposal.id,
110
- error: error instanceof Error ? error.message : String(error)
111
- });
112
- result.success = false;
113
- }
114
- }
115
- return result;
116
- }
117
- catch (error) {
118
- result.success = false;
119
- result.errors.push({
120
- id: 'migration',
121
- error: error instanceof Error ? error.message : String(error)
122
- });
123
- return result;
124
- }
125
- }
126
- /**
127
- * Check what format is currently being used
128
- */
129
- async detectCurrentFormat() {
130
- const proposalsPath = path.join(this.jsonStorage.getBasePath(), 'proposals');
131
- try {
132
- const files = await fs.readdir(proposalsPath);
133
- const jsonFiles = files.filter(f => f.endsWith('.json'));
134
- const markdownFiles = files.filter(f => f.endsWith('.md'));
135
- if (jsonFiles.length > 0 && markdownFiles.length > 0) {
136
- return 'mixed';
137
- }
138
- else if (jsonFiles.length > 0) {
139
- return 'json';
140
- }
141
- else if (markdownFiles.length > 0) {
142
- return 'markdown';
143
- }
144
- else {
145
- return 'none';
146
- }
147
- }
148
- catch {
149
- return 'none';
150
- }
151
- }
152
- /**
153
- * Validate that all proposals can be successfully migrated
154
- */
155
- async validateMigration() {
156
- const issues = [];
157
- try {
158
- const proposals = await this.jsonStorage.loadAllProposals();
159
- for (const proposal of proposals) {
160
- // Test serialization to markdown
161
- try {
162
- await this.markdownStorage.saveProposal(proposal);
163
- // Test deserialization back
164
- const loaded = await this.markdownStorage.loadProposal(proposal.id);
165
- if (!loaded) {
166
- issues.push(`Failed to load proposal ${proposal.id} after markdown conversion`);
167
- }
168
- // Clean up test file
169
- await this.markdownStorage.deleteProposal(proposal.id);
170
- }
171
- catch (error) {
172
- issues.push(`Failed to convert proposal ${proposal.id}: ${error}`);
173
- }
174
- }
175
- return {
176
- valid: issues.length === 0,
177
- issues
178
- };
179
- }
180
- catch (error) {
181
- return {
182
- valid: false,
183
- issues: [`Validation failed: ${error}`]
184
- };
185
- }
186
- }
187
- /**
188
- * Create a backup of all JSON proposals
189
- */
190
- async createBackup() {
191
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
192
- const backupDir = path.join(this.jsonStorage.getBasePath(), `backup-json-${timestamp}`);
193
- const proposalsPath = path.join(this.jsonStorage.getBasePath(), 'proposals');
194
- await fs.mkdir(backupDir, { recursive: true });
195
- const files = await fs.readdir(proposalsPath);
196
- const jsonFiles = files.filter(f => f.endsWith('.json'));
197
- for (const file of jsonFiles) {
198
- const sourcePath = path.join(proposalsPath, file);
199
- const destPath = path.join(backupDir, file);
200
- await fs.copyFile(sourcePath, destPath);
201
- }
202
- return backupDir;
203
- }
204
- /**
205
- * Create a backup of all markdown proposals
206
- */
207
- async createMarkdownBackup() {
208
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
209
- const backupDir = path.join(this.markdownStorage.getBasePath(), `backup-markdown-${timestamp}`);
210
- const proposalsPath = path.join(this.markdownStorage.getBasePath(), 'proposals');
211
- await fs.mkdir(backupDir, { recursive: true });
212
- const files = await fs.readdir(proposalsPath);
213
- const markdownFiles = files.filter(f => f.endsWith('.md'));
214
- for (const file of markdownFiles) {
215
- const sourcePath = path.join(proposalsPath, file);
216
- const destPath = path.join(backupDir, file);
217
- await fs.copyFile(sourcePath, destPath);
218
- }
219
- return backupDir;
220
- }
221
- /**
222
- * Get migration statistics
223
- */
224
- async getMigrationStats() {
225
- const format = await this.detectCurrentFormat();
226
- const proposalsPath = path.join(this.jsonStorage.getBasePath(), 'proposals');
227
- try {
228
- const files = await fs.readdir(proposalsPath);
229
- const jsonCount = files.filter(f => f.endsWith('.json')).length;
230
- const markdownCount = files.filter(f => f.endsWith('.md')).length;
231
- return {
232
- format,
233
- jsonCount,
234
- markdownCount,
235
- totalCount: jsonCount + markdownCount
236
- };
237
- }
238
- catch {
239
- return {
240
- format: 'none',
241
- jsonCount: 0,
242
- markdownCount: 0,
243
- totalCount: 0
244
- };
245
- }
246
- }
247
- }
248
- // Export a singleton instance
249
- export const migrationManager = new MigrationManager();
250
- //# sourceMappingURL=migration.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migration.js","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAe/D,MAAM,OAAO,gBAAgB;IACnB,WAAW,CAAqB;IAChC,eAAe,CAAyB;IAEhD,YAAY,WAAmB,OAAO;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,eAAe,GAAG,IAAI,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,UAA4B,EAAE;QACpD,MAAM,EACJ,eAAe,GAAG,IAAI,EACtB,MAAM,GAAG,KAAK,EACf,GAAG,OAAO,CAAC;QAEZ,MAAM,MAAM,GAAoB;YAC9B,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,EAAE;SACX,CAAC;QAEF,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;YAEhE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,6BAA6B;YAC7B,IAAI,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAChD,CAAC;YAED,8BAA8B;YAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YACpC,CAAC;YAED,wBAAwB;YACxB,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,IAAI,MAAM,EAAE,CAAC;wBACX,OAAO,CAAC,GAAG,CAAC,kBAAkB,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC/C,CAAC;yBAAM,CAAC;wBACN,mBAAmB;wBACnB,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;wBAElD,4BAA4B;wBAC5B,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACrD,CAAC;oBAED,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;wBACjB,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;oBACH,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,EAAE,EAAE,WAAW;gBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,UAA4B,EAAE;QAChD,MAAM,EACJ,eAAe,GAAG,IAAI,EACtB,MAAM,GAAG,KAAK,EACf,GAAG,OAAO,CAAC;QAEZ,MAAM,MAAM,GAAoB;YAC9B,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,EAAE;SACX,CAAC;QAEF,IAAI,CAAC;YACH,uCAAuC;YACvC,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;YAExE,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,6BAA6B;YAC7B,IAAI,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxD,CAAC;YAED,0BAA0B;YAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAChC,CAAC;YAED,wBAAwB;YACxB,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,IAAI,MAAM,EAAE,CAAC;wBACX,OAAO,CAAC,GAAG,CAAC,kBAAkB,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC/C,CAAC;yBAAM,CAAC;wBACN,eAAe;wBACf,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;wBAE9C,gCAAgC;wBAChC,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACzD,CAAC;oBAED,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;wBACjB,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;oBACH,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,EAAE,EAAE,WAAW;gBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACvB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;QAE7E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YACzD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAE3D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,OAAO,OAAO,CAAC;YACjB,CAAC;iBAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,OAAO,MAAM,CAAC;YAChB,CAAC;iBAAM,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,OAAO,UAAU,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;YAE5D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,iCAAiC;gBACjC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;oBAElD,4BAA4B;oBAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACpE,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,MAAM,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,EAAE,4BAA4B,CAAC,CAAC;oBAClF,CAAC;oBAED,qBAAqB;oBACrB,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACzD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,8BAA8B,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YAED,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;gBAC1B,MAAM;aACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,CAAC,sBAAsB,KAAK,EAAE,CAAC;aACxC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,eAAe,SAAS,EAAE,CAAC,CAAC;QACxF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;QAE7E,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAEzD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB;QAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,mBAAmB,SAAS,EAAE,CAAC,CAAC;QAChG,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;QAEjF,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAE3D,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QAMrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;QAE7E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YAChE,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YAElE,OAAO;gBACL,MAAM;gBACN,SAAS;gBACT,aAAa;gBACb,UAAU,EAAE,SAAS,GAAG,aAAa;aACtC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,SAAS,EAAE,CAAC;gBACZ,aAAa,EAAE,CAAC;gBAChB,UAAU,EAAE,CAAC;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED,8BAA8B;AAC9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
@@ -1,59 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,199 +0,0 @@
1
- import { FileStorageAdapter } from './storage.js';
2
- import { MarkdownStorageAdapter } from './markdown-storage.js';
3
- import { migrationManager } from './migration.js';
4
- /**
5
- * Unified storage adapter that automatically detects and handles both JSON and Markdown formats
6
- * Provides backward compatibility during the migration period
7
- */
8
- export class UnifiedStorageAdapter {
9
- jsonStorage;
10
- markdownStorage;
11
- preferredFormat;
12
- constructor(basePath = '.gait', preferredFormat = 'markdown') {
13
- this.jsonStorage = new FileStorageAdapter(basePath);
14
- this.markdownStorage = new MarkdownStorageAdapter(basePath);
15
- this.preferredFormat = preferredFormat;
16
- }
17
- async init() {
18
- // Initialize both storage adapters
19
- await this.jsonStorage.init();
20
- await this.markdownStorage.init();
21
- }
22
- async saveProposal(proposal) {
23
- // Save using preferred format
24
- if (this.preferredFormat === 'markdown') {
25
- await this.markdownStorage.saveProposal(proposal);
26
- }
27
- else {
28
- await this.jsonStorage.saveProposal(proposal);
29
- }
30
- }
31
- async loadProposal(id) {
32
- // Try to load from both formats, preferring the configured format
33
- if (this.preferredFormat === 'markdown') {
34
- // Try markdown first, then JSON as fallback
35
- const markdownProposal = await this.markdownStorage.loadProposal(id);
36
- if (markdownProposal) {
37
- return markdownProposal;
38
- }
39
- return await this.jsonStorage.loadProposal(id);
40
- }
41
- else {
42
- // Try JSON first, then markdown as fallback
43
- const jsonProposal = await this.jsonStorage.loadProposal(id);
44
- if (jsonProposal) {
45
- return jsonProposal;
46
- }
47
- return await this.markdownStorage.loadProposal(id);
48
- }
49
- }
50
- async loadAllProposals() {
51
- // Load from both formats and merge, avoiding duplicates
52
- const [jsonProposals, markdownProposals] = await Promise.all([
53
- this.jsonStorage.loadAllProposals(),
54
- this.markdownStorage.loadAllProposals()
55
- ]);
56
- // Create a map to avoid duplicates (prefer the configured format)
57
- const proposalMap = new Map();
58
- // Add proposals from non-preferred format first
59
- const nonPreferredProposals = this.preferredFormat === 'markdown' ? jsonProposals : markdownProposals;
60
- const preferredProposals = this.preferredFormat === 'markdown' ? markdownProposals : jsonProposals;
61
- nonPreferredProposals.forEach(proposal => {
62
- proposalMap.set(proposal.id, proposal);
63
- });
64
- // Add proposals from preferred format (will overwrite duplicates)
65
- preferredProposals.forEach(proposal => {
66
- proposalMap.set(proposal.id, proposal);
67
- });
68
- return Array.from(proposalMap.values());
69
- }
70
- async deleteProposal(id) {
71
- // Delete from both formats to ensure cleanup
72
- const [jsonDeleted, markdownDeleted] = await Promise.all([
73
- this.jsonStorage.deleteProposal(id),
74
- this.markdownStorage.deleteProposal(id)
75
- ]);
76
- return jsonDeleted || markdownDeleted;
77
- }
78
- async saveConfig(config) {
79
- // Config is always saved as JSON for now
80
- await this.jsonStorage.saveConfig(config);
81
- }
82
- async loadConfig() {
83
- return await this.jsonStorage.loadConfig();
84
- }
85
- async isInitialized() {
86
- return await this.jsonStorage.isInitialized();
87
- }
88
- getBasePath() {
89
- return this.jsonStorage.getBasePath();
90
- }
91
- /**
92
- * Get the current storage format being used
93
- */
94
- async getCurrentFormat() {
95
- return await migrationManager.detectCurrentFormat();
96
- }
97
- /**
98
- * Set the preferred format for new proposals
99
- */
100
- setPreferredFormat(format) {
101
- this.preferredFormat = format;
102
- }
103
- /**
104
- * Get the preferred format
105
- */
106
- getPreferredFormat() {
107
- return this.preferredFormat;
108
- }
109
- /**
110
- * Auto-migrate to preferred format if needed
111
- */
112
- async autoMigrate(options = {}) {
113
- const currentFormat = await this.getCurrentFormat();
114
- // No migration needed if already using preferred format or no proposals exist
115
- if (currentFormat === this.preferredFormat || currentFormat === 'none') {
116
- return true;
117
- }
118
- // Don't auto-migrate mixed format without force
119
- if (currentFormat === 'mixed' && !options.force) {
120
- return false;
121
- }
122
- try {
123
- if (this.preferredFormat === 'markdown') {
124
- const result = await migrationManager.migrateToMarkdown({
125
- backupOriginals: true,
126
- dryRun: false
127
- });
128
- return result.success;
129
- }
130
- else {
131
- const result = await migrationManager.migrateToJson({
132
- backupOriginals: true,
133
- dryRun: false
134
- });
135
- return result.success;
136
- }
137
- }
138
- catch (error) {
139
- console.error('Auto-migration failed:', error);
140
- return false;
141
- }
142
- }
143
- /**
144
- * Get storage statistics
145
- */
146
- async getStorageStats() {
147
- const stats = await migrationManager.getMigrationStats();
148
- return {
149
- ...stats,
150
- preferredFormat: this.preferredFormat
151
- };
152
- }
153
- /**
154
- * Validate storage integrity
155
- */
156
- async validateStorage() {
157
- const issues = [];
158
- const duplicates = [];
159
- try {
160
- const [jsonProposals, markdownProposals] = await Promise.all([
161
- this.jsonStorage.loadAllProposals(),
162
- this.markdownStorage.loadAllProposals()
163
- ]);
164
- // Check for duplicates
165
- const jsonIds = new Set(jsonProposals.map(p => p.id));
166
- const markdownIds = new Set(markdownProposals.map(p => p.id));
167
- for (const id of jsonIds) {
168
- if (markdownIds.has(id)) {
169
- duplicates.push(id);
170
- }
171
- }
172
- if (duplicates.length > 0) {
173
- issues.push(`Found ${duplicates.length} duplicate proposals across formats: ${duplicates.join(', ')}`);
174
- }
175
- // Validate each proposal can be loaded
176
- const allProposals = await this.loadAllProposals();
177
- for (const proposal of allProposals) {
178
- if (!proposal.id || !proposal.intent || !proposal.author) {
179
- issues.push(`Proposal ${proposal.id || 'unknown'} is missing required fields`);
180
- }
181
- }
182
- return {
183
- valid: issues.length === 0,
184
- issues,
185
- duplicates
186
- };
187
- }
188
- catch (error) {
189
- return {
190
- valid: false,
191
- issues: [`Storage validation failed: ${error}`],
192
- duplicates: []
193
- };
194
- }
195
- }
196
- }
197
- // Export a singleton instance with markdown as preferred format
198
- export const unifiedStorage = new UnifiedStorageAdapter('.gait', 'markdown');
199
- //# sourceMappingURL=unified-storage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unified-storage.js","sourceRoot":"","sources":["../src/unified-storage.ts"],"names":[],"mappings":"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"}
@@ -1,62 +0,0 @@
1
- import type { ChangeProposal, Author, PlanStep, Evidence, FeatureFlag, Experiment } from '@lovelybunch/types';
2
- export interface ValidationError {
3
- field: string;
4
- message: string;
5
- severity: 'error' | 'warning';
6
- }
7
- export interface ValidationResult {
8
- valid: boolean;
9
- errors: ValidationError[];
10
- warnings: ValidationError[];
11
- }
12
- /**
13
- * Comprehensive validation utilities for GAIT data structures
14
- */
15
- export declare class ValidationManager {
16
- /**
17
- * Validate a Change Proposal
18
- */
19
- validateChangeProposal(proposal: ChangeProposal): ValidationResult;
20
- /**
21
- * Validate an Author
22
- */
23
- validateAuthor(author: Author): ValidationResult;
24
- /**
25
- * Validate a Plan Step
26
- */
27
- validatePlanStep(step: PlanStep, index: number): ValidationResult;
28
- /**
29
- * Validate Evidence
30
- */
31
- validateEvidence(evidence: Evidence, index: number): ValidationResult;
32
- /**
33
- * Validate Feature Flag
34
- */
35
- validateFeatureFlag(flag: FeatureFlag, index: number): ValidationResult;
36
- /**
37
- * Validate Experiment
38
- */
39
- validateExperiment(experiment: Experiment, index: number): ValidationResult;
40
- /**
41
- * Validate YAML frontmatter structure
42
- */
43
- validateYamlFrontmatter(frontmatter: any): ValidationResult;
44
- /**
45
- * Validate markdown content structure
46
- */
47
- validateMarkdownContent(content: string): ValidationResult;
48
- /**
49
- * Helper method to validate email format
50
- */
51
- private isValidEmail;
52
- /**
53
- * Helper method to validate ISO date format
54
- */
55
- private isValidISODate;
56
- /**
57
- * Format validation results for display
58
- */
59
- formatValidationResults(result: ValidationResult): string;
60
- }
61
- export declare const validationManager: ValidationManager;
62
- //# sourceMappingURL=validation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEvG,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAE5B;;OAEG;IACH,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,gBAAgB;IA4HlE;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB;IA2ChD;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB;IAoDjE;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB;IA4CrE;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB;IAqEvE;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB;IA8D3E;;OAEG;IACH,uBAAuB,CAAC,WAAW,EAAE,GAAG,GAAG,gBAAgB;IA6C3D;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB;IA+C1D;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;CAyB1D;AAGD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
@@ -1,500 +0,0 @@
1
- /**
2
- * Comprehensive validation utilities for GAIT data structures
3
- */
4
- export class ValidationManager {
5
- /**
6
- * Validate a Change Proposal
7
- */
8
- validateChangeProposal(proposal) {
9
- const errors = [];
10
- const warnings = [];
11
- // Required fields validation
12
- if (!proposal.id) {
13
- errors.push({
14
- field: 'id',
15
- message: 'Change Proposal ID is required',
16
- severity: 'error'
17
- });
18
- }
19
- else if (!/^cp-\d{3}$/.test(proposal.id)) {
20
- warnings.push({
21
- field: 'id',
22
- message: 'Change Proposal ID should follow format "cp-XXX"',
23
- severity: 'warning'
24
- });
25
- }
26
- if (!proposal.intent || proposal.intent.trim().length === 0) {
27
- errors.push({
28
- field: 'intent',
29
- message: 'Intent description is required',
30
- severity: 'error'
31
- });
32
- }
33
- else if (proposal.intent.length < 10) {
34
- warnings.push({
35
- field: 'intent',
36
- message: 'Intent description is very short, consider adding more detail',
37
- severity: 'warning'
38
- });
39
- }
40
- else if (proposal.intent.length > 500) {
41
- warnings.push({
42
- field: 'intent',
43
- message: 'Intent description is very long, consider making it more concise',
44
- severity: 'warning'
45
- });
46
- }
47
- // Author validation
48
- const authorValidation = this.validateAuthor(proposal.author);
49
- errors.push(...authorValidation.errors);
50
- warnings.push(...authorValidation.warnings);
51
- // Status validation
52
- const validStatuses = ['draft', 'proposed', 'approved', 'merged', 'rejected'];
53
- if (!validStatuses.includes(proposal.status)) {
54
- errors.push({
55
- field: 'status',
56
- message: `Invalid status "${proposal.status}". Must be one of: ${validStatuses.join(', ')}`,
57
- severity: 'error'
58
- });
59
- }
60
- // Plan steps validation
61
- if (proposal.planSteps.length === 0) {
62
- warnings.push({
63
- field: 'planSteps',
64
- message: 'No plan steps defined. Consider adding implementation steps',
65
- severity: 'warning'
66
- });
67
- }
68
- else {
69
- proposal.planSteps.forEach((step, index) => {
70
- const stepValidation = this.validatePlanStep(step, index);
71
- errors.push(...stepValidation.errors);
72
- warnings.push(...stepValidation.warnings);
73
- });
74
- }
75
- // Evidence validation
76
- proposal.evidence.forEach((evidence, index) => {
77
- const evidenceValidation = this.validateEvidence(evidence, index);
78
- errors.push(...evidenceValidation.errors);
79
- warnings.push(...evidenceValidation.warnings);
80
- });
81
- // Feature flags validation
82
- proposal.featureFlags.forEach((flag, index) => {
83
- const flagValidation = this.validateFeatureFlag(flag, index);
84
- errors.push(...flagValidation.errors);
85
- warnings.push(...flagValidation.warnings);
86
- });
87
- // Experiments validation
88
- proposal.experiments.forEach((experiment, index) => {
89
- const expValidation = this.validateExperiment(experiment, index);
90
- errors.push(...expValidation.errors);
91
- warnings.push(...expValidation.warnings);
92
- });
93
- // Metadata validation
94
- if (!proposal.metadata.createdAt) {
95
- errors.push({
96
- field: 'metadata.createdAt',
97
- message: 'Creation date is required',
98
- severity: 'error'
99
- });
100
- }
101
- if (!proposal.metadata.updatedAt) {
102
- errors.push({
103
- field: 'metadata.updatedAt',
104
- message: 'Update date is required',
105
- severity: 'error'
106
- });
107
- }
108
- if (proposal.metadata.createdAt && proposal.metadata.updatedAt) {
109
- if (proposal.metadata.updatedAt < proposal.metadata.createdAt) {
110
- errors.push({
111
- field: 'metadata.updatedAt',
112
- message: 'Update date cannot be before creation date',
113
- severity: 'error'
114
- });
115
- }
116
- }
117
- return {
118
- valid: errors.length === 0,
119
- errors,
120
- warnings
121
- };
122
- }
123
- /**
124
- * Validate an Author
125
- */
126
- validateAuthor(author) {
127
- const errors = [];
128
- const warnings = [];
129
- if (!author.id) {
130
- errors.push({
131
- field: 'author.id',
132
- message: 'Author ID is required',
133
- severity: 'error'
134
- });
135
- }
136
- if (!author.name || author.name.trim().length === 0) {
137
- errors.push({
138
- field: 'author.name',
139
- message: 'Author name is required',
140
- severity: 'error'
141
- });
142
- }
143
- if (!['human', 'agent'].includes(author.type)) {
144
- errors.push({
145
- field: 'author.type',
146
- message: 'Author type must be "human" or "agent"',
147
- severity: 'error'
148
- });
149
- }
150
- if (author.email && !this.isValidEmail(author.email)) {
151
- errors.push({
152
- field: 'author.email',
153
- message: 'Invalid email format',
154
- severity: 'error'
155
- });
156
- }
157
- return {
158
- valid: errors.length === 0,
159
- errors,
160
- warnings
161
- };
162
- }
163
- /**
164
- * Validate a Plan Step
165
- */
166
- validatePlanStep(step, index) {
167
- const errors = [];
168
- const warnings = [];
169
- if (!step.id) {
170
- errors.push({
171
- field: `planSteps[${index}].id`,
172
- message: 'Plan step ID is required',
173
- severity: 'error'
174
- });
175
- }
176
- if (!step.description || step.description.trim().length === 0) {
177
- errors.push({
178
- field: `planSteps[${index}].description`,
179
- message: 'Plan step description is required',
180
- severity: 'error'
181
- });
182
- }
183
- const validStatuses = ['pending', 'in-progress', 'completed', 'failed'];
184
- if (!validStatuses.includes(step.status)) {
185
- errors.push({
186
- field: `planSteps[${index}].status`,
187
- message: `Invalid step status "${step.status}". Must be one of: ${validStatuses.join(', ')}`,
188
- severity: 'error'
189
- });
190
- }
191
- if (step.status === 'completed' && !step.executedAt) {
192
- warnings.push({
193
- field: `planSteps[${index}].executedAt`,
194
- message: 'Completed step should have execution timestamp',
195
- severity: 'warning'
196
- });
197
- }
198
- if (step.status === 'failed' && !step.error) {
199
- warnings.push({
200
- field: `planSteps[${index}].error`,
201
- message: 'Failed step should include error information',
202
- severity: 'warning'
203
- });
204
- }
205
- return {
206
- valid: errors.length === 0,
207
- errors,
208
- warnings
209
- };
210
- }
211
- /**
212
- * Validate Evidence
213
- */
214
- validateEvidence(evidence, index) {
215
- const errors = [];
216
- const warnings = [];
217
- const validTypes = ['test', 'benchmark', 'screenshot', 'log', 'other'];
218
- if (!validTypes.includes(evidence.type)) {
219
- errors.push({
220
- field: `evidence[${index}].type`,
221
- message: `Invalid evidence type "${evidence.type}". Must be one of: ${validTypes.join(', ')}`,
222
- severity: 'error'
223
- });
224
- }
225
- if (!evidence.description || evidence.description.trim().length === 0) {
226
- errors.push({
227
- field: `evidence[${index}].description`,
228
- message: 'Evidence description is required',
229
- severity: 'error'
230
- });
231
- }
232
- if (!evidence.timestamp) {
233
- errors.push({
234
- field: `evidence[${index}].timestamp`,
235
- message: 'Evidence timestamp is required',
236
- severity: 'error'
237
- });
238
- }
239
- if (evidence.data === null || evidence.data === undefined) {
240
- warnings.push({
241
- field: `evidence[${index}].data`,
242
- message: 'Evidence data is empty',
243
- severity: 'warning'
244
- });
245
- }
246
- return {
247
- valid: errors.length === 0,
248
- errors,
249
- warnings
250
- };
251
- }
252
- /**
253
- * Validate Feature Flag
254
- */
255
- validateFeatureFlag(flag, index) {
256
- const errors = [];
257
- const warnings = [];
258
- if (!flag.id) {
259
- errors.push({
260
- field: `featureFlags[${index}].id`,
261
- message: 'Feature flag ID is required',
262
- severity: 'error'
263
- });
264
- }
265
- if (!flag.name || flag.name.trim().length === 0) {
266
- errors.push({
267
- field: `featureFlags[${index}].name`,
268
- message: 'Feature flag name is required',
269
- severity: 'error'
270
- });
271
- }
272
- const validTypes = ['boolean', 'string', 'number', 'json'];
273
- if (!validTypes.includes(flag.type)) {
274
- errors.push({
275
- field: `featureFlags[${index}].type`,
276
- message: `Invalid flag type "${flag.type}". Must be one of: ${validTypes.join(', ')}`,
277
- severity: 'error'
278
- });
279
- }
280
- if (flag.defaultValue === null || flag.defaultValue === undefined) {
281
- errors.push({
282
- field: `featureFlags[${index}].defaultValue`,
283
- message: 'Feature flag default value is required',
284
- severity: 'error'
285
- });
286
- }
287
- // Type-specific validation
288
- if (flag.type === 'boolean' && typeof flag.defaultValue !== 'boolean') {
289
- errors.push({
290
- field: `featureFlags[${index}].defaultValue`,
291
- message: 'Boolean flag must have boolean default value',
292
- severity: 'error'
293
- });
294
- }
295
- if (flag.type === 'number' && typeof flag.defaultValue !== 'number') {
296
- errors.push({
297
- field: `featureFlags[${index}].defaultValue`,
298
- message: 'Number flag must have number default value',
299
- severity: 'error'
300
- });
301
- }
302
- if (flag.type === 'string' && typeof flag.defaultValue !== 'string') {
303
- errors.push({
304
- field: `featureFlags[${index}].defaultValue`,
305
- message: 'String flag must have string default value',
306
- severity: 'error'
307
- });
308
- }
309
- return {
310
- valid: errors.length === 0,
311
- errors,
312
- warnings
313
- };
314
- }
315
- /**
316
- * Validate Experiment
317
- */
318
- validateExperiment(experiment, index) {
319
- const errors = [];
320
- const warnings = [];
321
- if (!experiment.id) {
322
- errors.push({
323
- field: `experiments[${index}].id`,
324
- message: 'Experiment ID is required',
325
- severity: 'error'
326
- });
327
- }
328
- if (!experiment.name || experiment.name.trim().length === 0) {
329
- errors.push({
330
- field: `experiments[${index}].name`,
331
- message: 'Experiment name is required',
332
- severity: 'error'
333
- });
334
- }
335
- if (!experiment.hypothesis || experiment.hypothesis.trim().length === 0) {
336
- errors.push({
337
- field: `experiments[${index}].hypothesis`,
338
- message: 'Experiment hypothesis is required',
339
- severity: 'error'
340
- });
341
- }
342
- if (experiment.variants.length < 2) {
343
- errors.push({
344
- field: `experiments[${index}].variants`,
345
- message: 'Experiment must have at least 2 variants',
346
- severity: 'error'
347
- });
348
- }
349
- // Validate variant allocations sum to 100%
350
- const totalAllocation = experiment.variants.reduce((sum, variant) => sum + variant.allocation, 0);
351
- if (Math.abs(totalAllocation - 100) > 0.01) {
352
- errors.push({
353
- field: `experiments[${index}].variants`,
354
- message: `Variant allocations must sum to 100%, currently ${totalAllocation}%`,
355
- severity: 'error'
356
- });
357
- }
358
- const validStatuses = ['draft', 'running', 'paused', 'completed'];
359
- if (!validStatuses.includes(experiment.status)) {
360
- errors.push({
361
- field: `experiments[${index}].status`,
362
- message: `Invalid experiment status "${experiment.status}". Must be one of: ${validStatuses.join(', ')}`,
363
- severity: 'error'
364
- });
365
- }
366
- return {
367
- valid: errors.length === 0,
368
- errors,
369
- warnings
370
- };
371
- }
372
- /**
373
- * Validate YAML frontmatter structure
374
- */
375
- validateYamlFrontmatter(frontmatter) {
376
- const errors = [];
377
- const warnings = [];
378
- const requiredFields = ['id', 'intent', 'author', 'status'];
379
- for (const field of requiredFields) {
380
- if (!frontmatter[field]) {
381
- errors.push({
382
- field: `frontmatter.${field}`,
383
- message: `Required frontmatter field "${field}" is missing`,
384
- severity: 'error'
385
- });
386
- }
387
- }
388
- if (frontmatter.author && typeof frontmatter.author === 'object') {
389
- if (!frontmatter.author.name) {
390
- errors.push({
391
- field: 'frontmatter.author.name',
392
- message: 'Author name is required in frontmatter',
393
- severity: 'error'
394
- });
395
- }
396
- }
397
- // Validate date formats
398
- const dateFields = ['createdAt', 'updatedAt'];
399
- for (const field of dateFields) {
400
- if (frontmatter[field] && !this.isValidISODate(frontmatter[field])) {
401
- errors.push({
402
- field: `frontmatter.${field}`,
403
- message: `Invalid date format for ${field}. Use ISO 8601 format`,
404
- severity: 'error'
405
- });
406
- }
407
- }
408
- return {
409
- valid: errors.length === 0,
410
- errors,
411
- warnings
412
- };
413
- }
414
- /**
415
- * Validate markdown content structure
416
- */
417
- validateMarkdownContent(content) {
418
- const errors = [];
419
- const warnings = [];
420
- // Check for required sections
421
- const requiredSections = ['Problem Statement', 'Implementation Plan'];
422
- const recommendedSections = ['Success Criteria', 'Design Artifacts'];
423
- for (const section of requiredSections) {
424
- if (!content.includes(`## ${section}`)) {
425
- errors.push({
426
- field: 'markdown.content',
427
- message: `Required section "${section}" is missing`,
428
- severity: 'error'
429
- });
430
- }
431
- }
432
- for (const section of recommendedSections) {
433
- if (!content.includes(`## ${section}`)) {
434
- warnings.push({
435
- field: 'markdown.content',
436
- message: `Recommended section "${section}" is missing`,
437
- severity: 'warning'
438
- });
439
- }
440
- }
441
- // Check for empty sections
442
- const sections = content.split(/^## /m);
443
- for (const section of sections) {
444
- if (section.trim().length === 0) {
445
- warnings.push({
446
- field: 'markdown.content',
447
- message: 'Found empty section in markdown content',
448
- severity: 'warning'
449
- });
450
- }
451
- }
452
- return {
453
- valid: errors.length === 0,
454
- errors,
455
- warnings
456
- };
457
- }
458
- /**
459
- * Helper method to validate email format
460
- */
461
- isValidEmail(email) {
462
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
463
- return emailRegex.test(email);
464
- }
465
- /**
466
- * Helper method to validate ISO date format
467
- */
468
- isValidISODate(dateString) {
469
- const date = new Date(dateString);
470
- return date instanceof Date && !isNaN(date.getTime()) && date.toISOString() === dateString;
471
- }
472
- /**
473
- * Format validation results for display
474
- */
475
- formatValidationResults(result) {
476
- let output = '';
477
- if (result.errors.length > 0) {
478
- output += '❌ Validation Errors:\n';
479
- result.errors.forEach(error => {
480
- output += ` • ${error.field}: ${error.message}\n`;
481
- });
482
- }
483
- if (result.warnings.length > 0) {
484
- output += '⚠️ Validation Warnings:\n';
485
- result.warnings.forEach(warning => {
486
- output += ` • ${warning.field}: ${warning.message}\n`;
487
- });
488
- }
489
- if (result.valid && result.warnings.length === 0) {
490
- output = '✅ Validation passed with no issues';
491
- }
492
- else if (result.valid) {
493
- output = '✅ Validation passed with warnings\n' + output;
494
- }
495
- return output;
496
- }
497
- }
498
- // Export a singleton instance
499
- export const validationManager = new ValidationManager();
500
- //# sourceMappingURL=validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}