@su-record/vibe 2.5.21 → 2.6.1

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.
Files changed (81) hide show
  1. package/CLAUDE.md +154 -2
  2. package/README.md +132 -2
  3. package/commands/vibe.run.md +69 -44
  4. package/commands/vibe.spec.md +83 -0
  5. package/commands/vibe.trace.md +161 -0
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +5 -3
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/lib/IterationTracker.d.ts +3 -1
  10. package/dist/lib/IterationTracker.d.ts.map +1 -1
  11. package/dist/lib/IterationTracker.js +2 -1
  12. package/dist/lib/IterationTracker.js.map +1 -1
  13. package/dist/lib/constants.d.ts +14 -0
  14. package/dist/lib/constants.d.ts.map +1 -1
  15. package/dist/lib/constants.js +26 -0
  16. package/dist/lib/constants.js.map +1 -1
  17. package/dist/orchestrator/BackgroundManager.d.ts +109 -0
  18. package/dist/orchestrator/BackgroundManager.d.ts.map +1 -0
  19. package/dist/orchestrator/BackgroundManager.js +456 -0
  20. package/dist/orchestrator/BackgroundManager.js.map +1 -0
  21. package/dist/orchestrator/BackgroundManager.test.d.ts +6 -0
  22. package/dist/orchestrator/BackgroundManager.test.d.ts.map +1 -0
  23. package/dist/orchestrator/BackgroundManager.test.js +162 -0
  24. package/dist/orchestrator/BackgroundManager.test.js.map +1 -0
  25. package/dist/orchestrator/PhasePipeline.d.ts +106 -0
  26. package/dist/orchestrator/PhasePipeline.d.ts.map +1 -0
  27. package/dist/orchestrator/PhasePipeline.js +279 -0
  28. package/dist/orchestrator/PhasePipeline.js.map +1 -0
  29. package/dist/orchestrator/backgroundAgent.d.ts +2 -0
  30. package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
  31. package/dist/orchestrator/backgroundAgent.js +2 -0
  32. package/dist/orchestrator/backgroundAgent.js.map +1 -1
  33. package/dist/orchestrator/index.d.ts +4 -1
  34. package/dist/orchestrator/index.d.ts.map +1 -1
  35. package/dist/orchestrator/index.js +5 -1
  36. package/dist/orchestrator/index.js.map +1 -1
  37. package/dist/tools/index.d.ts +4 -0
  38. package/dist/tools/index.d.ts.map +1 -1
  39. package/dist/tools/index.js +14 -0
  40. package/dist/tools/index.js.map +1 -1
  41. package/dist/tools/interaction/askUser.d.ts +115 -0
  42. package/dist/tools/interaction/askUser.d.ts.map +1 -0
  43. package/dist/tools/interaction/askUser.js +504 -0
  44. package/dist/tools/interaction/askUser.js.map +1 -0
  45. package/dist/tools/interaction/index.d.ts +8 -0
  46. package/dist/tools/interaction/index.d.ts.map +1 -0
  47. package/dist/tools/interaction/index.js +17 -0
  48. package/dist/tools/interaction/index.js.map +1 -0
  49. package/dist/tools/spec/index.d.ts +14 -0
  50. package/dist/tools/spec/index.d.ts.map +1 -0
  51. package/dist/tools/spec/index.js +15 -0
  52. package/dist/tools/spec/index.js.map +1 -0
  53. package/dist/tools/spec/prdParser.d.ts +43 -0
  54. package/dist/tools/spec/prdParser.d.ts.map +1 -0
  55. package/dist/tools/spec/prdParser.js +291 -0
  56. package/dist/tools/spec/prdParser.js.map +1 -0
  57. package/dist/tools/spec/prdParser.test.d.ts +6 -0
  58. package/dist/tools/spec/prdParser.test.d.ts.map +1 -0
  59. package/dist/tools/spec/prdParser.test.js +332 -0
  60. package/dist/tools/spec/prdParser.test.js.map +1 -0
  61. package/dist/tools/spec/requirementId.d.ts +65 -0
  62. package/dist/tools/spec/requirementId.d.ts.map +1 -0
  63. package/dist/tools/spec/requirementId.js +161 -0
  64. package/dist/tools/spec/requirementId.js.map +1 -0
  65. package/dist/tools/spec/specGenerator.d.ts +39 -0
  66. package/dist/tools/spec/specGenerator.d.ts.map +1 -0
  67. package/dist/tools/spec/specGenerator.js +426 -0
  68. package/dist/tools/spec/specGenerator.js.map +1 -0
  69. package/dist/tools/spec/specVersioning.d.ts +77 -0
  70. package/dist/tools/spec/specVersioning.d.ts.map +1 -0
  71. package/dist/tools/spec/specVersioning.js +237 -0
  72. package/dist/tools/spec/specVersioning.js.map +1 -0
  73. package/dist/tools/spec/traceabilityMatrix.d.ts +55 -0
  74. package/dist/tools/spec/traceabilityMatrix.d.ts.map +1 -0
  75. package/dist/tools/spec/traceabilityMatrix.js +396 -0
  76. package/dist/tools/spec/traceabilityMatrix.js.map +1 -0
  77. package/dist/tools/spec/traceabilityMatrix.test.d.ts +6 -0
  78. package/dist/tools/spec/traceabilityMatrix.test.d.ts.map +1 -0
  79. package/dist/tools/spec/traceabilityMatrix.test.js +340 -0
  80. package/dist/tools/spec/traceabilityMatrix.test.js.map +1 -0
  81. package/package.json +2 -1
