specweave 0.22.14 → 0.23.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.
- package/CLAUDE.md +178 -1
- package/dist/src/cli/commands/import-external.d.ts +22 -0
- package/dist/src/cli/commands/import-external.d.ts.map +1 -0
- package/dist/src/cli/commands/import-external.js +282 -0
- package/dist/src/cli/commands/import-external.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +46 -0
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/github-repo-selector.d.ts +59 -0
- package/dist/src/cli/helpers/github-repo-selector.d.ts.map +1 -0
- package/dist/src/cli/helpers/github-repo-selector.js +265 -0
- package/dist/src/cli/helpers/github-repo-selector.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +5 -17
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/config/types.d.ts +16 -16
- package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -1
- package/dist/src/core/increment/ac-status-manager.js +4 -2
- package/dist/src/core/increment/ac-status-manager.js.map +1 -1
- package/dist/src/core/increment/completion-validator.d.ts +30 -1
- package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
- package/dist/src/core/increment/completion-validator.js +151 -3
- package/dist/src/core/increment/completion-validator.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.d.ts +25 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +130 -3
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts +37 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +262 -18
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.d.ts +17 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.js +25 -0
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +14 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +46 -0
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/repo-structure/repo-id-generator.d.ts +20 -0
- package/dist/src/core/repo-structure/repo-id-generator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-id-generator.js +44 -0
- package/dist/src/core/repo-structure/repo-id-generator.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +5 -2
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/sync/sync-event-logger.d.ts +15 -1
- package/dist/src/core/sync/sync-event-logger.d.ts.map +1 -1
- package/dist/src/core/sync/sync-event-logger.js +39 -1
- package/dist/src/core/sync/sync-event-logger.js.map +1 -1
- package/dist/src/core/types/sync-config-validator.d.ts +57 -0
- package/dist/src/core/types/sync-config-validator.d.ts.map +1 -0
- package/dist/src/core/types/sync-config-validator.js +116 -0
- package/dist/src/core/types/sync-config-validator.js.map +1 -0
- package/dist/src/importers/duplicate-detector.d.ts +107 -0
- package/dist/src/importers/duplicate-detector.d.ts.map +1 -0
- package/dist/src/importers/duplicate-detector.js +189 -0
- package/dist/src/importers/duplicate-detector.js.map +1 -0
- package/dist/src/importers/import-coordinator.d.ts +15 -0
- package/dist/src/importers/import-coordinator.d.ts.map +1 -1
- package/dist/src/importers/import-coordinator.js +43 -1
- package/dist/src/importers/import-coordinator.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +5 -0
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +27 -2
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/importers/rate-limiter.d.ts +128 -0
- package/dist/src/importers/rate-limiter.d.ts.map +1 -0
- package/dist/src/importers/rate-limiter.js +200 -0
- package/dist/src/importers/rate-limiter.js.map +1 -0
- package/dist/src/init/compliance/types.d.ts +2 -2
- package/dist/src/integrations/ado/ado-client.d.ts +6 -0
- package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-client.js +23 -0
- package/dist/src/integrations/ado/ado-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-client.d.ts +6 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +38 -0
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/sync/external-item-sync-service.d.ts +150 -0
- package/dist/src/sync/external-item-sync-service.d.ts.map +1 -0
- package/dist/src/sync/external-item-sync-service.js +241 -0
- package/dist/src/sync/external-item-sync-service.js.map +1 -0
- package/dist/src/sync/format-preservation-sync.d.ts +90 -0
- package/dist/src/sync/format-preservation-sync.d.ts.map +1 -0
- package/dist/src/sync/format-preservation-sync.js +173 -0
- package/dist/src/sync/format-preservation-sync.js.map +1 -0
- package/dist/src/sync/index.d.ts +8 -0
- package/dist/src/sync/index.d.ts.map +1 -0
- package/dist/src/sync/index.js +6 -0
- package/dist/src/sync/index.js.map +1 -0
- package/dist/src/sync/sync-coordinator.d.ts +49 -0
- package/dist/src/sync/sync-coordinator.d.ts.map +1 -0
- package/dist/src/sync/sync-coordinator.js +248 -0
- package/dist/src/sync/sync-coordinator.js.map +1 -0
- package/dist/src/sync/sync-metadata.d.ts +75 -0
- package/dist/src/sync/sync-metadata.d.ts.map +1 -0
- package/dist/src/sync/sync-metadata.js +100 -0
- package/dist/src/sync/sync-metadata.js.map +1 -0
- package/dist/src/types/living-docs-us-file.d.ts +63 -0
- package/dist/src/types/living-docs-us-file.d.ts.map +1 -0
- package/dist/src/types/living-docs-us-file.js +27 -0
- package/dist/src/types/living-docs-us-file.js.map +1 -0
- package/dist/src/validators/format-preservation-validator.d.ts +127 -0
- package/dist/src/validators/format-preservation-validator.d.ts.map +1 -0
- package/dist/src/validators/format-preservation-validator.js +187 -0
- package/dist/src/validators/format-preservation-validator.js.map +1 -0
- package/package.json +3 -2
- package/plugins/specweave/.claude-plugin/plugin.json +20 -0
- package/plugins/specweave/commands/specweave-archive-features.md +11 -1
- package/plugins/specweave/commands/specweave-archive.md +51 -15
- package/plugins/specweave/commands/specweave-import-docs.md +88 -278
- package/plugins/specweave/commands/specweave-import-external.md +407 -0
- package/plugins/specweave/hooks/post-edit-spec.sh +94 -0
- package/plugins/specweave/hooks/post-increment-completion.sh +0 -0
- package/plugins/specweave/hooks/post-spec-update.sh +0 -0
- package/plugins/specweave/hooks/post-task-completion.sh +13 -3
- package/plugins/specweave/hooks/post-write-spec.sh +91 -0
- package/plugins/specweave/lib/hooks/auto-transition.js +1 -1
- package/plugins/specweave/lib/hooks/auto-transition.js.bak +50 -0
- package/plugins/specweave/lib/hooks/auto-transition.ts +1 -1
- package/plugins/specweave/lib/hooks/auto-transition.ts.bak +84 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts.bak +89 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.js.bak +142 -0
- package/plugins/specweave/lib/hooks/git-diff-analyzer.ts.bak +269 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts.bak +60 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js +1 -1
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js.bak +155 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.ts +1 -1
- package/plugins/specweave/lib/hooks/invoke-translator-skill.ts.bak +264 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts.bak +42 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.js.bak +110 -0
- package/plugins/specweave/lib/hooks/prepare-reflection-context.ts.bak +178 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.d.ts.bak +45 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.js.bak +92 -0
- package/plugins/specweave/lib/hooks/reflection-config-loader.ts.bak +156 -0
- package/plugins/specweave/lib/hooks/reflection-parser.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-parser.d.ts.bak +33 -0
- package/plugins/specweave/lib/hooks/reflection-parser.js.bak +301 -0
- package/plugins/specweave/lib/hooks/reflection-parser.ts.bak +484 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts.bak +56 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.js.bak +182 -0
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.ts.bak +306 -0
- package/plugins/specweave/lib/hooks/reflection-storage.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/reflection-storage.d.ts.bak +64 -0
- package/plugins/specweave/lib/hooks/reflection-storage.js.bak +231 -0
- package/plugins/specweave/lib/hooks/reflection-storage.ts.bak +369 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.d.ts.bak +43 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.js.bak +132 -0
- package/plugins/specweave/lib/hooks/run-self-reflection.ts.bak +258 -0
- package/plugins/specweave/lib/hooks/sync-cache.js.bak +294 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.d.js.bak +1 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.d.ts.bak +27 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.js +35 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js.bak +339 -0
- package/plugins/specweave/lib/hooks/sync-us-tasks.js +179 -3
- package/plugins/specweave/lib/hooks/sync-us-tasks.js.bak +476 -0
- package/plugins/specweave/lib/hooks/translate-file.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/translate-file.d.ts.bak +59 -0
- package/plugins/specweave/lib/hooks/translate-file.js +1 -1
- package/plugins/specweave/lib/hooks/translate-file.js.bak +289 -0
- package/plugins/specweave/lib/hooks/translate-file.ts +1 -1
- package/plugins/specweave/lib/hooks/translate-file.ts.bak +428 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.d.js.bak +0 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.d.ts.bak +13 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.js.bak +119 -0
- package/plugins/specweave/lib/hooks/translate-living-docs.ts.bak +224 -0
- package/plugins/specweave/lib/hooks/update-ac-status.js +1 -1
- package/plugins/specweave/lib/hooks/update-ac-status.js.bak +51 -0
- package/plugins/specweave/lib/hooks/update-ac-status.ts +1 -1
- package/plugins/specweave/lib/hooks/update-ac-status.ts.bak +103 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.d.js.bak +1 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.d.ts.bak +29 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.js.bak +296 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.ts.bak +489 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.d.ts +115 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +345 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.d.ts +106 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +220 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +60 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +192 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.d.ts +52 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +276 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +163 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +541 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +157 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.js +191 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.d.ts +95 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.js +301 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -0
- package/plugins/specweave/lib/vendor/utils/logger.d.ts +48 -0
- package/plugins/specweave/lib/vendor/utils/logger.js +53 -0
- package/plugins/specweave/lib/vendor/utils/logger.js.map +1 -0
- package/plugins/specweave/lib/vendor/utils/translation.d.ts +187 -0
- package/plugins/specweave/lib/vendor/utils/translation.js +414 -0
- package/plugins/specweave/lib/vendor/utils/translation.js.map +1 -0
- package/plugins/specweave-github/commands/specweave-github-update-user-story.md +1 -1
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +1 -1
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +531 -0
|
@@ -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;
|
|
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.
|
|
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":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
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;
|
|
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.
|
|
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
|
-
|
|
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":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"item-converter.js","sourceRoot":"","sources":["../../../src/importers/item-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|