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.
Files changed (130) hide show
  1. package/.claude-plugin/marketplace.json +7 -7
  2. package/CLAUDE.md +391 -1338
  3. package/dist/src/cli/commands/cleanup-cache.d.ts +14 -0
  4. package/dist/src/cli/commands/cleanup-cache.d.ts.map +1 -0
  5. package/dist/src/cli/commands/cleanup-cache.js +63 -0
  6. package/dist/src/cli/commands/cleanup-cache.js.map +1 -0
  7. package/dist/src/cli/commands/init.js +40 -0
  8. package/dist/src/cli/commands/init.js.map +1 -1
  9. package/dist/src/cli/commands/migrate-config.d.ts +22 -0
  10. package/dist/src/cli/commands/migrate-config.d.ts.map +1 -0
  11. package/dist/src/cli/commands/migrate-config.js +149 -0
  12. package/dist/src/cli/commands/migrate-config.js.map +1 -0
  13. package/dist/src/cli/helpers/async-project-loader.d.ts +148 -0
  14. package/dist/src/cli/helpers/async-project-loader.d.ts.map +1 -0
  15. package/dist/src/cli/helpers/async-project-loader.js +351 -0
  16. package/dist/src/cli/helpers/async-project-loader.js.map +1 -0
  17. package/dist/src/cli/helpers/cancelation-handler.d.ts +123 -0
  18. package/dist/src/cli/helpers/cancelation-handler.d.ts.map +1 -0
  19. package/dist/src/cli/helpers/cancelation-handler.js +187 -0
  20. package/dist/src/cli/helpers/cancelation-handler.js.map +1 -0
  21. package/dist/src/cli/helpers/import-strategy-prompter.d.ts +43 -0
  22. package/dist/src/cli/helpers/import-strategy-prompter.d.ts.map +1 -0
  23. package/dist/src/cli/helpers/import-strategy-prompter.js +136 -0
  24. package/dist/src/cli/helpers/import-strategy-prompter.js.map +1 -0
  25. package/dist/src/cli/helpers/issue-tracker/ado.d.ts +5 -2
  26. package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
  27. package/dist/src/cli/helpers/issue-tracker/ado.js +90 -40
  28. package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
  29. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  30. package/dist/src/cli/helpers/issue-tracker/index.js +112 -60
  31. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  32. package/dist/src/cli/helpers/issue-tracker/jira.d.ts +26 -2
  33. package/dist/src/cli/helpers/issue-tracker/jira.d.ts.map +1 -1
  34. package/dist/src/cli/helpers/issue-tracker/jira.js +197 -132
  35. package/dist/src/cli/helpers/issue-tracker/jira.js.map +1 -1
  36. package/dist/src/cli/helpers/progress-tracker.d.ts +121 -0
  37. package/dist/src/cli/helpers/progress-tracker.d.ts.map +1 -0
  38. package/dist/src/cli/helpers/progress-tracker.js +202 -0
  39. package/dist/src/cli/helpers/progress-tracker.js.map +1 -0
  40. package/dist/src/cli/helpers/project-count-fetcher.d.ts +69 -0
  41. package/dist/src/cli/helpers/project-count-fetcher.d.ts.map +1 -0
  42. package/dist/src/cli/helpers/project-count-fetcher.js +173 -0
  43. package/dist/src/cli/helpers/project-count-fetcher.js.map +1 -0
  44. package/dist/src/config/types.d.ts +14 -14
  45. package/dist/src/core/cache/cache-manager.d.ts +119 -0
  46. package/dist/src/core/cache/cache-manager.d.ts.map +1 -0
  47. package/dist/src/core/cache/cache-manager.js +304 -0
  48. package/dist/src/core/cache/cache-manager.js.map +1 -0
  49. package/dist/src/core/cache/rate-limit-checker.d.ts +92 -0
  50. package/dist/src/core/cache/rate-limit-checker.d.ts.map +1 -0
  51. package/dist/src/core/cache/rate-limit-checker.js +160 -0
  52. package/dist/src/core/cache/rate-limit-checker.js.map +1 -0
  53. package/dist/src/core/config/config-manager.d.ts +135 -0
  54. package/dist/src/core/config/config-manager.d.ts.map +1 -0
  55. package/dist/src/core/config/config-manager.js +341 -0
  56. package/dist/src/core/config/config-manager.js.map +1 -0
  57. package/dist/src/core/config/config-migrator.d.ts +102 -0
  58. package/dist/src/core/config/config-migrator.d.ts.map +1 -0
  59. package/dist/src/core/config/config-migrator.js +367 -0
  60. package/dist/src/core/config/config-migrator.js.map +1 -0
  61. package/dist/src/core/config/index.d.ts +10 -0
  62. package/dist/src/core/config/index.d.ts.map +1 -0
  63. package/dist/src/core/config/index.js +10 -0
  64. package/dist/src/core/config/index.js.map +1 -0
  65. package/dist/src/core/config/types.d.ts +216 -0
  66. package/dist/src/core/config/types.d.ts.map +1 -0
  67. package/dist/src/core/config/types.js +32 -0
  68. package/dist/src/core/config/types.js.map +1 -0
  69. package/dist/src/core/progress/cancelation-handler.d.ts +79 -0
  70. package/dist/src/core/progress/cancelation-handler.d.ts.map +1 -0
  71. package/dist/src/core/progress/cancelation-handler.js +111 -0
  72. package/dist/src/core/progress/cancelation-handler.js.map +1 -0
  73. package/dist/src/core/progress/import-state.d.ts +71 -0
  74. package/dist/src/core/progress/import-state.d.ts.map +1 -0
  75. package/dist/src/core/progress/import-state.js +96 -0
  76. package/dist/src/core/progress/import-state.js.map +1 -0
  77. package/dist/src/core/progress/progress-tracker.d.ts +139 -0
  78. package/dist/src/core/progress/progress-tracker.d.ts.map +1 -0
  79. package/dist/src/core/progress/progress-tracker.js +223 -0
  80. package/dist/src/core/progress/progress-tracker.js.map +1 -0
  81. package/dist/src/init/architecture/types.d.ts +6 -6
  82. package/dist/src/integrations/ado/ado-client.d.ts +25 -0
  83. package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
  84. package/dist/src/integrations/ado/ado-client.js +67 -0
  85. package/dist/src/integrations/ado/ado-client.js.map +1 -1
  86. package/dist/src/integrations/ado/ado-dependency-loader.d.ts +99 -0
  87. package/dist/src/integrations/ado/ado-dependency-loader.d.ts.map +1 -0
  88. package/dist/src/integrations/ado/ado-dependency-loader.js +207 -0
  89. package/dist/src/integrations/ado/ado-dependency-loader.js.map +1 -0
  90. package/dist/src/integrations/jira/jira-client.d.ts +32 -0
  91. package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
  92. package/dist/src/integrations/jira/jira-client.js +81 -0
  93. package/dist/src/integrations/jira/jira-client.js.map +1 -1
  94. package/dist/src/integrations/jira/jira-dependency-loader.d.ts +101 -0
  95. package/dist/src/integrations/jira/jira-dependency-loader.d.ts.map +1 -0
  96. package/dist/src/integrations/jira/jira-dependency-loader.js +200 -0
  97. package/dist/src/integrations/jira/jira-dependency-loader.js.map +1 -0
  98. package/dist/src/integrations/jira/jira-hierarchy-mapper.d.ts +104 -0
  99. package/dist/src/integrations/jira/jira-hierarchy-mapper.d.ts.map +1 -0
  100. package/dist/src/integrations/jira/jira-hierarchy-mapper.js +178 -0
  101. package/dist/src/integrations/jira/jira-hierarchy-mapper.js.map +1 -0
  102. package/package.json +1 -1
  103. package/plugins/specweave/.claude-plugin/plugin.json +20 -0
  104. package/plugins/specweave/agents/architect/AGENT.md +100 -602
  105. package/plugins/specweave/agents/pm/AGENT.md +96 -597
  106. package/plugins/specweave/agents/pm/AGENT.md.bak +1893 -0
  107. package/plugins/specweave/agents/pm/AGENT.md.bak2 +1754 -0
  108. package/plugins/specweave/commands/check-hooks.md +257 -0
  109. package/plugins/specweave/commands/migrate-config.md +104 -0
  110. package/plugins/specweave/hooks/post-edit-spec.sh +202 -31
  111. package/plugins/specweave/hooks/post-task-completion.sh +225 -228
  112. package/plugins/specweave/hooks/post-write-spec.sh +207 -31
  113. package/plugins/specweave/hooks/pre-edit-spec.sh +151 -0
  114. package/plugins/specweave/hooks/pre-task-completion.sh +5 -7
  115. package/plugins/specweave/hooks/pre-write-spec.sh +151 -0
  116. package/plugins/specweave/hooks/test-pretooluse-env.sh +72 -0
  117. package/plugins/specweave/skills/compliance-architecture/SKILL.md +374 -0
  118. package/plugins/specweave/skills/external-sync-wizard/SKILL.md +610 -0
  119. package/plugins/specweave/skills/pm-closure-validation/SKILL.md +541 -0
  120. package/plugins/specweave/skills/roadmap-planner/SKILL.md +473 -0
  121. package/plugins/specweave-ado/commands/refresh-cache.js +25 -0
  122. package/plugins/specweave-ado/commands/refresh-cache.ts +40 -0
  123. package/plugins/specweave-ado/hooks/post-task-completion.sh +1 -1
  124. package/plugins/specweave-github/hooks/post-task-completion.sh +1 -1
  125. package/plugins/specweave-jira/commands/refresh-cache.js +25 -0
  126. package/plugins/specweave-jira/commands/refresh-cache.ts +40 -0
  127. package/plugins/specweave-jira/hooks/post-task-completion.sh +1 -1
  128. package/plugins/specweave-kafka-streams/commands/topology.md +437 -0
  129. package/plugins/specweave-n8n/commands/workflow-template.md +262 -0
  130. 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":"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"}
@@ -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.8",
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": [