specweave 0.22.14 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/CLAUDE.md +178 -1
  2. package/dist/src/cli/commands/import-external.d.ts +22 -0
  3. package/dist/src/cli/commands/import-external.d.ts.map +1 -0
  4. package/dist/src/cli/commands/import-external.js +282 -0
  5. package/dist/src/cli/commands/import-external.js.map +1 -0
  6. package/dist/src/cli/commands/init.d.ts.map +1 -1
  7. package/dist/src/cli/commands/init.js +46 -0
  8. package/dist/src/cli/commands/init.js.map +1 -1
  9. package/dist/src/cli/helpers/github-repo-selector.d.ts +59 -0
  10. package/dist/src/cli/helpers/github-repo-selector.d.ts.map +1 -0
  11. package/dist/src/cli/helpers/github-repo-selector.js +265 -0
  12. package/dist/src/cli/helpers/github-repo-selector.js.map +1 -0
  13. package/dist/src/config/types.d.ts +16 -16
  14. package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -1
  15. package/dist/src/core/increment/ac-status-manager.js +4 -2
  16. package/dist/src/core/increment/ac-status-manager.js.map +1 -1
  17. package/dist/src/core/increment/completion-validator.d.ts +30 -1
  18. package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
  19. package/dist/src/core/increment/completion-validator.js +151 -3
  20. package/dist/src/core/increment/completion-validator.js.map +1 -1
  21. package/dist/src/core/increment/increment-archiver.d.ts +25 -0
  22. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
  23. package/dist/src/core/increment/increment-archiver.js +130 -3
  24. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  25. package/dist/src/core/living-docs/feature-archiver.d.ts +37 -0
  26. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  27. package/dist/src/core/living-docs/feature-archiver.js +262 -18
  28. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  29. package/dist/src/core/living-docs/feature-id-manager.d.ts +17 -0
  30. package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
  31. package/dist/src/core/living-docs/feature-id-manager.js +25 -0
  32. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
  33. package/dist/src/core/living-docs/living-docs-sync.d.ts +14 -0
  34. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  35. package/dist/src/core/living-docs/living-docs-sync.js +46 -0
  36. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  37. package/dist/src/core/sync/sync-event-logger.d.ts +15 -1
  38. package/dist/src/core/sync/sync-event-logger.d.ts.map +1 -1
  39. package/dist/src/core/sync/sync-event-logger.js +39 -1
  40. package/dist/src/core/sync/sync-event-logger.js.map +1 -1
  41. package/dist/src/core/types/sync-config-validator.d.ts +57 -0
  42. package/dist/src/core/types/sync-config-validator.d.ts.map +1 -0
  43. package/dist/src/core/types/sync-config-validator.js +116 -0
  44. package/dist/src/core/types/sync-config-validator.js.map +1 -0
  45. package/dist/src/importers/duplicate-detector.d.ts +107 -0
  46. package/dist/src/importers/duplicate-detector.d.ts.map +1 -0
  47. package/dist/src/importers/duplicate-detector.js +189 -0
  48. package/dist/src/importers/duplicate-detector.js.map +1 -0
  49. package/dist/src/importers/import-coordinator.d.ts +15 -0
  50. package/dist/src/importers/import-coordinator.d.ts.map +1 -1
  51. package/dist/src/importers/import-coordinator.js +43 -1
  52. package/dist/src/importers/import-coordinator.js.map +1 -1
  53. package/dist/src/importers/item-converter.d.ts +5 -0
  54. package/dist/src/importers/item-converter.d.ts.map +1 -1
  55. package/dist/src/importers/item-converter.js +27 -2
  56. package/dist/src/importers/item-converter.js.map +1 -1
  57. package/dist/src/importers/rate-limiter.d.ts +128 -0
  58. package/dist/src/importers/rate-limiter.d.ts.map +1 -0
  59. package/dist/src/importers/rate-limiter.js +200 -0
  60. package/dist/src/importers/rate-limiter.js.map +1 -0
  61. package/dist/src/init/compliance/types.d.ts +2 -2
  62. package/dist/src/integrations/ado/ado-client.d.ts +6 -0
  63. package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
  64. package/dist/src/integrations/ado/ado-client.js +23 -0
  65. package/dist/src/integrations/ado/ado-client.js.map +1 -1
  66. package/dist/src/integrations/jira/jira-client.d.ts +6 -0
  67. package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
  68. package/dist/src/integrations/jira/jira-client.js +38 -0
  69. package/dist/src/integrations/jira/jira-client.js.map +1 -1
  70. package/dist/src/sync/external-item-sync-service.d.ts +150 -0
  71. package/dist/src/sync/external-item-sync-service.d.ts.map +1 -0
  72. package/dist/src/sync/external-item-sync-service.js +241 -0
  73. package/dist/src/sync/external-item-sync-service.js.map +1 -0
  74. package/dist/src/sync/format-preservation-sync.d.ts +90 -0
  75. package/dist/src/sync/format-preservation-sync.d.ts.map +1 -0
  76. package/dist/src/sync/format-preservation-sync.js +173 -0
  77. package/dist/src/sync/format-preservation-sync.js.map +1 -0
  78. package/dist/src/sync/index.d.ts +8 -0
  79. package/dist/src/sync/index.d.ts.map +1 -0
  80. package/dist/src/sync/index.js +6 -0
  81. package/dist/src/sync/index.js.map +1 -0
  82. package/dist/src/sync/sync-coordinator.d.ts +49 -0
  83. package/dist/src/sync/sync-coordinator.d.ts.map +1 -0
  84. package/dist/src/sync/sync-coordinator.js +248 -0
  85. package/dist/src/sync/sync-coordinator.js.map +1 -0
  86. package/dist/src/sync/sync-metadata.d.ts +75 -0
  87. package/dist/src/sync/sync-metadata.d.ts.map +1 -0
  88. package/dist/src/sync/sync-metadata.js +100 -0
  89. package/dist/src/sync/sync-metadata.js.map +1 -0
  90. package/dist/src/types/living-docs-us-file.d.ts +63 -0
  91. package/dist/src/types/living-docs-us-file.d.ts.map +1 -0
  92. package/dist/src/types/living-docs-us-file.js +27 -0
  93. package/dist/src/types/living-docs-us-file.js.map +1 -0
  94. package/dist/src/validators/format-preservation-validator.d.ts +127 -0
  95. package/dist/src/validators/format-preservation-validator.d.ts.map +1 -0
  96. package/dist/src/validators/format-preservation-validator.js +187 -0
  97. package/dist/src/validators/format-preservation-validator.js.map +1 -0
  98. package/package.json +3 -2
  99. package/plugins/specweave/.claude-plugin/plugin.json +20 -0
  100. package/plugins/specweave/commands/specweave-archive-features.md +11 -1
  101. package/plugins/specweave/commands/specweave-import-docs.md +88 -278
  102. package/plugins/specweave/commands/specweave-import-external.md +407 -0
  103. package/plugins/specweave/hooks/post-edit-spec.sh +41 -0
  104. package/plugins/specweave/hooks/post-increment-completion.sh +0 -0
  105. package/plugins/specweave/hooks/post-spec-update.sh +0 -0
  106. package/plugins/specweave/hooks/post-task-completion.sh +13 -3
  107. package/plugins/specweave/hooks/post-write-spec.sh +37 -0
  108. package/plugins/specweave/lib/hooks/auto-transition.js +1 -1
  109. package/plugins/specweave/lib/hooks/auto-transition.ts +1 -1
  110. package/plugins/specweave/lib/hooks/invoke-translator-skill.js +1 -1
  111. package/plugins/specweave/lib/hooks/invoke-translator-skill.ts +1 -1
  112. package/plugins/specweave/lib/hooks/sync-living-docs.js +35 -1
  113. package/plugins/specweave/lib/hooks/sync-us-tasks.js +179 -3
  114. package/plugins/specweave/lib/hooks/translate-file.js +1 -1
  115. package/plugins/specweave/lib/hooks/translate-file.ts +1 -1
  116. package/plugins/specweave/lib/hooks/update-ac-status.js +1 -1
  117. package/plugins/specweave/lib/hooks/update-ac-status.ts +1 -1
  118. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.d.ts +115 -0
  119. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +345 -0
  120. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -0
  121. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.d.ts +106 -0
  122. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +220 -0
  123. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -0
  124. package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +60 -0
  125. package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +192 -0
  126. package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -0
  127. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.d.ts +52 -0
  128. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +276 -0
  129. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -0
  130. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +163 -0
  131. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +541 -0
  132. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -0
  133. package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +157 -0
  134. package/plugins/specweave/lib/vendor/core/types/increment-metadata.js +191 -0
  135. package/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -0
  136. package/plugins/specweave/lib/vendor/generators/spec/task-parser.d.ts +95 -0
  137. package/plugins/specweave/lib/vendor/generators/spec/task-parser.js +301 -0
  138. package/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -0
  139. package/plugins/specweave/lib/vendor/utils/logger.d.ts +48 -0
  140. package/plugins/specweave/lib/vendor/utils/logger.js +53 -0
  141. package/plugins/specweave/lib/vendor/utils/logger.js.map +1 -0
  142. package/plugins/specweave/lib/vendor/utils/translation.d.ts +187 -0
  143. package/plugins/specweave/lib/vendor/utils/translation.js +414 -0
  144. package/plugins/specweave/lib/vendor/utils/translation.js.map +1 -0
  145. package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
  146. package/plugins/specweave-github/commands/specweave-github-update-user-story.md +1 -1
  147. package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +1 -1
  148. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
  149. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
  150. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +0 -5694
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Duplicate Detector
3
+ *
4
+ * Detects duplicate external items by scanning living docs for existing external IDs.
5
+ * Prevents re-importing items that have already been imported.
6
+ */
7
+ import fs from 'fs-extra';
8
+ import path from 'path';
9
+ import matter from 'gray-matter';
10
+ import { glob } from 'glob';
11
+ /**
12
+ * Duplicate Detector
13
+ *
14
+ * Scans living docs US files for external_id metadata and provides
15
+ * duplicate detection functionality.
16
+ */
17
+ export class DuplicateDetector {
18
+ constructor(options) {
19
+ this.cache = null;
20
+ this.options = {
21
+ enableCache: true,
22
+ ...options,
23
+ };
24
+ }
25
+ /**
26
+ * Check if an external ID already exists in living docs
27
+ *
28
+ * @param externalId - External ID to check (e.g., "GH-#638", "JIRA-PROJ-123")
29
+ * @returns True if external ID exists (duplicate), false otherwise
30
+ */
31
+ async checkExistingExternalId(externalId) {
32
+ const reference = await this.findExternalIdReference(externalId);
33
+ return reference !== null;
34
+ }
35
+ /**
36
+ * Find the User Story that contains a specific external ID
37
+ *
38
+ * @param externalId - External ID to search for
39
+ * @returns External ID reference if found, null otherwise
40
+ */
41
+ async findExternalIdReference(externalId) {
42
+ // Build or use cache
43
+ const externalIdMap = await this.buildExternalIdMap();
44
+ // Normalize external ID for lookup
45
+ const normalizedId = this.normalizeExternalId(externalId);
46
+ return externalIdMap.get(normalizedId) || null;
47
+ }
48
+ /**
49
+ * Get all external IDs currently in living docs
50
+ *
51
+ * @returns Map of external ID to reference
52
+ */
53
+ async getAllExternalIds() {
54
+ return this.buildExternalIdMap();
55
+ }
56
+ /**
57
+ * Build map of external IDs to User Story references
58
+ */
59
+ async buildExternalIdMap() {
60
+ // Return cached map if available
61
+ if (this.options.enableCache && this.cache) {
62
+ return this.cache;
63
+ }
64
+ const externalIdMap = new Map();
65
+ // Find all US markdown files in specs directory
66
+ const usFiles = await this.findUserStoryFiles();
67
+ // Scan each file for external_id metadata
68
+ for (const filePath of usFiles) {
69
+ const reference = await this.extractExternalIdFromFile(filePath);
70
+ if (reference) {
71
+ const normalizedId = this.normalizeExternalId(reference.externalId);
72
+ externalIdMap.set(normalizedId, reference);
73
+ }
74
+ }
75
+ // Cache the map if enabled
76
+ if (this.options.enableCache) {
77
+ this.cache = externalIdMap;
78
+ }
79
+ return externalIdMap;
80
+ }
81
+ /**
82
+ * Find all User Story markdown files in specs directory
83
+ */
84
+ async findUserStoryFiles() {
85
+ if (!fs.existsSync(this.options.specsDir)) {
86
+ return [];
87
+ }
88
+ // Match us-*.md files
89
+ const pattern = path.join(this.options.specsDir, 'us-*.md');
90
+ const files = await glob(pattern, { nodir: true });
91
+ return files;
92
+ }
93
+ /**
94
+ * Extract external_id from a User Story file
95
+ *
96
+ * @param filePath - Path to User Story markdown file
97
+ * @returns External ID reference if found, null otherwise
98
+ */
99
+ async extractExternalIdFromFile(filePath) {
100
+ try {
101
+ const content = await fs.readFile(filePath, 'utf-8');
102
+ // Try to parse frontmatter
103
+ const parsed = matter(content);
104
+ // Check for external_id in frontmatter
105
+ if (parsed.data.external_id) {
106
+ return {
107
+ usId: this.extractUsIdFromFile(filePath, content),
108
+ filePath,
109
+ externalId: String(parsed.data.external_id),
110
+ platform: parsed.data.external_platform,
111
+ };
112
+ }
113
+ // Fallback: Parse external metadata section in content
114
+ const externalIdMatch = content.match(/^-\s+\*\*External ID\*\*:\s+(.+)$/m);
115
+ if (externalIdMatch) {
116
+ return {
117
+ usId: this.extractUsIdFromFile(filePath, content),
118
+ filePath,
119
+ externalId: externalIdMatch[1].trim(),
120
+ };
121
+ }
122
+ return null;
123
+ }
124
+ catch (error) {
125
+ // Skip files that can't be read
126
+ return null;
127
+ }
128
+ }
129
+ /**
130
+ * Extract US-ID from file name or content
131
+ */
132
+ extractUsIdFromFile(filePath, content) {
133
+ // Try filename: us-001e-title.md → US-001E
134
+ const fileNameMatch = path.basename(filePath).match(/^us-(\d{3}e)/i);
135
+ if (fileNameMatch) {
136
+ return `US-${fileNameMatch[1].toUpperCase()}`;
137
+ }
138
+ // Try content: # US-001E: Title
139
+ const contentMatch = content.match(/^#\s+(US-\d{3}E):/m);
140
+ if (contentMatch) {
141
+ return contentMatch[1];
142
+ }
143
+ // Fallback: use filename
144
+ return path.basename(filePath, '.md');
145
+ }
146
+ /**
147
+ * Normalize external ID for consistent comparison
148
+ *
149
+ * Examples:
150
+ * - "GH-#638" → "gh-638"
151
+ * - "GITHUB-638" → "gh-638"
152
+ * - "JIRA-PROJ-123" → "jira-proj-123"
153
+ */
154
+ normalizeExternalId(externalId) {
155
+ return externalId
156
+ .toLowerCase()
157
+ .replace(/^github-/i, 'gh-')
158
+ .replace(/^gh-#/, 'gh-')
159
+ .replace(/^jira-/i, 'jira-')
160
+ .replace(/^ado-/i, 'ado-');
161
+ }
162
+ /**
163
+ * Clear the cache (useful for testing or after imports)
164
+ */
165
+ clearCache() {
166
+ this.cache = null;
167
+ }
168
+ /**
169
+ * Get cache statistics
170
+ */
171
+ getCacheStats() {
172
+ return {
173
+ enabled: this.options.enableCache ?? true,
174
+ size: this.cache?.size ?? 0,
175
+ };
176
+ }
177
+ }
178
+ /**
179
+ * Check if an external ID exists (convenience function)
180
+ *
181
+ * @param externalId - External ID to check
182
+ * @param specsDir - Living docs specs directory
183
+ * @returns True if duplicate exists
184
+ */
185
+ export async function checkExistingExternalId(externalId, specsDir) {
186
+ const detector = new DuplicateDetector({ specsDir });
187
+ return detector.checkExistingExternalId(externalId);
188
+ }
189
+ //# sourceMappingURL=duplicate-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-detector.js","sourceRoot":"","sources":["../../../src/importers/duplicate-detector.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  * Handles parallel execution, progress tracking, and result aggregation.
6
6
  */
7
7
  import type { ExternalItem, ImportConfig, ImportResult } from './external-importer.js';
8
+ import { type RateLimitInfo } from './rate-limiter.js';
8
9
  export interface CoordinatorConfig {
9
10
  /** Import from GitHub */
10
11
  github?: {
@@ -30,6 +31,16 @@ export interface CoordinatorConfig {
30
31
  parallel?: boolean;
31
32
  /** Progress callback */
32
33
  onProgress?: (platform: string, count: number, total?: number) => void;
34
+ /** Project root for sync metadata (default: process.cwd()) */
35
+ projectRoot?: string;
36
+ /** Enable sync metadata tracking (default: true) */
37
+ enableSyncMetadata?: boolean;
38
+ /** Enable rate limiting (default: true) */
39
+ enableRateLimiting?: boolean;
40
+ /** Callback when rate limit warning */
41
+ onRateLimitWarning?: (platform: string, rateLimitInfo: RateLimitInfo) => void;
42
+ /** Callback when rate limit pause */
43
+ onRateLimitPause?: (platform: string, seconds: number) => void;
33
44
  }
34
45
  export interface CoordinatorResult {
35
46
  /** Combined results from all platforms */
@@ -42,6 +53,8 @@ export interface CoordinatorResult {
42
53
  errors: Record<string, string[]>;
43
54
  /** Platforms that were imported from */
44
55
  platforms: Array<'github' | 'jira' | 'ado'>;
56
+ /** Total items skipped as duplicates (if duplicate detection enabled) */
57
+ totalSkipped?: number;
45
58
  }
46
59
  /**
47
60
  * Import Coordinator
@@ -49,6 +62,8 @@ export interface CoordinatorResult {
49
62
  export declare class ImportCoordinator {
50
63
  private importers;
51
64
  private config;
65
+ private rateLimiter;
66
+ private projectRoot;
52
67
  constructor(config: CoordinatorConfig);
53
68
  /**
54
69
  * Initialize importers based on configuration
@@ -1 +1 @@
1
- {"version":3,"file":"import-coordinator.d.ts","sourceRoot":"","sources":["../../../src/importers/import-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAY,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAKjG,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,uBAAuB;IACvB,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,+BAA+B;IAC/B,GAAG,CAAC,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAEF,kCAAkC;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACxE;AAED,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,OAAO,EAAE,YAAY,EAAE,CAAC;IAExB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IAEnB,yBAAyB;IACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;IAEzB,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjC,wCAAwC;IACxC,SAAS,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB;IAKrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgD3B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAU7C;;OAEG;YACW,cAAc;IAU5B;;OAEG;YACW,gBAAgB;IAkB9B;;OAEG;YACW,kBAAkB;IA0BhC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyCxB;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IAU5E;;OAEG;IACH,sBAAsB,IAAI,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAI1D;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO;CAGnE"}
1
+ {"version":3,"file":"import-coordinator.d.ts","sourceRoot":"","sources":["../../../src/importers/import-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAY,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAKjG,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,uBAAuB;IACvB,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,+BAA+B;IAC/B,GAAG,CAAC,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAEF,kCAAkC;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvE,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,KAAK,IAAI,CAAC;IAE9E,qCAAqC;IACrC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChE;AAED,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,OAAO,EAAE,YAAY,EAAE,CAAC;IAExB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IAEnB,yBAAyB;IACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;IAEzB,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjC,wCAAwC;IACxC,SAAS,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;IAE5C,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,iBAAiB;IAiBrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgD3B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAU7C;;OAEG;YACW,cAAc;IAU5B;;OAEG;YACW,gBAAgB;IAkB9B;;OAEG;YACW,kBAAkB;IAyDhC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyCxB;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IAU5E;;OAEG;IACH,sBAAsB,IAAI,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAI1D;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO;CAGnE"}
@@ -7,13 +7,26 @@
7
7
  import { GitHubImporter } from './github-importer.js';
8
8
  import { JiraImporter } from './jira-importer.js';
9
9
  import { ADOImporter } from './ado-importer.js';
10
+ import { updateSyncMetadata } from '../sync/sync-metadata.js';
11
+ import { RateLimiter } from './rate-limiter.js';
10
12
  /**
11
13
  * Import Coordinator
12
14
  */
13
15
  export class ImportCoordinator {
14
16
  constructor(config) {
15
17
  this.importers = new Map();
16
- this.config = config;
18
+ this.rateLimiter = null;
19
+ this.config = {
20
+ enableSyncMetadata: true,
21
+ enableRateLimiting: true,
22
+ projectRoot: process.cwd(),
23
+ ...config,
24
+ };
25
+ this.projectRoot = this.config.projectRoot;
26
+ // Initialize rate limiter if enabled
27
+ if (this.config.enableRateLimiting) {
28
+ this.rateLimiter = new RateLimiter();
29
+ }
17
30
  this.initializeImporters();
18
31
  }
19
32
  /**
@@ -108,9 +121,38 @@ export class ImportCoordinator {
108
121
  this.config.onProgress(platform, items.length);
109
122
  }
110
123
  }
124
+ // Update sync metadata if enabled
125
+ if (this.config.enableSyncMetadata && items.length > 0) {
126
+ const metadata = {
127
+ lastImport: new Date().toISOString(),
128
+ lastImportCount: items.length,
129
+ lastSyncResult: errors.length > 0 ? 'partial' : 'success',
130
+ };
131
+ try {
132
+ updateSyncMetadata(this.projectRoot, platform, metadata);
133
+ }
134
+ catch (error) {
135
+ // Log metadata update error but don't fail the import
136
+ errors.push(`Failed to update sync metadata: ${error.message}`);
137
+ }
138
+ }
111
139
  }
112
140
  catch (error) {
113
141
  errors.push(error.message || String(error));
142
+ // Update sync metadata with failed status
143
+ if (this.config.enableSyncMetadata) {
144
+ const metadata = {
145
+ lastImport: new Date().toISOString(),
146
+ lastImportCount: 0,
147
+ lastSyncResult: 'failed',
148
+ };
149
+ try {
150
+ updateSyncMetadata(this.projectRoot, platform, metadata);
151
+ }
152
+ catch {
153
+ // Ignore metadata update errors on failed imports
154
+ }
155
+ }
114
156
  }
115
157
  return {
116
158
  count: items.length,
@@ -1 +1 @@
1
- {"version":3,"file":"import-coordinator.js","sourceRoot":"","sources":["../../../src/importers/import-coordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"import-coordinator.js","sourceRoot":"","sources":["../../../src/importers/import-coordinator.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,10 @@ export interface ItemConverterOptions {
42
42
  projectRoot?: string;
43
43
  /** Enable feature-level organization with FS-ID allocation */
44
44
  enableFeatureAllocation?: boolean;
45
+ /** Enable duplicate detection (default: true) */
46
+ enableDuplicateDetection?: boolean;
47
+ /** Callback for skipped duplicates */
48
+ onDuplicateSkipped?: (externalId: string, existingUsId: string) => void;
45
49
  }
46
50
  /**
47
51
  * Convert external items to living docs User Stories
@@ -51,6 +55,7 @@ export interface ItemConverterOptions {
51
55
  */
52
56
  export declare class ItemConverter {
53
57
  private options;
58
+ private duplicateDetector;
54
59
  constructor(options: ItemConverterOptions);
55
60
  /**
56
61
  * Convert a single external item to a User Story with E suffix
@@ -1 +1 @@
1
- {"version":3,"file":"item-converter.d.ts","sourceRoot":"","sources":["../../../src/importers/item-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAO3D,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IAEX,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IAEd,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IAEpB,0BAA0B;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAE7B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IAEf,wBAAwB;IACxB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;QAC5C,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IAEF,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IAEjB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,8DAA8D;IAC9D,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAuB;gBAE1B,OAAO,EAAE,oBAAoB;IAIzC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB;IA0DjE;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAsBxE;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6ExB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAexB;;;;OAIG;IACH,MAAM,CAAC,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAsB9D"}
1
+ {"version":3,"file":"item-converter.d.ts","sourceRoot":"","sources":["../../../src/importers/item-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAQ3D,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IAEX,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IAEd,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IAEpB,0BAA0B;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAE7B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IAEf,wBAAwB;IACxB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;QAC5C,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IAEF,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IAEjB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,8DAA8D;IAC9D,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,iDAAiD;IACjD,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC,sCAAsC;IACtC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CACzE;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,iBAAiB,CAAkC;gBAE/C,OAAO,EAAE,oBAAoB;IAczC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB;IA0DjE;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAwCxE;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6ExB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAexB;;;;OAIG;IACH,MAAM,CAAC,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAsB9D"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import fs from 'fs-extra';
8
8
  import path from 'path';
9
+ import { DuplicateDetector } from './duplicate-detector.js';
9
10
  /**
10
11
  * Convert external items to living docs User Stories
11
12
  *
@@ -14,7 +15,17 @@ import path from 'path';
14
15
  */
15
16
  export class ItemConverter {
16
17
  constructor(options) {
17
- this.options = options;
18
+ this.duplicateDetector = null;
19
+ this.options = {
20
+ enableDuplicateDetection: true,
21
+ ...options,
22
+ };
23
+ // Initialize duplicate detector if enabled
24
+ if (this.options.enableDuplicateDetection) {
25
+ this.duplicateDetector = new DuplicateDetector({
26
+ specsDir: this.options.specsDir,
27
+ });
28
+ }
18
29
  }
19
30
  /**
20
31
  * Convert a single external item to a User Story with E suffix
@@ -79,12 +90,26 @@ export class ItemConverter {
79
90
  async convertItems(items) {
80
91
  const startingId = this.options.startingId || 1;
81
92
  const converted = [];
93
+ let skippedCount = 0;
82
94
  // Ensure specs directory exists
83
95
  fs.mkdirSync(this.options.specsDir, { recursive: true });
84
96
  // Convert each item
85
97
  for (let i = 0; i < items.length; i++) {
86
98
  const item = items[i];
87
- const usId = startingId + i;
99
+ // Check for duplicates if duplicate detection is enabled
100
+ if (this.duplicateDetector) {
101
+ const existingReference = await this.duplicateDetector.findExternalIdReference(item.id);
102
+ if (existingReference) {
103
+ skippedCount++;
104
+ // Notify callback if provided
105
+ if (this.options.onDuplicateSkipped) {
106
+ this.options.onDuplicateSkipped(item.id, existingReference.usId);
107
+ }
108
+ // Skip this item (duplicate)
109
+ continue;
110
+ }
111
+ }
112
+ const usId = startingId + (i - skippedCount);
88
113
  const userStory = this.convertItem(item, usId);
89
114
  converted.push(userStory);
90
115
  // Write living docs file
@@ -1 +1 @@
1
- {"version":3,"file":"item-converter.js","sourceRoot":"","sources":["../../../src/importers/item-converter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"item-converter.js","sourceRoot":"","sources":["../../../src/importers/item-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AA2D5D;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IAIxB,YAAY,OAA6B;QAFjC,sBAAiB,GAA6B,IAAI,CAAC;QAGzD,IAAI,CAAC,OAAO,GAAG;YACb,wBAAwB,EAAE,IAAI;YAC9B,GAAG,OAAO;SACX,CAAC;QAEF,2CAA2C;QAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC;YAC1C,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,CAAC;gBAC7C,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAkB,EAAE,IAAY;QAC1C,+BAA+B;QAC/B,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;QAElD,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE3C,8BAA8B;QAC9B,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC;QAEzD,wBAAwB;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAEnD,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACrC,EAAE;YACF,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,kBAAkB;YAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM;YACN,WAAW;YACX,QAAQ,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,EAAE;gBACnB,WAAW,EAAE,IAAI,CAAC,GAAG;gBACrB,gBAAgB,EAAE,IAAI,CAAC,QAAQ;gBAC/B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;gBACvC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;gBACvC,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB;SACF,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE5D,OAAO;YACL,EAAE;YACF,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,kBAAkB;YAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM;YACN,QAAQ,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,EAAE;gBACnB,WAAW,EAAE,IAAI,CAAC,GAAG;gBACrB,gBAAgB,EAAE,IAAI,CAAC,QAAQ;gBAC/B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;gBACvC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;gBACvC,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB;YACD,QAAQ;YACR,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,KAAqB;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAChD,MAAM,SAAS,GAAyB,EAAE,CAAC;QAC3C,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,gCAAgC;QAChC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,oBAAoB;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,yDAAyD;YACzD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxF,IAAI,iBAAiB,EAAE,CAAC;oBACtB,YAAY,EAAE,CAAC;oBAEf,8BAA8B;oBAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;wBACpC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBACnE,CAAC;oBAED,6BAA6B;oBAC7B,SAAS;gBACX,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;YAE7C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/C,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE1B,yBAAyB;YACzB,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,cAAsC;QACtD,MAAM,SAAS,GAA2B;YACxC,MAAM,EAAE,MAAM;YACd,aAAa,EAAE,aAAa;YAC5B,WAAW,EAAE,WAAW;YACxB,QAAQ,EAAE,WAAW;SACtB,CAAC;QAEF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC;IAC7C,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,IAAkB;QAC5C,MAAM,aAAa,GAA2B;YAC5C,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,IAAI;SACZ,CAAC;QAEF,MAAM,YAAY,GAA2B;YAC3C,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,cAAc;SACtB,CAAC;QAEF,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;QACnD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;QAE1D,+CAA+C;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAE/D,OAAO,GAAG,KAAK,KAAK,IAAI,KAAK,WAAW,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC;IAC3D,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAiBxB;QACC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,QAAQ;QACR,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,eAAe;QACf,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,sBAAsB;QACtB,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,cAAc;QACd,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,0BAA0B,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,sBAAsB;QACtB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;gBAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBACpF,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,QAAQ;QACR,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,yCAAyC;QACzC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACK,gBAAgB,CAAC,IAAY,EAAE,KAAa;QAClD,6BAA6B;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAElC,8BAA8B;QAC9B,MAAM,SAAS,GAAG,KAAK;aACpB,WAAW,EAAE;aACb,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,uBAAuB;aACpD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAU,8BAA8B;aAC5D,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAW,2BAA2B;aACzD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAiB,oBAAoB;QAErD,OAAO,GAAG,MAAM,IAAI,SAAS,KAAK,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,2BAA2B,CAAC,WAAmB;QACpD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAEzE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,wCAAwC;QAClD,CAAC;QAED,+CAA+C;QAC/C,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAChD,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,iEAAiE;gBACjE,UAAU,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBACtC,wDAAwD,CACzD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Rate Limiter
3
+ *
4
+ * Handles API rate limiting for external platforms (GitHub, JIRA, ADO).
5
+ * Prevents hitting rate limits and provides graceful backoff strategies.
6
+ */
7
+ /**
8
+ * Rate limit information
9
+ */
10
+ export interface RateLimitInfo {
11
+ /** Remaining requests in current window */
12
+ remaining: number;
13
+ /** Total requests allowed per window */
14
+ limit: number;
15
+ /** Timestamp when rate limit resets (ISO string) */
16
+ resetAt: string;
17
+ /** Seconds until reset */
18
+ resetInSeconds: number;
19
+ /** Platform name */
20
+ platform: 'github' | 'jira' | 'ado';
21
+ }
22
+ /**
23
+ * Rate limit thresholds
24
+ */
25
+ export interface RateLimitThresholds {
26
+ /** Warn when remaining requests drop below this (default: 100) */
27
+ warningThreshold?: number;
28
+ /** Pause when remaining requests drop below this (default: 10) */
29
+ pauseThreshold?: number;
30
+ /** Wait time in seconds when paused (default: 60) */
31
+ pauseDuration?: number;
32
+ }
33
+ /**
34
+ * Rate Limiter
35
+ *
36
+ * Monitors and manages API rate limits across platforms.
37
+ */
38
+ export declare class RateLimiter {
39
+ private thresholds;
40
+ private lastRateLimitInfo;
41
+ constructor(thresholds?: RateLimitThresholds);
42
+ /**
43
+ * Check GitHub rate limit from response headers
44
+ *
45
+ * @param headers - HTTP response headers from GitHub API
46
+ * @returns Rate limit information
47
+ */
48
+ checkGitHubRateLimit(headers: Record<string, string>): RateLimitInfo;
49
+ /**
50
+ * Check JIRA rate limit (placeholder - JIRA doesn't expose rate limits in headers)
51
+ *
52
+ * @param headers - HTTP response headers from JIRA API
53
+ * @returns Rate limit information (estimated)
54
+ */
55
+ checkJiraRateLimit(headers: Record<string, string>): RateLimitInfo;
56
+ /**
57
+ * Check Azure DevOps rate limit (placeholder - ADO has different rate limit model)
58
+ *
59
+ * @param headers - HTTP response headers from ADO API
60
+ * @returns Rate limit information (estimated)
61
+ */
62
+ checkAdoRateLimit(headers: Record<string, string>): RateLimitInfo;
63
+ /**
64
+ * Wait if rate limit is low
65
+ *
66
+ * @param platform - Platform to check
67
+ * @param onWait - Callback when waiting (receives wait duration in seconds)
68
+ * @returns True if waited, false if no wait needed
69
+ */
70
+ waitIfNeeded(platform: 'github' | 'jira' | 'ado', onWait?: (platform: string, seconds: number) => void): Promise<boolean>;
71
+ /**
72
+ * Check if rate limit warning should be shown
73
+ *
74
+ * @param platform - Platform to check
75
+ * @returns True if remaining requests are below warning threshold
76
+ */
77
+ shouldWarn(platform: 'github' | 'jira' | 'ado'): boolean;
78
+ /**
79
+ * Get last known rate limit info for a platform
80
+ *
81
+ * @param platform - Platform to query
82
+ * @returns Rate limit info or undefined if not cached
83
+ */
84
+ getLastRateLimitInfo(platform: 'github' | 'jira' | 'ado'): RateLimitInfo | undefined;
85
+ /**
86
+ * Format rate limit warning message
87
+ *
88
+ * @param rateLimitInfo - Rate limit information
89
+ * @returns Formatted warning message
90
+ */
91
+ formatWarning(rateLimitInfo: RateLimitInfo): string;
92
+ /**
93
+ * Format pause message
94
+ *
95
+ * @param platform - Platform name
96
+ * @param seconds - Wait duration in seconds
97
+ * @returns Formatted pause message
98
+ */
99
+ formatPauseMessage(platform: string, seconds: number): string;
100
+ /**
101
+ * Sleep for specified milliseconds
102
+ */
103
+ private sleep;
104
+ /**
105
+ * Clear cached rate limit info (useful for testing)
106
+ */
107
+ clearCache(): void;
108
+ /**
109
+ * Get current thresholds
110
+ */
111
+ getThresholds(): Required<RateLimitThresholds>;
112
+ }
113
+ /**
114
+ * Check if a large import should prompt for confirmation
115
+ *
116
+ * @param itemCount - Number of items to import
117
+ * @param threshold - Confirmation threshold (default: 100)
118
+ * @returns True if confirmation should be requested
119
+ */
120
+ export declare function shouldConfirmLargeImport(itemCount: number, threshold?: number): boolean;
121
+ /**
122
+ * Format large import confirmation message
123
+ *
124
+ * @param itemCount - Number of items to import
125
+ * @returns Formatted confirmation message
126
+ */
127
+ export declare function formatLargeImportMessage(itemCount: number): string;
128
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/importers/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAElB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IAEd,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAEhB,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAC;IAEvB,oBAAoB;IACpB,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAWD;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,iBAAiB,CAAyC;gBAEtD,UAAU,GAAE,mBAAwB;IAOhD;;;;;OAKG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa;IA2BpE;;;;;OAKG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa;IAgBlE;;;;;OAKG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa;IAgBjE;;;;;;OAMG;IACG,YAAY,CAChB,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,EACnC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GACnD,OAAO,CAAC,OAAO,CAAC;IAyBnB;;;;;OAKG;IACH,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO;IAUxD;;;;;OAKG;IACH,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,aAAa,GAAG,SAAS;IAIpF;;;;;OAKG;IACH,aAAa,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM;IAUnD;;;;;;OAMG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAI7D;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,aAAa,IAAI,QAAQ,CAAC,mBAAmB,CAAC;CAG/C;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO,CAE5F;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElE"}