@@ -0,0 +1,426 @@
1
+ /**
2
+ * SPEC Generator - PRD에서 PTCF 구조 SPEC 자동 생성
3
+ * v2.6.0: PRD-to-SPEC 자동화
4
+ *
5
+ * PTCF: Persona, Task, Context, Format (Gemini 프롬프트 최적화)
6
+ */
7
+ // ============================================
8
+ // Main Generator
9
+ // ============================================
10
+ /**
11
+ * PRD에서 SPEC 생성 (메인 함수)
12
+ */
13
+ export function generateSpec(prd, featureName, options = {}) {
14
+ const { techStack = [], phaseThreshold = 5, relatedCodePaths = [], designReference, additionalConstraints = [], additionalOutputs = [], } = options;
15
+ // Phase 분리 결정
16
+ const shouldSplit = prd.requirements.length > phaseThreshold * 3;
17
+ const phases = groupRequirementsIntoPhases(prd.requirements, phaseThreshold);
18
+ if (shouldSplit) {
19
+ return generateSplitSpec(prd, featureName, phases, options);
20
+ }
21
+ return generateSingleSpec(prd, featureName, phases, options);
22
+ }
23
+ /**
24
+ * 단일 SPEC 파일 생성
25
+ */
26
+ function generateSingleSpec(prd, featureName, phases, options) {
27
+ const content = buildSpecContent(prd, featureName, phases, options);
28
+ return {
29
+ content,
30
+ featureName,
31
+ phaseCount: phases.length,
32
+ requirementCount: prd.requirements.length,
33
+ isSplit: false,
34
+ };
35
+ }
36
+ /**
37
+ * 분할 SPEC 파일 생성
38
+ */
39
+ function generateSplitSpec(prd, featureName, phases, options) {
40
+ const splitFiles = [];
41
+ // 마스터 SPEC
42
+ const masterContent = buildMasterSpecContent(prd, featureName, phases, options);
43
+ splitFiles.push({
44
+ path: `_index.md`,
45
+ content: masterContent,
46
+ });
47
+ // Phase별 SPEC
48
+ for (let i = 0; i < phases.length; i++) {
49
+ const phase = phases[i];
50
+ const phaseContent = buildPhaseSpecContent(prd, featureName, phase, i + 1, phases.length, options);
51
+ const phaseName = normalizeFileName(phase.name);
52
+ splitFiles.push({
53
+ path: `phase-${i + 1}-${phaseName}.md`,
54
+ content: phaseContent,
55
+ });
56
+ }
57
+ return {
58
+ content: masterContent,
59
+ featureName,
60
+ phaseCount: phases.length,
61
+ requirementCount: prd.requirements.length,
62
+ isSplit: true,
63
+ splitFiles,
64
+ };
65
+ }
66
+ // ============================================
67
+ // Content Builders
68
+ // ============================================
69
+ /**
70
+ * 단일 SPEC 콘텐츠 빌드
71
+ */
72
+ function buildSpecContent(prd, featureName, phases, options) {
73
+ const { techStack = [], relatedCodePaths = [], designReference, additionalConstraints = [], additionalOutputs = [] } = options;
74
+ const now = new Date().toISOString();
75
+ let content = `---
76
+ status: pending
77
+ currentPhase: 0
78
+ totalPhases: ${phases.length}
79
+ createdAt: ${now}
80
+ lastUpdated: ${now}
81
+ ---
82
+
83
+ # SPEC: ${featureName}
84
+
85
+ ## Persona
86
+ <role>
87
+ Senior developer implementing ${featureName}.
88
+ - Follow existing code patterns and conventions
89
+ - Write testable, maintainable code
90
+ - Consider security and performance implications
91
+ </role>
92
+
93
+ ## Context
94
+ <context>
95
+ ### Background
96
+ ${prd.description || `Implementation of ${prd.title}`}
97
+
98
+ ### Tech Stack
99
+ ${techStack.length > 0 ? techStack.map(t => `- ${t}`).join('\n') : '- (To be determined based on project)'}
100
+
101
+ ### Related Code
102
+ ${relatedCodePaths.length > 0 ? relatedCodePaths.map(p => `- \`${p}\``).join('\n') : '- (Analyze existing codebase for patterns)'}
103
+
104
+ ### Design Reference
105
+ ${designReference || '- (None specified)'}
106
+
107
+ ### Requirements Source
108
+ - Parsed from PRD: ${prd.requirements.length} requirements
109
+ - Format: ${prd.metadata.format}
110
+ </context>
111
+
112
+ ## Task
113
+ <task>
114
+ `;
115
+ // Phase별 태스크 추가
116
+ for (let i = 0; i < phases.length; i++) {
117
+ const phase = phases[i];
118
+ content += `### Phase ${i + 1}: ${phase.name}\n`;
119
+ content += `**Goal**: ${getPhaseGoal(phase)}\n\n`;
120
+ for (const task of phase.tasks) {
121
+ content += `1. [ ] ${task}\n`;
122
+ }
123
+ content += '\n';
124
+ }
125
+ content += `</task>
126
+
127
+ ## Constraints
128
+ <constraints>
129
+ ### Must Follow
130
+ - Follow existing code patterns (ES Module, async/await)
131
+ - Maintain backward compatibility
132
+ - TypeScript strict mode compliance
133
+ - No \`any\` type → Use \`unknown\` + type guards
134
+ - Functions ≤30 lines recommended, ≤50 lines max
135
+ - Nesting ≤3 levels
136
+
137
+ ### Error Handling
138
+ - Proper try-catch with meaningful error messages
139
+ - Loading state handling for async operations
140
+ - User-friendly error messages
141
+
142
+ ### Security
143
+ - Input validation for all user inputs
144
+ - Authentication/authorization checks where needed
145
+ - No sensitive data in logs
146
+ ${additionalConstraints.map(c => `\n- ${c}`).join('')}
147
+ </constraints>
148
+
149
+ ## Output Format
150
+ <output_format>
151
+ ### Files to Create
152
+ ${generateFileList(phases, 'create')}
153
+
154
+ ### Files to Modify
155
+ ${generateFileList(phases, 'modify')}
156
+
157
+ ### Verification Commands
158
+ - \`npm run build\` (build success)
159
+ - \`npm test\` (tests pass)
160
+ - \`tsc --noEmit\` (type check)
161
+ ${additionalOutputs.map(o => `- ${o}`).join('\n')}
162
+ </output_format>
163
+
164
+ ## Acceptance Criteria
165
+ <acceptance>
166
+ `;
167
+ // 요구사항별 AC 추가
168
+ for (const req of prd.requirements) {
169
+ content += `### ${req.id}: ${truncateText(req.description, 60)}\n`;
170
+ if (req.acceptanceCriteria.length > 0) {
171
+ for (const ac of req.acceptanceCriteria) {
172
+ content += `- [ ] ${ac}\n`;
173
+ }
174
+ }
175
+ else {
176
+ content += `- [ ] ${req.description} - implemented and verified\n`;
177
+ }
178
+ content += '\n';
179
+ }
180
+ content += `### Build & Test
181
+ - [ ] \`npm run build\` succeeds
182
+ - [ ] All tests pass
183
+ - [ ] No TypeScript errors
184
+ </acceptance>
185
+ `;
186
+ return content;
187
+ }
188
+ /**
189
+ * 마스터 SPEC 콘텐츠 빌드 (분할용)
190
+ */
191
+ function buildMasterSpecContent(prd, featureName, phases, options) {
192
+ const now = new Date().toISOString();
193
+ let content = `---
194
+ status: pending
195
+ currentPhase: 0
196
+ totalPhases: ${phases.length}
197
+ createdAt: ${now}
198
+ lastUpdated: ${now}
199
+ isMaster: true
200
+ ---
201
+
202
+ # SPEC: ${featureName} (Master)
203
+
204
+ ## Overview
205
+ - **Feature**: ${prd.title}
206
+ - **Total Phases**: ${phases.length}
207
+ - **Total Requirements**: ${prd.requirements.length}
208
+ - **Format**: Split SPEC (large scope)
209
+
210
+ ## Sub-SPECs
211
+
212
+ | Order | SPEC File | Description | Status |
213
+ |-------|-----------|-------------|--------|
214
+ `;
215
+ for (let i = 0; i < phases.length; i++) {
216
+ const phase = phases[i];
217
+ const fileName = `phase-${i + 1}-${normalizeFileName(phase.name)}.md`;
218
+ content += `| ${i + 1} | ${fileName} | ${phase.name} | ⬜ |\n`;
219
+ }
220
+ content += `
221
+ ## Shared Context
222
+
223
+ ### Tech Stack
224
+ ${options.techStack?.map(t => `- ${t}`).join('\n') || '- (See project configuration)'}
225
+
226
+ ### Constraints (Apply to All Phases)
227
+ - Follow existing code patterns
228
+ - TypeScript strict mode
229
+ - No \`any\` type
230
+ - Functions ≤50 lines max
231
+ ${options.additionalConstraints?.map(c => `- ${c}`).join('\n') || ''}
232
+
233
+ ## Execution Order
234
+ \`\`\`
235
+ ${phases.map((p, i) => `Phase ${i + 1}: ${p.name}`).join(' → ')}
236
+ \`\`\`
237
+
238
+ ## Dependencies
239
+ ${generateDependencyList(phases)}
240
+ `;
241
+ return content;
242
+ }
243
+ /**
244
+ * Phase별 SPEC 콘텐츠 빌드
245
+ */
246
+ function buildPhaseSpecContent(prd, featureName, phase, phaseNumber, totalPhases, options) {
247
+ const now = new Date().toISOString();
248
+ let content = `---
249
+ status: pending
250
+ phase: ${phaseNumber}
251
+ totalPhases: ${totalPhases}
252
+ masterSpec: _index.md
253
+ createdAt: ${now}
254
+ lastUpdated: ${now}
255
+ ---
256
+
257
+ # SPEC: ${featureName} - Phase ${phaseNumber}: ${phase.name}
258
+
259
+ ## Persona
260
+ <role>
261
+ Developer implementing Phase ${phaseNumber} of ${featureName}.
262
+ - Focus on ${phase.name}
263
+ - Follow project conventions
264
+ - Write testable code
265
+ </role>
266
+
267
+ ## Context
268
+ <context>
269
+ ### Phase Goal
270
+ ${getPhaseGoal(phase)}
271
+
272
+ ### Requirements (${phase.requirements.length})
273
+ ${phase.requirements.map(r => `- ${r.id}: ${truncateText(r.description, 50)}`).join('\n')}
274
+
275
+ ### Dependencies
276
+ ${phaseNumber > 1 ? `- Requires Phase ${phaseNumber - 1} completion` : '- No dependencies (first phase)'}
277
+ </context>
278
+
279
+ ## Task
280
+ <task>
281
+ `;
282
+ for (const task of phase.tasks) {
283
+ content += `1. [ ] ${task}\n`;
284
+ }
285
+ content += `</task>
286
+
287
+ ## Acceptance Criteria
288
+ <acceptance>
289
+ `;
290
+ for (const req of phase.requirements) {
291
+ content += `- [ ] ${req.id}: ${truncateText(req.description, 60)}\n`;
292
+ }
293
+ content += `- [ ] Phase ${phaseNumber} build succeeds
294
+ - [ ] Phase ${phaseNumber} tests pass
295
+ </acceptance>
296
+ `;
297
+ return content;
298
+ }
299
+ // ============================================
300
+ // Helper Functions
301
+ // ============================================
302
+ /**
303
+ * 요구사항을 Phase로 그룹화
304
+ */
305
+ function groupRequirementsIntoPhases(requirements, threshold) {
306
+ if (requirements.length <= threshold) {
307
+ return [{
308
+ name: 'Implementation',
309
+ requirements,
310
+ tasks: requirements.map(r => generateTaskFromRequirement(r)),
311
+ }];
312
+ }
313
+ // 우선순위별 그룹화
314
+ const high = requirements.filter(r => r.priority === 'high');
315
+ const medium = requirements.filter(r => r.priority === 'medium');
316
+ const low = requirements.filter(r => r.priority === 'low');
317
+ const phases = [];
318
+ // Phase 1: 설정/기반
319
+ const setupReqs = requirements.slice(0, Math.ceil(threshold / 2));
320
+ if (setupReqs.length > 0) {
321
+ phases.push({
322
+ name: 'Setup & Foundation',
323
+ requirements: setupReqs,
324
+ tasks: setupReqs.map(r => generateTaskFromRequirement(r)),
325
+ });
326
+ }
327
+ // Phase 2+: 핵심 기능 (high priority)
328
+ if (high.length > 0) {
329
+ phases.push({
330
+ name: 'Core Features',
331
+ requirements: high,
332
+ tasks: high.map(r => generateTaskFromRequirement(r)),
333
+ });
334
+ }
335
+ // Phase 3+: 중요 기능 (medium priority)
336
+ const remainingMedium = medium.filter(r => !setupReqs.includes(r));
337
+ if (remainingMedium.length > 0) {
338
+ phases.push({
339
+ name: 'Additional Features',
340
+ requirements: remainingMedium,
341
+ tasks: remainingMedium.map(r => generateTaskFromRequirement(r)),
342
+ });
343
+ }
344
+ // Phase 4+: 부가 기능 (low priority)
345
+ if (low.length > 0) {
346
+ phases.push({
347
+ name: 'Enhancements',
348
+ requirements: low,
349
+ tasks: low.map(r => generateTaskFromRequirement(r)),
350
+ });
351
+ }
352
+ // 마지막 Phase: 테스트 & 검증
353
+ phases.push({
354
+ name: 'Testing & Verification',
355
+ requirements: [],
356
+ tasks: [
357
+ 'Write unit tests for all new code',
358
+ 'Write integration tests',
359
+ 'Update documentation',
360
+ 'Final verification and cleanup',
361
+ ],
362
+ });
363
+ return phases;
364
+ }
365
+ /**
366
+ * 요구사항에서 태스크 생성
367
+ */
368
+ function generateTaskFromRequirement(req) {
369
+ const desc = truncateText(req.description, 80);
370
+ return `${req.id}: ${desc}\n - Verify: Test coverage for this requirement`;
371
+ }
372
+ /**
373
+ * Phase 목표 추출
374
+ */
375
+ function getPhaseGoal(phase) {
376
+ if (phase.requirements.length === 0) {
377
+ return phase.name;
378
+ }
379
+ const firstReq = phase.requirements[0];
380
+ return truncateText(firstReq.description, 100);
381
+ }
382
+ /**
383
+ * 파일 목록 생성
384
+ */
385
+ function generateFileList(phases, type) {
386
+ // 실제로는 요구사항을 분석해서 추론해야 하지만, 기본 템플릿 제공
387
+ if (type === 'create') {
388
+ return `- (To be determined based on implementation)
389
+ - \`src/[feature]/index.ts\`
390
+ - \`src/[feature]/[feature].test.ts\``;
391
+ }
392
+ return `- (Analyze existing codebase)
393
+ - Relevant existing files`;
394
+ }
395
+ /**
396
+ * 의존성 목록 생성
397
+ */
398
+ function generateDependencyList(phases) {
399
+ if (phases.length <= 1) {
400
+ return '- No inter-phase dependencies';
401
+ }
402
+ let deps = '';
403
+ for (let i = 1; i < phases.length; i++) {
404
+ deps += `- Phase ${i + 1} depends on Phase ${i}\n`;
405
+ }
406
+ return deps;
407
+ }
408
+ /**
409
+ * 파일명 정규화
410
+ */
411
+ function normalizeFileName(name) {
412
+ return name
413
+ .toLowerCase()
414
+ .replace(/[^a-z0-9]+/g, '-')
415
+ .replace(/^-|-$/g, '')
416
+ .slice(0, 30);
417
+ }
418
+ /**
419
+ * 텍스트 자르기
420
+ */
421
+ function truncateText(text, maxLength) {
422
+ if (text.length <= maxLength)
423
+ return text;
424
+ return text.slice(0, maxLength - 3) + '...';
425
+ }
426
+ //# sourceMappingURL=specGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specGenerator.js","sourceRoot":"","sources":["../../../src/tools/spec/specGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * SPEC Versioning - SPEC 버전 관리 및 Changelog 자동 생성
3
+ * v2.6.0: Git 연동 버전 관리
4
+ */
5
+ /** SPEC 버전 정보 */
6
+ export interface SpecVersion {
7
+ version: string;
8
+ date: string;
9
+ author?: string;
10
+ changes: ChangeEntry[];
11
+ gitTag?: string;
12
+ gitCommit?: string;
13
+ }
14
+ /** 변경 항목 */
15
+ export interface ChangeEntry {
16
+ type: 'added' | 'changed' | 'removed' | 'fixed';
17
+ description: string;
18
+ section?: string;
19
+ requirementId?: string;
20
+ }
21
+ /** 버전 히스토리 */
22
+ export interface VersionHistory {
23
+ featureName: string;
24
+ currentVersion: string;
25
+ versions: SpecVersion[];
26
+ }
27
+ /** 버전 범프 타입 */
28
+ export type BumpType = 'major' | 'minor' | 'patch';
29
+ /**
30
+ * SPEC 버전 범프
31
+ */
32
+ export declare function bumpSpecVersion(specPath: string, bumpType: BumpType, changes: ChangeEntry[]): SpecVersion;
33
+ /**
34
+ * 버전 추출
35
+ */
36
+ export declare function extractVersion(content: string): string | null;
37
+ /**
38
+ * 버전 증가
39
+ */
40
+ export declare function incrementVersion(version: string, bumpType: BumpType): string;
41
+ /**
42
+ * Changelog 생성
43
+ */
44
+ export declare function generateChangelog(history: VersionHistory): string;
45
+ /**
46
+ * Git 태그 생성
47
+ */
48
+ export declare function createGitTag(featureName: string, version: string, message?: string): {
49
+ success: boolean;
50
+ tag: string;
51
+ error?: string;
52
+ };
53
+ /**
54
+ * SPEC 변경사항 감지 (Git diff 기반)
55
+ */
56
+ export declare function detectSpecChanges(specPath: string, baseRef?: string): ChangeEntry[];
57
+ /**
58
+ * 최신 SPEC 커밋 조회
59
+ */
60
+ export declare function getLatestSpecCommit(specPath: string): string | null;
61
+ /**
62
+ * SPEC 버전 히스토리 로드
63
+ */
64
+ export declare function loadVersionHistory(specDir: string, featureName: string): VersionHistory;
65
+ /**
66
+ * SPEC 버전 히스토리 저장
67
+ */
68
+ export declare function saveVersionHistory(specDir: string, history: VersionHistory): void;
69
+ /**
70
+ * Baseline 태깅 (릴리즈 준비 완료 표시)
71
+ */
72
+ export declare function createBaseline(featureName: string, specPath: string): {
73
+ success: boolean;
74
+ baselineName: string;
75
+ error?: string;
76
+ };
77
+ //# sourceMappingURL=specVersioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specVersioning.d.ts","sourceRoot":"","sources":["../../../src/tools/spec/specVersioning.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,iBAAiB;AACjB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,YAAY;AACZ,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,cAAc;AACd,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,eAAe;AACf,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAMnD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW,EAAE,GACrB,WAAW,CAgBb;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAU5E;AA4BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CA0BjE;AAoBD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAcnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAiB,GACzB,WAAW,EAAE,CAyCf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,CAavF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAGjF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsB5D"}