specweave 0.23.8 → 0.23.12
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-plugin/marketplace.json +7 -7
- package/CLAUDE.md +391 -1338
- package/dist/src/cli/commands/cleanup-cache.d.ts +14 -0
- package/dist/src/cli/commands/cleanup-cache.d.ts.map +1 -0
- package/dist/src/cli/commands/cleanup-cache.js +63 -0
- package/dist/src/cli/commands/cleanup-cache.js.map +1 -0
- package/dist/src/cli/commands/init.js +40 -0
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/migrate-config.d.ts +22 -0
- package/dist/src/cli/commands/migrate-config.d.ts.map +1 -0
- package/dist/src/cli/commands/migrate-config.js +149 -0
- package/dist/src/cli/commands/migrate-config.js.map +1 -0
- package/dist/src/cli/helpers/async-project-loader.d.ts +148 -0
- package/dist/src/cli/helpers/async-project-loader.d.ts.map +1 -0
- package/dist/src/cli/helpers/async-project-loader.js +351 -0
- package/dist/src/cli/helpers/async-project-loader.js.map +1 -0
- package/dist/src/cli/helpers/cancelation-handler.d.ts +123 -0
- package/dist/src/cli/helpers/cancelation-handler.d.ts.map +1 -0
- package/dist/src/cli/helpers/cancelation-handler.js +187 -0
- package/dist/src/cli/helpers/cancelation-handler.js.map +1 -0
- package/dist/src/cli/helpers/import-strategy-prompter.d.ts +43 -0
- package/dist/src/cli/helpers/import-strategy-prompter.d.ts.map +1 -0
- package/dist/src/cli/helpers/import-strategy-prompter.js +136 -0
- package/dist/src/cli/helpers/import-strategy-prompter.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts +5 -2
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +90 -40
- package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +112 -60
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.d.ts +26 -2
- package/dist/src/cli/helpers/issue-tracker/jira.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.js +197 -132
- package/dist/src/cli/helpers/issue-tracker/jira.js.map +1 -1
- package/dist/src/cli/helpers/progress-tracker.d.ts +121 -0
- package/dist/src/cli/helpers/progress-tracker.d.ts.map +1 -0
- package/dist/src/cli/helpers/progress-tracker.js +202 -0
- package/dist/src/cli/helpers/progress-tracker.js.map +1 -0
- package/dist/src/cli/helpers/project-count-fetcher.d.ts +69 -0
- package/dist/src/cli/helpers/project-count-fetcher.d.ts.map +1 -0
- package/dist/src/cli/helpers/project-count-fetcher.js +173 -0
- package/dist/src/cli/helpers/project-count-fetcher.js.map +1 -0
- package/dist/src/config/types.d.ts +14 -14
- package/dist/src/core/cache/cache-manager.d.ts +119 -0
- package/dist/src/core/cache/cache-manager.d.ts.map +1 -0
- package/dist/src/core/cache/cache-manager.js +304 -0
- package/dist/src/core/cache/cache-manager.js.map +1 -0
- package/dist/src/core/cache/rate-limit-checker.d.ts +92 -0
- package/dist/src/core/cache/rate-limit-checker.d.ts.map +1 -0
- package/dist/src/core/cache/rate-limit-checker.js +160 -0
- package/dist/src/core/cache/rate-limit-checker.js.map +1 -0
- package/dist/src/core/config/config-manager.d.ts +135 -0
- package/dist/src/core/config/config-manager.d.ts.map +1 -0
- package/dist/src/core/config/config-manager.js +341 -0
- package/dist/src/core/config/config-manager.js.map +1 -0
- package/dist/src/core/config/config-migrator.d.ts +102 -0
- package/dist/src/core/config/config-migrator.d.ts.map +1 -0
- package/dist/src/core/config/config-migrator.js +367 -0
- package/dist/src/core/config/config-migrator.js.map +1 -0
- package/dist/src/core/config/index.d.ts +10 -0
- package/dist/src/core/config/index.d.ts.map +1 -0
- package/dist/src/core/config/index.js +10 -0
- package/dist/src/core/config/index.js.map +1 -0
- package/dist/src/core/config/types.d.ts +216 -0
- package/dist/src/core/config/types.d.ts.map +1 -0
- package/dist/src/core/config/types.js +32 -0
- package/dist/src/core/config/types.js.map +1 -0
- package/dist/src/core/progress/cancelation-handler.d.ts +79 -0
- package/dist/src/core/progress/cancelation-handler.d.ts.map +1 -0
- package/dist/src/core/progress/cancelation-handler.js +111 -0
- package/dist/src/core/progress/cancelation-handler.js.map +1 -0
- package/dist/src/core/progress/import-state.d.ts +71 -0
- package/dist/src/core/progress/import-state.d.ts.map +1 -0
- package/dist/src/core/progress/import-state.js +96 -0
- package/dist/src/core/progress/import-state.js.map +1 -0
- package/dist/src/core/progress/progress-tracker.d.ts +139 -0
- package/dist/src/core/progress/progress-tracker.d.ts.map +1 -0
- package/dist/src/core/progress/progress-tracker.js +223 -0
- package/dist/src/core/progress/progress-tracker.js.map +1 -0
- package/dist/src/init/architecture/types.d.ts +6 -6
- package/dist/src/integrations/ado/ado-client.d.ts +25 -0
- package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-client.js +67 -0
- package/dist/src/integrations/ado/ado-client.js.map +1 -1
- package/dist/src/integrations/ado/ado-dependency-loader.d.ts +99 -0
- package/dist/src/integrations/ado/ado-dependency-loader.d.ts.map +1 -0
- package/dist/src/integrations/ado/ado-dependency-loader.js +207 -0
- package/dist/src/integrations/ado/ado-dependency-loader.js.map +1 -0
- package/dist/src/integrations/jira/jira-client.d.ts +32 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +81 -0
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-dependency-loader.d.ts +101 -0
- package/dist/src/integrations/jira/jira-dependency-loader.d.ts.map +1 -0
- package/dist/src/integrations/jira/jira-dependency-loader.js +200 -0
- package/dist/src/integrations/jira/jira-dependency-loader.js.map +1 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.d.ts +104 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.d.ts.map +1 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.js +178 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +20 -0
- package/plugins/specweave/agents/architect/AGENT.md +100 -602
- package/plugins/specweave/agents/pm/AGENT.md +96 -597
- package/plugins/specweave/agents/pm/AGENT.md.bak +1893 -0
- package/plugins/specweave/agents/pm/AGENT.md.bak2 +1754 -0
- package/plugins/specweave/commands/check-hooks.md +257 -0
- package/plugins/specweave/commands/migrate-config.md +104 -0
- package/plugins/specweave/hooks/post-edit-spec.sh +202 -31
- package/plugins/specweave/hooks/post-task-completion.sh +225 -228
- package/plugins/specweave/hooks/post-write-spec.sh +207 -31
- package/plugins/specweave/hooks/pre-edit-spec.sh +151 -0
- package/plugins/specweave/hooks/pre-task-completion.sh +5 -7
- package/plugins/specweave/hooks/pre-write-spec.sh +151 -0
- package/plugins/specweave/hooks/test-pretooluse-env.sh +72 -0
- package/plugins/specweave/skills/compliance-architecture/SKILL.md +374 -0
- package/plugins/specweave/skills/external-sync-wizard/SKILL.md +610 -0
- package/plugins/specweave/skills/pm-closure-validation/SKILL.md +541 -0
- package/plugins/specweave/skills/roadmap-planner/SKILL.md +473 -0
- package/plugins/specweave-ado/commands/refresh-cache.js +25 -0
- package/plugins/specweave-ado/commands/refresh-cache.ts +40 -0
- package/plugins/specweave-ado/hooks/post-task-completion.sh +1 -1
- package/plugins/specweave-github/hooks/post-task-completion.sh +1 -1
- package/plugins/specweave-jira/commands/refresh-cache.js +25 -0
- package/plugins/specweave-jira/commands/refresh-cache.ts +40 -0
- package/plugins/specweave-jira/hooks/post-task-completion.sh +1 -1
- package/plugins/specweave-kafka-streams/commands/topology.md +437 -0
- package/plugins/specweave-n8n/commands/workflow-template.md +262 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +228 -6333
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JiraDependencyLoader - Three-Tier Dependency Loading for JIRA
|
|
3
|
+
*
|
|
4
|
+
* Architecture (ADR-0056):
|
|
5
|
+
* - Tier 1 (Init): Metadata only (< 5 seconds, 1 API call)
|
|
6
|
+
* - Tier 2 (On-Demand): Lazy loading per project (2-5 seconds, 4-7 API calls)
|
|
7
|
+
* - Tier 3 (Bulk): Optional pre-load command (1-2 minutes for 50 projects)
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - 24-hour TTL caching via CacheManager
|
|
11
|
+
* - Rate limit detection and stale cache fallback
|
|
12
|
+
* - Per-project dependency caching
|
|
13
|
+
* - Automatic cache invalidation on 404 errors
|
|
14
|
+
*
|
|
15
|
+
* @module integrations/jira/jira-dependency-loader
|
|
16
|
+
*/
|
|
17
|
+
import { RateLimitChecker } from '../../core/cache/rate-limit-checker.js';
|
|
18
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
19
|
+
/**
|
|
20
|
+
* JiraDependencyLoader - Three-tier dependency loading with smart caching
|
|
21
|
+
*/
|
|
22
|
+
export class JiraDependencyLoader {
|
|
23
|
+
constructor(options) {
|
|
24
|
+
this.jiraClient = options.jiraClient;
|
|
25
|
+
this.cacheManager = options.cacheManager;
|
|
26
|
+
this.rateLimitChecker = options.rateLimitChecker ?? new RateLimitChecker();
|
|
27
|
+
this.logger = options.logger ?? consoleLogger;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Tier 1: Load project metadata only (init)
|
|
31
|
+
*
|
|
32
|
+
* Performance: < 5 seconds for 50 projects (1 API call)
|
|
33
|
+
* Cache: 24-hour TTL in `jira-projects.json`
|
|
34
|
+
*
|
|
35
|
+
* @param maxProjects Maximum projects to load (default: 50)
|
|
36
|
+
* @returns Array of project metadata
|
|
37
|
+
*/
|
|
38
|
+
async loadProjectMetadata(maxProjects = 50) {
|
|
39
|
+
const cacheKey = 'jira-projects';
|
|
40
|
+
// Check cache first
|
|
41
|
+
const cached = await this.cacheManager.get(cacheKey);
|
|
42
|
+
if (cached) {
|
|
43
|
+
this.logger.log(`Cache hit: ${cacheKey} (${cached.projects.length} projects)`);
|
|
44
|
+
return cached.projects;
|
|
45
|
+
}
|
|
46
|
+
// Cache miss - fetch from API
|
|
47
|
+
this.logger.log(`Cache miss: ${cacheKey}, fetching from JIRA API...`);
|
|
48
|
+
try {
|
|
49
|
+
// Use JIRA search API for batch loading
|
|
50
|
+
const response = await this.jiraClient.searchProjects({
|
|
51
|
+
maxResults: maxProjects,
|
|
52
|
+
orderBy: 'name',
|
|
53
|
+
});
|
|
54
|
+
// Extract rate limit headers
|
|
55
|
+
const rateLimitHeaders = this.rateLimitChecker.extractHeaders(response);
|
|
56
|
+
const rateLimitCheck = this.rateLimitChecker.shouldProceed(rateLimitHeaders);
|
|
57
|
+
if (!rateLimitCheck.canProceed) {
|
|
58
|
+
this.logger.warn(`Rate limit warning: ${rateLimitCheck.reason}. Consider using cached data.`);
|
|
59
|
+
}
|
|
60
|
+
// Parse projects
|
|
61
|
+
const projects = response.values.map((project) => ({
|
|
62
|
+
key: project.key,
|
|
63
|
+
name: project.name,
|
|
64
|
+
type: project.projectTypeKey || 'software',
|
|
65
|
+
lead: project.lead
|
|
66
|
+
? {
|
|
67
|
+
displayName: project.lead.displayName,
|
|
68
|
+
}
|
|
69
|
+
: undefined,
|
|
70
|
+
}));
|
|
71
|
+
// Cache result
|
|
72
|
+
await this.cacheManager.set(cacheKey, { projects });
|
|
73
|
+
this.logger.log(`Cached ${projects.length} projects with 24-hour TTL`);
|
|
74
|
+
return projects;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
// Check for rate limit error (429)
|
|
78
|
+
if (this.rateLimitChecker.isRateLimitError(error)) {
|
|
79
|
+
await this.rateLimitChecker.handleRateLimitError(error);
|
|
80
|
+
// Try to use stale cache
|
|
81
|
+
const staleCache = await this.cacheManager.getStale(cacheKey);
|
|
82
|
+
if (staleCache) {
|
|
83
|
+
return staleCache.projects;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Re-throw if not rate limit or no stale cache available
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Tier 2: Load dependencies for specific project (on-demand)
|
|
92
|
+
*
|
|
93
|
+
* Performance: 2-5 seconds per project (4-7 API calls, cached)
|
|
94
|
+
* Cache: 24-hour TTL in `jira-{PROJECT}-deps.json`
|
|
95
|
+
*
|
|
96
|
+
* @param projectKey Project key (e.g., "BACKEND")
|
|
97
|
+
* @returns Project dependencies
|
|
98
|
+
*/
|
|
99
|
+
async loadProjectDependencies(projectKey) {
|
|
100
|
+
const cacheKey = `jira-${projectKey}-deps`;
|
|
101
|
+
// Check cache first
|
|
102
|
+
const cached = await this.cacheManager.get(cacheKey);
|
|
103
|
+
if (cached) {
|
|
104
|
+
this.logger.log(`Cache hit: ${cacheKey}`);
|
|
105
|
+
return cached;
|
|
106
|
+
}
|
|
107
|
+
// Cache miss - fetch from API
|
|
108
|
+
this.logger.log(`Cache miss: ${cacheKey}, fetching from JIRA API...`);
|
|
109
|
+
try {
|
|
110
|
+
// Fetch boards, components, versions in parallel
|
|
111
|
+
const [boardsResponse, componentsResponse, versionsResponse] = await Promise.all([
|
|
112
|
+
this.jiraClient.getBoards(projectKey),
|
|
113
|
+
this.jiraClient.getComponents(projectKey),
|
|
114
|
+
this.jiraClient.getVersions(projectKey),
|
|
115
|
+
]);
|
|
116
|
+
// Build dependencies object
|
|
117
|
+
const dependencies = {
|
|
118
|
+
projectKey,
|
|
119
|
+
boards: boardsResponse.values?.map((board) => ({
|
|
120
|
+
id: board.id,
|
|
121
|
+
name: board.name,
|
|
122
|
+
type: board.type,
|
|
123
|
+
})) || [],
|
|
124
|
+
components: componentsResponse.map((component) => ({
|
|
125
|
+
id: component.id,
|
|
126
|
+
name: component.name,
|
|
127
|
+
})),
|
|
128
|
+
versions: versionsResponse.map((version) => ({
|
|
129
|
+
id: version.id,
|
|
130
|
+
name: version.name,
|
|
131
|
+
released: version.released,
|
|
132
|
+
})),
|
|
133
|
+
lastUpdated: new Date().toISOString(),
|
|
134
|
+
};
|
|
135
|
+
// Cache result
|
|
136
|
+
await this.cacheManager.set(cacheKey, dependencies);
|
|
137
|
+
this.logger.log(`Cached dependencies for ${projectKey}: ${dependencies.boards.length} boards, ${dependencies.components.length} components, ${dependencies.versions.length} versions`);
|
|
138
|
+
return dependencies;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
// Handle 404 (project not found) - invalidate cache
|
|
142
|
+
if (error.response?.status === 404) {
|
|
143
|
+
this.logger.warn(`Project ${projectKey} not found (404), invalidating cache...`);
|
|
144
|
+
await this.cacheManager.delete(cacheKey);
|
|
145
|
+
throw new Error(`Project ${projectKey} not found`);
|
|
146
|
+
}
|
|
147
|
+
// Handle rate limit errors
|
|
148
|
+
if (this.rateLimitChecker.isRateLimitError(error)) {
|
|
149
|
+
await this.rateLimitChecker.handleRateLimitError(error);
|
|
150
|
+
// Try to use stale cache
|
|
151
|
+
const staleCache = await this.cacheManager.getStale(cacheKey);
|
|
152
|
+
if (staleCache) {
|
|
153
|
+
return staleCache;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Re-throw if not handled
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Tier 3: Bulk pre-load all dependencies (optional command)
|
|
162
|
+
*
|
|
163
|
+
* Performance: 1-2 minutes for 50 projects (200-350 API calls, batched)
|
|
164
|
+
* Progress: Real-time progress tracking, cancelation support
|
|
165
|
+
*
|
|
166
|
+
* @param projectKeys Array of project keys to preload
|
|
167
|
+
* @returns void (results cached)
|
|
168
|
+
*/
|
|
169
|
+
async preloadAllDependencies(projectKeys, options = {}) {
|
|
170
|
+
const { onProgress, signal } = options;
|
|
171
|
+
const total = projectKeys.length;
|
|
172
|
+
this.logger.log(`Preloading dependencies for ${total} projects...`);
|
|
173
|
+
for (let i = 0; i < total; i++) {
|
|
174
|
+
// Check for cancelation
|
|
175
|
+
if (signal?.aborted) {
|
|
176
|
+
this.logger.warn('Preload canceled by user');
|
|
177
|
+
throw new Error('Preload canceled');
|
|
178
|
+
}
|
|
179
|
+
const projectKey = projectKeys[i];
|
|
180
|
+
this.logger.log(`[${i + 1}/${total}] Preloading ${projectKey}...`);
|
|
181
|
+
try {
|
|
182
|
+
await this.loadProjectDependencies(projectKey);
|
|
183
|
+
// Report progress
|
|
184
|
+
if (onProgress) {
|
|
185
|
+
onProgress(i + 1, total);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
this.logger.error(`Failed to preload ${projectKey}: ${error.message}`);
|
|
190
|
+
// Continue with next project (don't fail entire batch)
|
|
191
|
+
}
|
|
192
|
+
// Add delay to avoid rate limiting (200ms between requests)
|
|
193
|
+
if (i < total - 1) {
|
|
194
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
this.logger.log('Preload complete!');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=jira-dependency-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-dependency-loader.js","sourceRoot":"","sources":["../../../../src/integrations/jira/jira-dependency-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAE1E,OAAO,EAAU,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAoC9D;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAM/B,YAAY,OAKX;QACC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,gBAAgB,EAAE,CAAC;QAC3E,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAChD,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,mBAAmB,CAAC,cAAsB,EAAE;QAChD,MAAM,QAAQ,GAAG,eAAe,CAAC;QAEjC,oBAAoB;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAkC,QAAQ,CAAC,CAAC;QACtF,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC;YAC/E,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,QAAQ,6BAA6B,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,wCAAwC;YACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;gBACpD,UAAU,EAAE,WAAW;gBACvB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,6BAA6B;YAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACxE,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;YAE7E,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,uBAAuB,cAAc,CAAC,MAAM,+BAA+B,CAC5E,CAAC;YACJ,CAAC;YAED,iBAAiB;YACjB,MAAM,QAAQ,GAAsB,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC;gBACzE,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,cAAc,IAAI,UAAU;gBAC1C,IAAI,EAAE,OAAO,CAAC,IAAI;oBAChB,CAAC,CAAC;wBACE,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW;qBACtC;oBACH,CAAC,CAAC,SAAS;aACd,CAAC,CAAC,CAAC;YAEJ,eAAe;YACf,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,MAAM,4BAA4B,CAAC,CAAC;YAEvE,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,mCAAmC;YACnC,IAAI,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAExD,yBAAyB;gBACzB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CACjD,QAAQ,CACT,CAAC;gBAEF,IAAI,UAAU,EAAE,CAAC;oBACf,OAAO,UAAU,CAAC,QAAQ,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,yDAAyD;YACzD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,uBAAuB,CAAC,UAAkB;QAC9C,MAAM,QAAQ,GAAG,QAAQ,UAAU,OAAO,CAAC;QAE3C,oBAAoB;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAsB,QAAQ,CAAC,CAAC;QAC1E,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC;YAC1C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,QAAQ,6BAA6B,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,iDAAiD;YACjD,MAAM,CAAC,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC/E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC;gBACrC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC;gBACzC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC;aACxC,CAAC,CAAC;YAEH,4BAA4B;YAC5B,MAAM,YAAY,GAAwB;gBACxC,UAAU;gBACV,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;oBAClD,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC,IAAI,EAAE;gBACT,UAAU,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,SAAc,EAAE,EAAE,CAAC,CAAC;oBACtD,EAAE,EAAE,SAAS,CAAC,EAAE;oBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;iBACrB,CAAC,CAAC;gBACH,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC;oBAChD,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,CAAC,CAAC;gBACH,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,eAAe;YACf,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,2BAA2B,UAAU,KAAK,YAAY,CAAC,MAAM,CAAC,MAAM,YAAY,YAAY,CAAC,UAAU,CAAC,MAAM,gBAAgB,YAAY,CAAC,QAAQ,CAAC,MAAM,WAAW,CACtK,CAAC;YAEF,OAAO,YAAY,CAAC;QACtB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,oDAAoD;YACpD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,yCAAyC,CAAC,CAAC;gBACjF,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,YAAY,CAAC,CAAC;YACrD,CAAC;YAED,2BAA2B;YAC3B,IAAI,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAExD,yBAAyB;gBACzB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAsB,QAAQ,CAAC,CAAC;gBAEnF,IAAI,UAAU,EAAE,CAAC;oBACf,OAAO,UAAU,CAAC;gBACpB,CAAC;YACH,CAAC;YAED,0BAA0B;YAC1B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,sBAAsB,CAC1B,WAAqB,EACrB,UAGI,EAAE;QAEN,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACvC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;QAEjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,KAAK,cAAc,CAAC,CAAC;QAEpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,wBAAwB;YACxB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,gBAAgB,UAAU,KAAK,CAAC,CAAC;YAEnE,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;gBAE/C,kBAAkB;gBAClB,IAAI,UAAU,EAAE,CAAC;oBACf,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvE,uDAAuD;YACzD,CAAC;YAED,4DAA4D;YAC5D,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jira Hierarchy Mapper
|
|
3
|
+
*
|
|
4
|
+
* Maps SpecWeave universal hierarchy to Jira issue types
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Jira Agile: Initiative → Epic → Story → Sub-task
|
|
8
|
+
* - Jira CMMI: Epic → Feature → Requirement → Task
|
|
9
|
+
* - Jira SAFe: Strategic Theme → Capability → User Story → Task
|
|
10
|
+
*
|
|
11
|
+
* @module integrations/jira/jira-hierarchy-mapper
|
|
12
|
+
*/
|
|
13
|
+
import { JiraClient } from './jira-client.js';
|
|
14
|
+
/**
|
|
15
|
+
* Jira hierarchy mapping for different project types
|
|
16
|
+
*/
|
|
17
|
+
export interface JiraHierarchyMapping {
|
|
18
|
+
epic: string;
|
|
19
|
+
feature: string;
|
|
20
|
+
userStory: string;
|
|
21
|
+
task: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* SpecWeave Epic metadata
|
|
25
|
+
*/
|
|
26
|
+
export interface SpecWeaveEpic {
|
|
27
|
+
id: string;
|
|
28
|
+
title: string;
|
|
29
|
+
description: string;
|
|
30
|
+
status: string;
|
|
31
|
+
priority: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* SpecWeave Feature metadata
|
|
35
|
+
*/
|
|
36
|
+
export interface SpecWeaveFeature {
|
|
37
|
+
id: string;
|
|
38
|
+
title: string;
|
|
39
|
+
description: string;
|
|
40
|
+
status: string;
|
|
41
|
+
priority: string;
|
|
42
|
+
epic?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* SpecWeave User Story metadata
|
|
46
|
+
*/
|
|
47
|
+
export interface SpecWeaveUserStory {
|
|
48
|
+
id: string;
|
|
49
|
+
title: string;
|
|
50
|
+
description: string;
|
|
51
|
+
acceptanceCriteria: string[];
|
|
52
|
+
status: string;
|
|
53
|
+
priority: string;
|
|
54
|
+
feature?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Maps SpecWeave universal hierarchy to Jira issue types
|
|
58
|
+
*/
|
|
59
|
+
export declare class JiraHierarchyMapper {
|
|
60
|
+
private jiraClient;
|
|
61
|
+
constructor(jiraClient: JiraClient);
|
|
62
|
+
/**
|
|
63
|
+
* Detect Jira project type based on available issue types
|
|
64
|
+
*
|
|
65
|
+
* @param projectKey - Jira project key
|
|
66
|
+
* @returns Detected hierarchy mapping
|
|
67
|
+
*/
|
|
68
|
+
detectProjectType(projectKey: string): Promise<JiraHierarchyMapping>;
|
|
69
|
+
/**
|
|
70
|
+
* Map SpecWeave work item to Jira issue type
|
|
71
|
+
*
|
|
72
|
+
* @param level - SpecWeave hierarchy level
|
|
73
|
+
* @param mapping - Jira hierarchy mapping
|
|
74
|
+
* @returns Jira issue type name
|
|
75
|
+
*/
|
|
76
|
+
mapToJiraIssueType(level: 'epic' | 'feature' | 'userStory' | 'task', mapping: JiraHierarchyMapping): string;
|
|
77
|
+
/**
|
|
78
|
+
* Create SpecWeave Epic in Jira
|
|
79
|
+
*
|
|
80
|
+
* @param epic - SpecWeave epic metadata
|
|
81
|
+
* @param projectKey - Jira project key
|
|
82
|
+
* @returns Created Jira issue key
|
|
83
|
+
*/
|
|
84
|
+
syncEpicToJira(epic: SpecWeaveEpic, projectKey: string): Promise<string>;
|
|
85
|
+
/**
|
|
86
|
+
* Create SpecWeave Feature in Jira
|
|
87
|
+
*
|
|
88
|
+
* @param feature - SpecWeave feature metadata
|
|
89
|
+
* @param projectKey - Jira project key
|
|
90
|
+
* @param epicKey - Parent epic key (optional)
|
|
91
|
+
* @returns Created Jira issue key
|
|
92
|
+
*/
|
|
93
|
+
syncFeatureToJira(feature: SpecWeaveFeature, projectKey: string, epicKey?: string): Promise<string>;
|
|
94
|
+
/**
|
|
95
|
+
* Create SpecWeave User Story in Jira
|
|
96
|
+
*
|
|
97
|
+
* @param userStory - SpecWeave user story metadata
|
|
98
|
+
* @param projectKey - Jira project key
|
|
99
|
+
* @param featureKey - Parent feature key (optional)
|
|
100
|
+
* @returns Created Jira issue key
|
|
101
|
+
*/
|
|
102
|
+
syncUserStoryToJira(userStory: SpecWeaveUserStory, projectKey: string, featureKey?: string): Promise<string>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=jira-hierarchy-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-hierarchy-mapper.d.ts","sourceRoot":"","sources":["../../../../src/integrations/jira/jira-hierarchy-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAAa;gBAEnB,UAAU,EAAE,UAAU;IAIlC;;;;;OAKG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiE1E;;;;;;OAMG;IACH,kBAAkB,CAChB,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,EAChD,OAAO,EAAE,oBAAoB,GAC5B,MAAM;IAIT;;;;;;OAMG;IACG,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB9E;;;;;;;OAOG;IACG,iBAAiB,CACrB,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAoBlB;;;;;;;OAOG;IACG,mBAAmB,CACvB,SAAS,EAAE,kBAAkB,EAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;CA4BnB"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jira Hierarchy Mapper
|
|
3
|
+
*
|
|
4
|
+
* Maps SpecWeave universal hierarchy to Jira issue types
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Jira Agile: Initiative → Epic → Story → Sub-task
|
|
8
|
+
* - Jira CMMI: Epic → Feature → Requirement → Task
|
|
9
|
+
* - Jira SAFe: Strategic Theme → Capability → User Story → Task
|
|
10
|
+
*
|
|
11
|
+
* @module integrations/jira/jira-hierarchy-mapper
|
|
12
|
+
*/
|
|
13
|
+
import chalk from 'chalk';
|
|
14
|
+
/**
|
|
15
|
+
* Maps SpecWeave universal hierarchy to Jira issue types
|
|
16
|
+
*/
|
|
17
|
+
export class JiraHierarchyMapper {
|
|
18
|
+
constructor(jiraClient) {
|
|
19
|
+
this.jiraClient = jiraClient;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Detect Jira project type based on available issue types
|
|
23
|
+
*
|
|
24
|
+
* @param projectKey - Jira project key
|
|
25
|
+
* @returns Detected hierarchy mapping
|
|
26
|
+
*/
|
|
27
|
+
async detectProjectType(projectKey) {
|
|
28
|
+
try {
|
|
29
|
+
// Fetch issue types for project
|
|
30
|
+
// Note: This requires implementing getIssueTypes in JiraClient
|
|
31
|
+
// For now, we'll use a default Agile mapping
|
|
32
|
+
// TODO: Implement getIssueTypes in JiraClient
|
|
33
|
+
// Default: Agile (has "Story" and "Sub-task")
|
|
34
|
+
console.log(chalk.cyan(`📊 Using Jira Agile hierarchy for project: ${projectKey}`));
|
|
35
|
+
return {
|
|
36
|
+
epic: 'Initiative',
|
|
37
|
+
feature: 'Epic',
|
|
38
|
+
userStory: 'Story',
|
|
39
|
+
task: 'Sub-task'
|
|
40
|
+
};
|
|
41
|
+
/* Future implementation:
|
|
42
|
+
const issueTypes = await this.jiraClient.getIssueTypes(projectKey);
|
|
43
|
+
const typeNames = issueTypes.map(t => t.name.toLowerCase());
|
|
44
|
+
|
|
45
|
+
// Detect SAFe (has "Capability" or "Strategic Theme")
|
|
46
|
+
if (typeNames.includes('capability') || typeNames.includes('strategic theme')) {
|
|
47
|
+
console.log(chalk.cyan(`📊 Detected Jira SAFe project: ${projectKey}`));
|
|
48
|
+
return {
|
|
49
|
+
epic: 'Strategic Theme',
|
|
50
|
+
feature: 'Capability',
|
|
51
|
+
userStory: 'User Story',
|
|
52
|
+
task: 'Task'
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Detect CMMI (has "Requirement")
|
|
57
|
+
if (typeNames.includes('requirement')) {
|
|
58
|
+
console.log(chalk.cyan(`📊 Detected Jira CMMI project: ${projectKey}`));
|
|
59
|
+
return {
|
|
60
|
+
epic: 'Epic',
|
|
61
|
+
feature: 'Feature',
|
|
62
|
+
userStory: 'Requirement',
|
|
63
|
+
task: 'Task'
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Default: Agile
|
|
68
|
+
console.log(chalk.cyan(`📊 Detected Jira Agile project: ${projectKey}`));
|
|
69
|
+
return {
|
|
70
|
+
epic: 'Initiative',
|
|
71
|
+
feature: 'Epic',
|
|
72
|
+
userStory: 'Story',
|
|
73
|
+
task: 'Sub-task'
|
|
74
|
+
};
|
|
75
|
+
*/
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error(chalk.red(`⚠️ Failed to detect Jira project type: ${error.message}`));
|
|
79
|
+
console.log(chalk.gray(' Using default Agile hierarchy\n'));
|
|
80
|
+
// Fallback to Agile
|
|
81
|
+
return {
|
|
82
|
+
epic: 'Initiative',
|
|
83
|
+
feature: 'Epic',
|
|
84
|
+
userStory: 'Story',
|
|
85
|
+
task: 'Sub-task'
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Map SpecWeave work item to Jira issue type
|
|
91
|
+
*
|
|
92
|
+
* @param level - SpecWeave hierarchy level
|
|
93
|
+
* @param mapping - Jira hierarchy mapping
|
|
94
|
+
* @returns Jira issue type name
|
|
95
|
+
*/
|
|
96
|
+
mapToJiraIssueType(level, mapping) {
|
|
97
|
+
return mapping[level];
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create SpecWeave Epic in Jira
|
|
101
|
+
*
|
|
102
|
+
* @param epic - SpecWeave epic metadata
|
|
103
|
+
* @param projectKey - Jira project key
|
|
104
|
+
* @returns Created Jira issue key
|
|
105
|
+
*/
|
|
106
|
+
async syncEpicToJira(epic, projectKey) {
|
|
107
|
+
const mapping = await this.detectProjectType(projectKey);
|
|
108
|
+
const jiraIssueType = this.mapToJiraIssueType('epic', mapping);
|
|
109
|
+
console.log(chalk.cyan(`📝 Creating ${jiraIssueType} in Jira: ${epic.title}`));
|
|
110
|
+
// Create Initiative/Theme/Epic in Jira
|
|
111
|
+
const issue = await this.jiraClient.createIssue({
|
|
112
|
+
issueType: jiraIssueType,
|
|
113
|
+
summary: epic.title,
|
|
114
|
+
description: epic.description,
|
|
115
|
+
priority: epic.priority,
|
|
116
|
+
labels: [`specweave-epic-${epic.id}`]
|
|
117
|
+
}, projectKey);
|
|
118
|
+
console.log(chalk.green(`✅ Created ${jiraIssueType}: ${issue.key}\n`));
|
|
119
|
+
return issue.key;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create SpecWeave Feature in Jira
|
|
123
|
+
*
|
|
124
|
+
* @param feature - SpecWeave feature metadata
|
|
125
|
+
* @param projectKey - Jira project key
|
|
126
|
+
* @param epicKey - Parent epic key (optional)
|
|
127
|
+
* @returns Created Jira issue key
|
|
128
|
+
*/
|
|
129
|
+
async syncFeatureToJira(feature, projectKey, epicKey) {
|
|
130
|
+
const mapping = await this.detectProjectType(projectKey);
|
|
131
|
+
const jiraIssueType = this.mapToJiraIssueType('feature', mapping);
|
|
132
|
+
console.log(chalk.cyan(`📝 Creating ${jiraIssueType} in Jira: ${feature.title}`));
|
|
133
|
+
// Create Epic/Capability/Feature in Jira
|
|
134
|
+
const issue = await this.jiraClient.createIssue({
|
|
135
|
+
issueType: jiraIssueType,
|
|
136
|
+
summary: feature.title,
|
|
137
|
+
description: feature.description,
|
|
138
|
+
priority: feature.priority,
|
|
139
|
+
labels: [`specweave-feature-${feature.id}`],
|
|
140
|
+
epicKey // Link to parent epic (if exists)
|
|
141
|
+
}, projectKey);
|
|
142
|
+
console.log(chalk.green(`✅ Created ${jiraIssueType}: ${issue.key}\n`));
|
|
143
|
+
return issue.key;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Create SpecWeave User Story in Jira
|
|
147
|
+
*
|
|
148
|
+
* @param userStory - SpecWeave user story metadata
|
|
149
|
+
* @param projectKey - Jira project key
|
|
150
|
+
* @param featureKey - Parent feature key (optional)
|
|
151
|
+
* @returns Created Jira issue key
|
|
152
|
+
*/
|
|
153
|
+
async syncUserStoryToJira(userStory, projectKey, featureKey) {
|
|
154
|
+
const mapping = await this.detectProjectType(projectKey);
|
|
155
|
+
const jiraIssueType = this.mapToJiraIssueType('userStory', mapping);
|
|
156
|
+
console.log(chalk.cyan(`📝 Creating ${jiraIssueType} in Jira: ${userStory.title}`));
|
|
157
|
+
// Build description with acceptance criteria
|
|
158
|
+
let description = userStory.description;
|
|
159
|
+
if (userStory.acceptanceCriteria && userStory.acceptanceCriteria.length > 0) {
|
|
160
|
+
description += '\n\n**Acceptance Criteria:**\n';
|
|
161
|
+
userStory.acceptanceCriteria.forEach((ac, index) => {
|
|
162
|
+
description += `\n${index + 1}. ${ac}`;
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
// Create Story/User Story/Requirement in Jira
|
|
166
|
+
const issue = await this.jiraClient.createIssue({
|
|
167
|
+
issueType: jiraIssueType,
|
|
168
|
+
summary: userStory.title,
|
|
169
|
+
description,
|
|
170
|
+
priority: userStory.priority,
|
|
171
|
+
labels: [`specweave-us-${userStory.id}`],
|
|
172
|
+
epicKey: featureKey // Link to parent feature
|
|
173
|
+
}, projectKey);
|
|
174
|
+
console.log(chalk.green(`✅ Created ${jiraIssueType}: ${issue.key}\n`));
|
|
175
|
+
return issue.key;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=jira-hierarchy-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-hierarchy-mapper.js","sourceRoot":"","sources":["../../../../src/integrations/jira/jira-hierarchy-mapper.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.12",
|
|
4
4
|
"description": "Spec-driven development framework for Claude Code. AI-native workflow with living documentation, intelligent agents, and multilingual support (9 languages). Enterprise-grade traceability with permanent specs and temporary increments.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,6 +30,26 @@
|
|
|
30
30
|
"timeout": 60
|
|
31
31
|
}
|
|
32
32
|
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"matcher": "Edit",
|
|
36
|
+
"hooks": [
|
|
37
|
+
{
|
|
38
|
+
"type": "command",
|
|
39
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/pre-edit-spec.sh",
|
|
40
|
+
"timeout": 2
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"matcher": "Write",
|
|
46
|
+
"hooks": [
|
|
47
|
+
{
|
|
48
|
+
"type": "command",
|
|
49
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/pre-write-spec.sh",
|
|
50
|
+
"timeout": 2
|
|
51
|
+
}
|
|
52
|
+
]
|
|
33
53
|
}
|
|
34
54
|
],
|
|
35
55
|
"PostToolUse": [
|