specweave 0.1.8 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/CLAUDE.md +600 -0
  2. package/README.md +263 -88
  3. package/bin/install-all.sh +1 -1
  4. package/bin/install-commands.sh +3 -3
  5. package/bin/specweave.js +39 -9
  6. package/dist/adapters/adapter-base.d.ts +1 -1
  7. package/dist/adapters/adapter-base.d.ts.map +1 -1
  8. package/dist/adapters/adapter-base.js +6 -41
  9. package/dist/adapters/adapter-base.js.map +1 -1
  10. package/dist/adapters/adapter-interface.js +1 -2
  11. package/dist/adapters/adapter-interface.js.map +1 -1
  12. package/dist/adapters/adapter-loader.d.ts +86 -0
  13. package/dist/adapters/adapter-loader.d.ts.map +1 -0
  14. package/dist/adapters/adapter-loader.js +216 -0
  15. package/dist/adapters/adapter-loader.js.map +1 -0
  16. package/dist/adapters/agents-md-generator.d.ts +48 -0
  17. package/dist/adapters/agents-md-generator.d.ts.map +1 -0
  18. package/dist/adapters/agents-md-generator.js +132 -0
  19. package/dist/adapters/agents-md-generator.js.map +1 -0
  20. package/dist/adapters/claude/adapter.d.ts +2 -2
  21. package/dist/adapters/claude/adapter.d.ts.map +1 -1
  22. package/dist/adapters/claude/adapter.js +5 -42
  23. package/dist/adapters/claude/adapter.js.map +1 -1
  24. package/dist/adapters/claude-md-generator.d.ts +78 -0
  25. package/dist/adapters/claude-md-generator.d.ts.map +1 -0
  26. package/dist/adapters/claude-md-generator.js +246 -0
  27. package/dist/adapters/claude-md-generator.js.map +1 -0
  28. package/dist/adapters/codex/adapter.d.ts +50 -0
  29. package/dist/adapters/codex/adapter.d.ts.map +1 -0
  30. package/dist/adapters/codex/adapter.js +316 -0
  31. package/dist/adapters/codex/adapter.js.map +1 -0
  32. package/dist/adapters/copilot/adapter.d.ts +10 -9
  33. package/dist/adapters/copilot/adapter.d.ts.map +1 -1
  34. package/dist/adapters/copilot/adapter.js +35 -100
  35. package/dist/adapters/copilot/adapter.js.map +1 -1
  36. package/dist/adapters/cursor/adapter.d.ts +8 -6
  37. package/dist/adapters/cursor/adapter.d.ts.map +1 -1
  38. package/dist/adapters/cursor/adapter.js +47 -130
  39. package/dist/adapters/cursor/adapter.js.map +1 -1
  40. package/dist/adapters/doc-generator.d.ts +69 -0
  41. package/dist/adapters/doc-generator.d.ts.map +1 -0
  42. package/dist/adapters/doc-generator.js +247 -0
  43. package/dist/adapters/doc-generator.js.map +1 -0
  44. package/dist/adapters/gemini/adapter.d.ts +50 -0
  45. package/dist/adapters/gemini/adapter.d.ts.map +1 -0
  46. package/dist/adapters/gemini/adapter.js +281 -0
  47. package/dist/adapters/gemini/adapter.js.map +1 -0
  48. package/dist/adapters/generic/adapter.d.ts +7 -4
  49. package/dist/adapters/generic/adapter.d.ts.map +1 -1
  50. package/dist/adapters/generic/adapter.js +60 -59
  51. package/dist/adapters/generic/adapter.js.map +1 -1
  52. package/dist/cli/commands/init.d.ts +3 -1
  53. package/dist/cli/commands/init.d.ts.map +1 -1
  54. package/dist/cli/commands/init.js +272 -170
  55. package/dist/cli/commands/init.js.map +1 -1
  56. package/dist/cli/commands/install.d.ts.map +1 -1
  57. package/dist/cli/commands/install.js +22 -58
  58. package/dist/cli/commands/install.js.map +1 -1
  59. package/dist/cli/commands/list.d.ts.map +1 -1
  60. package/dist/cli/commands/list.js +27 -64
  61. package/dist/cli/commands/list.js.map +1 -1
  62. package/dist/core/credentials-manager.d.ts +90 -0
  63. package/dist/core/credentials-manager.d.ts.map +1 -0
  64. package/dist/core/credentials-manager.js +271 -0
  65. package/dist/core/credentials-manager.js.map +1 -0
  66. package/dist/core/project-structure-detector.d.ts +92 -0
  67. package/dist/core/project-structure-detector.d.ts.map +1 -0
  68. package/dist/core/project-structure-detector.js +289 -0
  69. package/dist/core/project-structure-detector.js.map +1 -0
  70. package/dist/core/rfc-generator-v2.d.ts +149 -0
  71. package/dist/core/rfc-generator-v2.d.ts.map +1 -0
  72. package/dist/core/rfc-generator-v2.js +399 -0
  73. package/dist/core/rfc-generator-v2.js.map +1 -0
  74. package/dist/core/rfc-generator.d.ts +147 -0
  75. package/dist/core/rfc-generator.d.ts.map +1 -0
  76. package/dist/core/rfc-generator.js +434 -0
  77. package/dist/core/rfc-generator.js.map +1 -0
  78. package/dist/integrations/ado/ado-client.d.ts +123 -0
  79. package/dist/integrations/ado/ado-client.d.ts.map +1 -0
  80. package/dist/integrations/ado/ado-client.js +398 -0
  81. package/dist/integrations/ado/ado-client.js.map +1 -0
  82. package/dist/integrations/jira/jira-client.d.ts +139 -0
  83. package/dist/integrations/jira/jira-client.d.ts.map +1 -0
  84. package/dist/integrations/jira/jira-client.js +386 -0
  85. package/dist/integrations/jira/jira-client.js.map +1 -0
  86. package/dist/integrations/jira/jira-incremental-mapper.d.ts +75 -0
  87. package/dist/integrations/jira/jira-incremental-mapper.d.ts.map +1 -0
  88. package/dist/integrations/jira/jira-incremental-mapper.js +474 -0
  89. package/dist/integrations/jira/jira-incremental-mapper.js.map +1 -0
  90. package/dist/integrations/jira/jira-mapper.d.ts +105 -0
  91. package/dist/integrations/jira/jira-mapper.d.ts.map +1 -0
  92. package/dist/integrations/jira/jira-mapper.js +494 -0
  93. package/dist/integrations/jira/jira-mapper.js.map +1 -0
  94. package/dist/testing/test-generator.d.ts +117 -0
  95. package/dist/testing/test-generator.d.ts.map +1 -0
  96. package/dist/testing/test-generator.js +370 -0
  97. package/dist/testing/test-generator.js.map +1 -0
  98. package/dist/utils/auto-install.d.ts +3 -0
  99. package/dist/utils/auto-install.d.ts.map +1 -1
  100. package/dist/utils/auto-install.js +16 -82
  101. package/dist/utils/auto-install.js.map +1 -1
  102. package/dist/utils/esm-helpers.d.ts +50 -0
  103. package/dist/utils/esm-helpers.d.ts.map +1 -0
  104. package/dist/utils/esm-helpers.js +57 -0
  105. package/dist/utils/esm-helpers.js.map +1 -0
  106. package/package.json +16 -7
  107. package/src/adapters/README.md +1 -2
  108. package/src/adapters/adapter-base.ts +6 -3
  109. package/src/adapters/adapter-loader.ts +261 -0
  110. package/src/adapters/agents-md-generator.ts +162 -0
  111. package/src/adapters/claude/README.md +6 -14
  112. package/src/adapters/claude/adapter.ts +4 -4
  113. package/src/adapters/claude-md-generator.ts +311 -0
  114. package/src/adapters/codex/README.md +105 -0
  115. package/src/adapters/codex/adapter.ts +333 -0
  116. package/src/adapters/copilot/adapter.ts +36 -65
  117. package/src/adapters/cursor/README.md +0 -2
  118. package/src/adapters/cursor/adapter.ts +46 -92
  119. package/src/adapters/doc-generator.ts +331 -0
  120. package/src/adapters/gemini/README.md +97 -0
  121. package/src/adapters/gemini/adapter.ts +298 -0
  122. package/src/adapters/generic/adapter.ts +61 -57
  123. package/src/adapters/registry.yaml +86 -25
  124. package/src/agents/devops/AGENT.md +16 -18
  125. package/src/agents/docs-writer/AGENT.md +2 -2
  126. package/src/agents/pm/AGENT.md +1 -50
  127. package/src/commands/README.md +134 -111
  128. package/src/commands/{build.md → specweave.do.md} +185 -72
  129. package/src/commands/{done.md → specweave.done.md} +3 -3
  130. package/src/commands/{inc.md → specweave.inc.md} +4 -4
  131. package/src/commands/specweave.increment.md +383 -0
  132. package/src/commands/specweave.md +430 -0
  133. package/src/commands/specweave.next.md +495 -0
  134. package/src/commands/specweave.progress.md +258 -0
  135. package/src/commands/specweave.sync-docs.md +665 -0
  136. package/src/commands/specweave.sync-github.md +269 -0
  137. package/src/commands/specweave.sync-jira.md +197 -0
  138. package/src/commands/{validate.md → specweave.validate.md} +4 -4
  139. package/src/hooks/README.md +19 -29
  140. package/src/hooks/post-task-completion.sh +25 -30
  141. package/src/skills/ado-sync/README.md +1 -36
  142. package/src/skills/bmad-method-expert/SKILL.md +1 -3
  143. package/src/skills/brownfield-analyzer/SKILL.md +429 -23
  144. package/src/skills/brownfield-onboarder/SKILL.md +221 -8
  145. package/src/skills/context-loader/SKILL.md +239 -617
  146. package/src/skills/context-optimizer/SKILL.md +0 -30
  147. package/src/skills/github-sync/SKILL.md +1 -19
  148. package/src/skills/increment-planner/SKILL.md +64 -18
  149. package/src/skills/increment-quality-judge/SKILL.md +1 -36
  150. package/src/skills/jira-sync/README.md +1 -38
  151. package/src/skills/role-orchestrator/README.md +1 -22
  152. package/src/skills/role-orchestrator/SKILL.md +1 -59
  153. package/src/skills/skill-router/SKILL.md +0 -18
  154. package/src/skills/spec-kit-expert/SKILL.md +1 -3
  155. package/src/skills/specweave-detector/SKILL.md +225 -275
  156. package/src/skills/task-builder/README.md +1 -7
  157. package/src/templates/AGENTS.md.template +334 -0
  158. package/src/templates/CLAUDE.md.template +131 -297
  159. package/src/templates/README.md.template +115 -23
  160. package/src/templates/environments/minimal/README.md +0 -1
  161. package/INSTALL.md +0 -848
  162. package/SPECWEAVE.md +0 -711
  163. package/src/adapters/copilot/.github/copilot/instructions.md +0 -376
  164. package/src/adapters/cursor/.cursorrules +0 -325
  165. package/src/adapters/generic/SPECWEAVE-MANUAL.md +0 -676
  166. package/src/commands/create-project.md +0 -528
  167. package/src/commands/generate-docs.md +0 -623
  168. package/src/commands/increment.md +0 -223
  169. package/src/commands/review-docs.md +0 -331
  170. package/src/commands/sync-github.md +0 -115
  171. package/src/skills/ado-sync/test-cases/test-1.yaml +0 -9
  172. package/src/skills/ado-sync/test-cases/test-2.yaml +0 -8
  173. package/src/skills/ado-sync/test-cases/test-3.yaml +0 -9
  174. package/src/skills/bmad-method-expert/test-cases/test-1-placeholder.yaml +0 -12
  175. package/src/skills/bmad-method-expert/test-cases/test-2-placeholder.yaml +0 -12
  176. package/src/skills/bmad-method-expert/test-cases/test-3-placeholder.yaml +0 -12
  177. package/src/skills/brownfield-analyzer/test-cases/test-1-basic-analysis.yaml +0 -48
  178. package/src/skills/brownfield-analyzer/test-cases/test-2-placeholder.yaml +0 -12
  179. package/src/skills/brownfield-analyzer/test-cases/test-3-placeholder.yaml +0 -12
  180. package/src/skills/brownfield-onboarder/test-cases/test-1-placeholder.yaml +0 -12
  181. package/src/skills/brownfield-onboarder/test-cases/test-2-placeholder.yaml +0 -12
  182. package/src/skills/brownfield-onboarder/test-cases/test-3-placeholder.yaml +0 -12
  183. package/src/skills/calendar-system/test-cases/test-1-placeholder.yaml +0 -12
  184. package/src/skills/calendar-system/test-cases/test-2-placeholder.yaml +0 -12
  185. package/src/skills/calendar-system/test-cases/test-3-placeholder.yaml +0 -12
  186. package/src/skills/context-loader/test-cases/test-1-basic-loading.yaml +0 -39
  187. package/src/skills/context-loader/test-cases/test-2-token-budget-exceeded.yaml +0 -44
  188. package/src/skills/context-loader/test-cases/test-3-section-anchors.yaml +0 -45
  189. package/src/skills/context-optimizer/test-cases/test-1-bug-fix-narrow.yaml +0 -97
  190. package/src/skills/context-optimizer/test-cases/test-2-feature-focused.yaml +0 -109
  191. package/src/skills/context-optimizer/test-cases/test-3-architecture-broad.yaml +0 -98
  192. package/src/skills/cost-optimizer/test-cases/test-1-basic-comparison.yaml +0 -75
  193. package/src/skills/cost-optimizer/test-cases/test-2-budget-constraint.yaml +0 -52
  194. package/src/skills/cost-optimizer/test-cases/test-3-scale-requirement.yaml +0 -63
  195. package/src/skills/cost-optimizer/test-results/README.md +0 -46
  196. package/src/skills/design-system-architect/test-cases/test-1-token-structure.yaml +0 -23
  197. package/src/skills/design-system-architect/test-cases/test-2-component-hierarchy.yaml +0 -24
  198. package/src/skills/design-system-architect/test-cases/test-3-accessibility-checklist.yaml +0 -23
  199. package/src/skills/diagrams-architect/test-cases/test-1-c4-context.yaml +0 -13
  200. package/src/skills/diagrams-architect/test-cases/test-2-sequence-diagram.yaml +0 -13
  201. package/src/skills/diagrams-architect/test-cases/test-3-er-diagram.yaml +0 -13
  202. package/src/skills/diagrams-generator/test-cases/test-1.yaml +0 -9
  203. package/src/skills/diagrams-generator/test-cases/test-2.yaml +0 -9
  204. package/src/skills/diagrams-generator/test-cases/test-3.yaml +0 -8
  205. package/src/skills/docs-updater/test-cases/test-1-placeholder.yaml +0 -12
  206. package/src/skills/docs-updater/test-cases/test-2-placeholder.yaml +0 -12
  207. package/src/skills/docs-updater/test-cases/test-3-placeholder.yaml +0 -12
  208. package/src/skills/dotnet-backend/test-cases/test-1-rest-api.yaml +0 -14
  209. package/src/skills/dotnet-backend/test-cases/test-2-authentication.yaml +0 -13
  210. package/src/skills/dotnet-backend/test-cases/test-3-minimal-api.yaml +0 -13
  211. package/src/skills/e2e-playwright/test-cases/TC-001-basic-navigation.yaml +0 -54
  212. package/src/skills/e2e-playwright/test-cases/TC-002-form-interaction.yaml +0 -64
  213. package/src/skills/e2e-playwright/test-cases/TC-003-specweave-integration.yaml +0 -74
  214. package/src/skills/e2e-playwright/test-cases/TC-004-accessibility-check.yaml +0 -98
  215. package/src/skills/figma-designer/test-cases/test-1-design-system.yaml +0 -13
  216. package/src/skills/figma-designer/test-cases/test-2-component-library.yaml +0 -13
  217. package/src/skills/figma-designer/test-cases/test-3-responsive-layout.yaml +0 -13
  218. package/src/skills/figma-implementer/test-cases/test-1-design-to-react.yaml +0 -13
  219. package/src/skills/figma-implementer/test-cases/test-2-storybook.yaml +0 -13
  220. package/src/skills/figma-implementer/test-cases/test-3-design-tokens.yaml +0 -13
  221. package/src/skills/figma-mcp-connector/test-cases/test-1-read-file-desktop.yaml +0 -22
  222. package/src/skills/figma-mcp-connector/test-cases/test-2-read-file-framelink.yaml +0 -21
  223. package/src/skills/figma-mcp-connector/test-cases/test-3-error-handling.yaml +0 -18
  224. package/src/skills/figma-to-code/test-cases/test-1-token-generation.yaml +0 -29
  225. package/src/skills/figma-to-code/test-cases/test-2-component-generation.yaml +0 -27
  226. package/src/skills/figma-to-code/test-cases/test-3-typescript-generation.yaml +0 -28
  227. package/src/skills/frontend/test-cases/test-1-react-component.yaml +0 -13
  228. package/src/skills/frontend/test-cases/test-2-form-validation.yaml +0 -13
  229. package/src/skills/frontend/test-cases/test-3-state-management.yaml +0 -13
  230. package/src/skills/github-sync/test-cases/test-1-placeholder.yaml +0 -12
  231. package/src/skills/github-sync/test-cases/test-2-placeholder.yaml +0 -12
  232. package/src/skills/github-sync/test-cases/test-3-placeholder.yaml +0 -12
  233. package/src/skills/hetzner-provisioner/test-cases/test-1-basic-provision.yaml +0 -71
  234. package/src/skills/hetzner-provisioner/test-cases/test-2-postgres-provision.yaml +0 -85
  235. package/src/skills/hetzner-provisioner/test-cases/test-3-ssl-config.yaml +0 -126
  236. package/src/skills/hetzner-provisioner/test-results/README.md +0 -259
  237. package/src/skills/increment-planner/test-cases/test-1-basic-feature.yaml +0 -27
  238. package/src/skills/increment-planner/test-cases/test-2-complex-feature.yaml +0 -30
  239. package/src/skills/increment-planner/test-cases/test-3-auto-numbering.yaml +0 -24
  240. package/src/skills/increment-quality-judge/test-cases/test-1-good-spec.yaml +0 -95
  241. package/src/skills/increment-quality-judge/test-cases/test-2-poor-spec.yaml +0 -108
  242. package/src/skills/increment-quality-judge/test-cases/test-3-export-suggestions.yaml +0 -87
  243. package/src/skills/jira-sync/test-cases/test-1.yaml +0 -9
  244. package/src/skills/jira-sync/test-cases/test-2.yaml +0 -9
  245. package/src/skills/jira-sync/test-cases/test-3.yaml +0 -10
  246. package/src/skills/nextjs/test-cases/test-1-app-router.yaml +0 -13
  247. package/src/skills/nextjs/test-cases/test-2-server-actions.yaml +0 -13
  248. package/src/skills/nextjs/test-cases/test-3-api-routes.yaml +0 -13
  249. package/src/skills/nodejs-backend/test-cases/test-1-express-api.yaml +0 -13
  250. package/src/skills/nodejs-backend/test-cases/test-2-prisma-orm.yaml +0 -13
  251. package/src/skills/nodejs-backend/test-cases/test-3-authentication.yaml +0 -13
  252. package/src/skills/notification-system/test-cases/test-1-placeholder.yaml +0 -12
  253. package/src/skills/notification-system/test-cases/test-2-placeholder.yaml +0 -12
  254. package/src/skills/notification-system/test-cases/test-3-placeholder.yaml +0 -12
  255. package/src/skills/python-backend/test-cases/test-1-fastapi-crud.yaml +0 -13
  256. package/src/skills/python-backend/test-cases/test-2-sqlalchemy.yaml +0 -13
  257. package/src/skills/python-backend/test-cases/test-3-authentication.yaml +0 -13
  258. package/src/skills/role-orchestrator/test-cases/test-1-simple-product.yaml +0 -98
  259. package/src/skills/role-orchestrator/test-cases/test-2-quality-gate-failure.yaml +0 -73
  260. package/src/skills/role-orchestrator/test-cases/test-3-security-workflow.yaml +0 -121
  261. package/src/skills/role-orchestrator/test-cases/test-4-parallel-execution.yaml +0 -145
  262. package/src/skills/role-orchestrator/test-cases/test-5-feedback-loops.yaml +0 -149
  263. package/src/skills/skill-creator/test-cases/test-1-placeholder.yaml +0 -12
  264. package/src/skills/skill-creator/test-cases/test-2-placeholder.yaml +0 -12
  265. package/src/skills/skill-creator/test-cases/test-3-placeholder.yaml +0 -12
  266. package/src/skills/skill-router/test-cases/test-1-basic-routing.yaml +0 -33
  267. package/src/skills/skill-router/test-cases/test-2-ambiguous-request.yaml +0 -42
  268. package/src/skills/skill-router/test-cases/test-3-nested-orchestration.yaml +0 -50
  269. package/src/skills/spec-driven-brainstorming/test-cases/TC-001-simple-idea-to-design.yaml +0 -148
  270. package/src/skills/spec-driven-brainstorming/test-cases/TC-002-complex-ultrathink-design.yaml +0 -190
  271. package/src/skills/spec-driven-brainstorming/test-cases/TC-003-unclear-requirements-socratic.yaml +0 -233
  272. package/src/skills/spec-driven-debugging/test-cases/TC-001-simple-auth-bug.yaml +0 -212
  273. package/src/skills/spec-driven-debugging/test-cases/TC-002-race-condition-ultrathink.yaml +0 -461
  274. package/src/skills/spec-driven-debugging/test-cases/TC-003-brownfield-missing-spec.yaml +0 -366
  275. package/src/skills/spec-kit-expert/test-cases/test-1-placeholder.yaml +0 -12
  276. package/src/skills/spec-kit-expert/test-cases/test-2-placeholder.yaml +0 -12
  277. package/src/skills/spec-kit-expert/test-cases/test-3-placeholder.yaml +0 -12
  278. package/src/skills/specweave-ado-mapper/test-cases/test-1-export-to-ado.yaml +0 -13
  279. package/src/skills/specweave-ado-mapper/test-cases/test-2-import-from-ado.yaml +0 -13
  280. package/src/skills/specweave-ado-mapper/test-cases/test-3-bidirectional-sync.yaml +0 -13
  281. package/src/skills/specweave-detector/test-cases/test-1-basic-detection.yaml +0 -37
  282. package/src/skills/specweave-detector/test-cases/test-2-missing-config.yaml +0 -37
  283. package/src/skills/specweave-detector/test-cases/test-3-non-specweave-project.yaml +0 -34
  284. package/src/skills/specweave-jira-mapper/test-cases/test-1-export-to-jira.yaml +0 -13
  285. package/src/skills/specweave-jira-mapper/test-cases/test-2-import-from-jira.yaml +0 -13
  286. package/src/skills/specweave-jira-mapper/test-cases/test-3-sync-status.yaml +0 -13
  287. package/src/skills/stripe-integrator/test-cases/test-1-placeholder.yaml +0 -12
  288. package/src/skills/stripe-integrator/test-cases/test-2-placeholder.yaml +0 -12
  289. package/src/skills/stripe-integrator/test-cases/test-3-placeholder.yaml +0 -12
  290. package/src/skills/task-builder/test-cases/test-1-placeholder.yaml +0 -12
  291. package/src/skills/task-builder/test-cases/test-2-placeholder.yaml +0 -12
  292. package/src/skills/task-builder/test-cases/test-3-placeholder.yaml +0 -12
  293. package/src/templates/config.yaml +0 -351
  294. /package/src/commands/{list-increments.md → specweave.list-increments.md} +0 -0
@@ -0,0 +1,474 @@
1
+ /**
2
+ * Jira Incremental Mapper - Granular Work Item Management
3
+ *
4
+ * Supports adding individual Jira items (Story, Bug, Task) to increments:
5
+ * - Add single story/bug/task to existing increment
6
+ * - Create increment from cherry-picked items across multiple Epics
7
+ * - Handle different work item types appropriately
8
+ * - Update RFC documentation when items are added
9
+ */
10
+ import { FlexibleRFCGenerator } from '../../core/rfc-generator-v2.js';
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import * as yaml from 'js-yaml';
14
+ export class JiraIncrementalMapper {
15
+ constructor(client, projectRoot = process.cwd()) {
16
+ this.client = client;
17
+ this.projectRoot = projectRoot;
18
+ this.rfcGenerator = new FlexibleRFCGenerator(projectRoot);
19
+ }
20
+ /**
21
+ * Add a specific Jira item (Story, Bug, Task) to an existing increment
22
+ */
23
+ async addItemToIncrement(incrementId, jiraKey) {
24
+ console.log(`\n📥 Adding Jira item ${jiraKey} to Increment ${incrementId}...`);
25
+ try {
26
+ // 1. Fetch Jira issue
27
+ const issue = await this.client.getIssue(jiraKey);
28
+ console.log(` ✅ Fetched: ${issue.fields.summary}`);
29
+ // 2. Determine work item type
30
+ const itemType = this.mapJiraTypeToWorkItemType(issue.fields.issuetype.name);
31
+ console.log(` ✅ Type: ${itemType}`);
32
+ // 3. Check if increment exists
33
+ const incrementFolder = path.join(this.projectRoot, '.specweave', 'increments', incrementId);
34
+ if (!fs.existsSync(incrementFolder)) {
35
+ throw new Error(`Increment ${incrementId} not found`);
36
+ }
37
+ // 4. Read existing spec.md
38
+ const specPath = path.join(incrementFolder, 'spec.md');
39
+ const specContent = fs.readFileSync(specPath, 'utf-8');
40
+ const parsed = this.parseMarkdownWithFrontmatter(specContent);
41
+ // 5. Create work item
42
+ const workItem = this.createWorkItemFromIssue(issue, itemType, incrementId);
43
+ // 6. Add to spec.md
44
+ const updatedSpec = this.addWorkItemToSpec(parsed, workItem);
45
+ fs.writeFileSync(specPath, updatedSpec, 'utf-8');
46
+ console.log(` ✅ Updated spec.md`);
47
+ // 7. Update tasks.md if needed
48
+ if (itemType !== 'epic') {
49
+ await this.addWorkItemToTasks(incrementFolder, workItem);
50
+ console.log(` ✅ Updated tasks.md`);
51
+ }
52
+ // 8. Update RFC document
53
+ await this.updateRFCWithWorkItem(incrementId, workItem);
54
+ console.log(` ✅ Updated RFC`);
55
+ return {
56
+ success: true,
57
+ message: `Added ${itemType} ${jiraKey} to increment ${incrementId}`,
58
+ workItem
59
+ };
60
+ }
61
+ catch (error) {
62
+ console.error(` ❌ Failed: ${error.message}`);
63
+ return {
64
+ success: false,
65
+ message: `Failed to add ${jiraKey}: ${error.message}`
66
+ };
67
+ }
68
+ }
69
+ /**
70
+ * Create new increment from multiple Jira items (cherry-picked)
71
+ */
72
+ async createIncrementFromItems(title, jiraKeys) {
73
+ console.log(`\n📦 Creating increment "${title}" from ${jiraKeys.length} items...`);
74
+ try {
75
+ // 1. Fetch all issues
76
+ const issues = await Promise.all(jiraKeys.map(key => this.client.getIssue(key)));
77
+ console.log(` ✅ Fetched ${issues.length} issues`);
78
+ // 2. Auto-number increment
79
+ const incrementId = this.getNextIncrementId();
80
+ console.log(` ✅ Auto-numbered as Increment ${incrementId}`);
81
+ // 3. Create increment folder
82
+ const incrementFolder = path.join(this.projectRoot, '.specweave', 'increments', incrementId);
83
+ this.ensureDir(incrementFolder);
84
+ // 4. Group by type
85
+ const workItems = {
86
+ stories: [],
87
+ bugs: [],
88
+ tasks: []
89
+ };
90
+ issues.forEach(issue => {
91
+ const itemType = this.mapJiraTypeToWorkItemType(issue.fields.issuetype.name);
92
+ const workItem = this.createWorkItemFromIssue(issue, itemType, incrementId);
93
+ if (itemType === 'story')
94
+ workItems.stories.push(workItem);
95
+ else if (itemType === 'bug')
96
+ workItems.bugs.push(workItem);
97
+ else if (itemType === 'task')
98
+ workItems.tasks.push(workItem);
99
+ });
100
+ console.log(` ✅ Grouped: ${workItems.stories.length} stories, ${workItems.bugs.length} bugs, ${workItems.tasks.length} tasks`);
101
+ // 5. Generate spec.md
102
+ await this.generateSpecFromWorkItems(incrementFolder, incrementId, title, workItems, issues);
103
+ console.log(` ✅ Generated spec.md`);
104
+ // 6. Generate tasks.md
105
+ await this.generateTasksFromWorkItems(incrementFolder, workItems);
106
+ console.log(` ✅ Generated tasks.md`);
107
+ // 7. Generate RFC
108
+ await this.generateRFCFromWorkItems(incrementId, title, workItems);
109
+ console.log(` ✅ Generated RFC`);
110
+ // 8. Generate context-manifest
111
+ await this.generateContextManifest(incrementFolder);
112
+ console.log(` ✅ Generated context-manifest.yaml`);
113
+ return {
114
+ success: true,
115
+ incrementId,
116
+ message: `Created increment ${incrementId} with ${issues.length} work items`
117
+ };
118
+ }
119
+ catch (error) {
120
+ console.error(` ❌ Failed: ${error.message}`);
121
+ return {
122
+ success: false,
123
+ incrementId: '',
124
+ message: `Failed to create increment: ${error.message}`
125
+ };
126
+ }
127
+ }
128
+ /**
129
+ * List all work items in an increment grouped by type
130
+ */
131
+ getIncrementWorkItems(incrementId) {
132
+ const specPath = path.join(this.projectRoot, '.specweave', 'increments', incrementId, 'spec.md');
133
+ const content = fs.readFileSync(specPath, 'utf-8');
134
+ const parsed = this.parseMarkdownWithFrontmatter(content);
135
+ const workItems = {
136
+ stories: [],
137
+ bugs: [],
138
+ tasks: []
139
+ };
140
+ if (parsed.frontmatter.work_items) {
141
+ parsed.frontmatter.work_items.forEach((item) => {
142
+ if (item.type === 'story')
143
+ workItems.stories.push(item);
144
+ else if (item.type === 'bug')
145
+ workItems.bugs.push(item);
146
+ else if (item.type === 'task')
147
+ workItems.tasks.push(item);
148
+ });
149
+ }
150
+ return workItems;
151
+ }
152
+ // ========== Helper Methods ==========
153
+ mapJiraTypeToWorkItemType(jiraType) {
154
+ const typeLower = jiraType.toLowerCase();
155
+ if (typeLower.includes('story'))
156
+ return 'story';
157
+ if (typeLower.includes('bug'))
158
+ return 'bug';
159
+ if (typeLower.includes('task') || typeLower.includes('sub-task'))
160
+ return 'task';
161
+ if (typeLower.includes('epic'))
162
+ return 'epic';
163
+ return 'task'; // Default
164
+ }
165
+ createWorkItemFromIssue(issue, itemType, incrementId) {
166
+ // Count existing items of this type to generate ID
167
+ const incrementFolder = path.join(this.projectRoot, '.specweave', 'increments', incrementId);
168
+ let count = 1;
169
+ if (fs.existsSync(path.join(incrementFolder, 'spec.md'))) {
170
+ const existing = this.getIncrementWorkItems(incrementId);
171
+ if (itemType === 'story')
172
+ count = existing.stories.length + 1;
173
+ else if (itemType === 'bug')
174
+ count = existing.bugs.length + 1;
175
+ else if (itemType === 'task')
176
+ count = existing.tasks.length + 1;
177
+ }
178
+ const prefix = itemType === 'story' ? 'US' :
179
+ itemType === 'bug' ? 'BUG' :
180
+ 'TASK';
181
+ return {
182
+ type: itemType,
183
+ id: `${prefix}${incrementId}-${String(count).padStart(3, '0')}`,
184
+ jira_key: issue.key,
185
+ jira_id: issue.id,
186
+ title: issue.fields.summary,
187
+ description: this.extractTextFromJiraDescription(issue.fields.description),
188
+ status: this.mapJiraStatusToSpecWeave(issue.fields.status.name),
189
+ priority: this.mapJiraPriorityToSpecWeave(issue.fields.priority?.name),
190
+ assignee: issue.fields.assignee?.displayName,
191
+ labels: issue.fields.labels,
192
+ parent_epic: issue.fields.parent ? {
193
+ key: issue.fields.parent.key,
194
+ title: issue.fields.parent.fields.summary
195
+ } : undefined
196
+ };
197
+ }
198
+ addWorkItemToSpec(parsed, workItem) {
199
+ // Initialize work_items array if not exists
200
+ if (!parsed.frontmatter.work_items) {
201
+ parsed.frontmatter.work_items = [];
202
+ }
203
+ // Add work item to frontmatter
204
+ parsed.frontmatter.work_items.push(workItem);
205
+ // Add to content based on type
206
+ let newContent = parsed.content;
207
+ if (workItem.type === 'story') {
208
+ const storySection = `\n### ${workItem.id}: ${workItem.title}\n\n${workItem.description}\n\n**Jira**: [${workItem.jira_key}](https://${process.env.JIRA_DOMAIN}/browse/${workItem.jira_key})\n`;
209
+ if (newContent.includes('## User Stories')) {
210
+ newContent = newContent.replace('## User Stories\n', `## User Stories\n${storySection}`);
211
+ }
212
+ else {
213
+ newContent += `\n## User Stories\n${storySection}`;
214
+ }
215
+ }
216
+ else if (workItem.type === 'bug') {
217
+ const bugSection = `\n### ${workItem.id}: ${workItem.title}\n\n${workItem.description}\n\n**Priority**: ${workItem.priority}\n**Jira**: [${workItem.jira_key}](https://${process.env.JIRA_DOMAIN}/browse/${workItem.jira_key})\n`;
218
+ if (newContent.includes('## Bugs')) {
219
+ newContent = newContent.replace('## Bugs\n', `## Bugs\n${bugSection}`);
220
+ }
221
+ else {
222
+ newContent += `\n## Bugs\n${bugSection}`;
223
+ }
224
+ }
225
+ else if (workItem.type === 'task') {
226
+ const taskSection = `\n### ${workItem.id}: ${workItem.title}\n\n${workItem.description}\n\n**Jira**: [${workItem.jira_key}](https://${process.env.JIRA_DOMAIN}/browse/${workItem.jira_key})\n`;
227
+ if (newContent.includes('## Technical Tasks')) {
228
+ newContent = newContent.replace('## Technical Tasks\n', `## Technical Tasks\n${taskSection}`);
229
+ }
230
+ else {
231
+ newContent += `\n## Technical Tasks\n${taskSection}`;
232
+ }
233
+ }
234
+ return this.serializeMarkdownWithFrontmatter(parsed.frontmatter, newContent);
235
+ }
236
+ async addWorkItemToTasks(incrementFolder, workItem) {
237
+ const tasksPath = path.join(incrementFolder, 'tasks.md');
238
+ let content = '';
239
+ if (fs.existsSync(tasksPath)) {
240
+ content = fs.readFileSync(tasksPath, 'utf-8');
241
+ }
242
+ else {
243
+ content = '# Tasks\n\n';
244
+ }
245
+ const sectionTitle = workItem.type === 'story' ? 'User Story' :
246
+ workItem.type === 'bug' ? 'Bug Fix' : 'Technical Task';
247
+ const taskEntry = `\n## ${sectionTitle}: ${workItem.id}\n\n- [ ] ${workItem.title} (Jira: ${workItem.jira_key})\n`;
248
+ content += taskEntry;
249
+ fs.writeFileSync(tasksPath, content, 'utf-8');
250
+ }
251
+ async updateRFCWithWorkItem(incrementId, workItem) {
252
+ const rfcFolder = path.join(this.projectRoot, '.specweave', 'docs', 'rfcs');
253
+ const rfcFiles = fs.readdirSync(rfcFolder).filter(f => f.startsWith(`rfc-${incrementId}`));
254
+ if (rfcFiles.length === 0)
255
+ return;
256
+ const rfcPath = path.join(rfcFolder, rfcFiles[0]);
257
+ let content = fs.readFileSync(rfcPath, 'utf-8');
258
+ const workItemSection = `\n### ${workItem.type.toUpperCase()}: ${workItem.title}\n\n${workItem.description}\n\n**Jira**: [${workItem.jira_key}](https://${process.env.JIRA_DOMAIN}/browse/${workItem.jira_key})\n`;
259
+ if (content.includes('## Detailed Design')) {
260
+ content = content.replace('## Detailed Design\n', `## Detailed Design\n${workItemSection}`);
261
+ }
262
+ else {
263
+ content += `\n## Detailed Design\n${workItemSection}`;
264
+ }
265
+ fs.writeFileSync(rfcPath, content, 'utf-8');
266
+ }
267
+ async generateSpecFromWorkItems(incrementFolder, incrementId, title, workItems, issues) {
268
+ const frontmatter = {
269
+ increment_id: incrementId,
270
+ title,
271
+ status: 'planned',
272
+ priority: 'P2',
273
+ created_at: new Date().toISOString(),
274
+ updated_at: new Date().toISOString(),
275
+ work_items: [
276
+ ...workItems.stories,
277
+ ...workItems.bugs,
278
+ ...workItems.tasks
279
+ ],
280
+ jira: {
281
+ source_issues: issues.map(i => ({
282
+ key: i.key,
283
+ type: i.fields.issuetype.name,
284
+ url: `https://${process.env.JIRA_DOMAIN}/browse/${i.key}`
285
+ })),
286
+ last_sync: new Date().toISOString(),
287
+ sync_direction: 'import'
288
+ }
289
+ };
290
+ let content = `# ${title}\n\n`;
291
+ if (workItems.stories.length > 0) {
292
+ content += `## User Stories\n\n`;
293
+ workItems.stories.forEach(story => {
294
+ content += `### ${story.id}: ${story.title}\n\n${story.description}\n\n`;
295
+ content += `**Jira**: [${story.jira_key}](https://${process.env.JIRA_DOMAIN}/browse/${story.jira_key})\n\n`;
296
+ });
297
+ }
298
+ if (workItems.bugs.length > 0) {
299
+ content += `## Bugs\n\n`;
300
+ workItems.bugs.forEach(bug => {
301
+ content += `### ${bug.id}: ${bug.title}\n\n${bug.description}\n\n`;
302
+ content += `**Priority**: ${bug.priority} | **Jira**: [${bug.jira_key}](https://${process.env.JIRA_DOMAIN}/browse/${bug.jira_key})\n\n`;
303
+ });
304
+ }
305
+ if (workItems.tasks.length > 0) {
306
+ content += `## Technical Tasks\n\n`;
307
+ workItems.tasks.forEach(task => {
308
+ content += `### ${task.id}: ${task.title}\n\n${task.description}\n\n`;
309
+ content += `**Jira**: [${task.jira_key}](https://${process.env.JIRA_DOMAIN}/browse/${task.jira_key})\n\n`;
310
+ });
311
+ }
312
+ const specMd = this.serializeMarkdownWithFrontmatter(frontmatter, content);
313
+ fs.writeFileSync(path.join(incrementFolder, 'spec.md'), specMd, 'utf-8');
314
+ }
315
+ async generateTasksFromWorkItems(incrementFolder, workItems) {
316
+ let content = '# Tasks\n\n';
317
+ const allItems = [...workItems.stories, ...workItems.bugs, ...workItems.tasks];
318
+ allItems.forEach(item => {
319
+ const sectionTitle = item.type === 'story' ? 'User Story' :
320
+ item.type === 'bug' ? 'Bug Fix' : 'Technical Task';
321
+ content += `## ${sectionTitle}: ${item.id}\n\n`;
322
+ content += `- [ ] ${item.title} (Jira: ${item.jira_key})\n\n`;
323
+ });
324
+ fs.writeFileSync(path.join(incrementFolder, 'tasks.md'), content, 'utf-8');
325
+ }
326
+ async generateRFCFromWorkItems(incrementId, title, workItems) {
327
+ // Convert WorkItem to FlexibleWorkItem format (V2)
328
+ const flexibleWorkItems = [
329
+ ...workItems.stories.map(item => ({
330
+ type: 'story',
331
+ id: item.id,
332
+ title: item.title,
333
+ description: item.description,
334
+ priority: item.priority,
335
+ source_key: item.jira_key,
336
+ source_url: `https://${process.env.JIRA_DOMAIN}/browse/${item.jira_key}`,
337
+ parent: item.parent_epic ? {
338
+ type: 'Epic',
339
+ key: item.parent_epic.key,
340
+ title: item.parent_epic.title
341
+ } : undefined,
342
+ labels: item.labels
343
+ })),
344
+ ...workItems.bugs.map(item => ({
345
+ type: 'bug',
346
+ id: item.id,
347
+ title: item.title,
348
+ description: item.description,
349
+ priority: item.priority,
350
+ source_key: item.jira_key,
351
+ source_url: `https://${process.env.JIRA_DOMAIN}/browse/${item.jira_key}`,
352
+ parent: item.parent_epic ? {
353
+ type: 'Epic',
354
+ key: item.parent_epic.key,
355
+ title: item.parent_epic.title
356
+ } : undefined,
357
+ labels: item.labels
358
+ })),
359
+ ...workItems.tasks.map(item => ({
360
+ type: 'task',
361
+ id: item.id,
362
+ title: item.title,
363
+ description: item.description,
364
+ priority: item.priority,
365
+ source_key: item.jira_key,
366
+ source_url: `https://${process.env.JIRA_DOMAIN}/browse/${item.jira_key}`,
367
+ parent: item.parent_epic ? {
368
+ type: 'Epic',
369
+ key: item.parent_epic.key,
370
+ title: item.parent_epic.title
371
+ } : undefined,
372
+ labels: item.labels
373
+ }))
374
+ ];
375
+ // Prepare RFC content for V2
376
+ const rfcContent = {
377
+ metadata: {
378
+ incrementId,
379
+ title,
380
+ status: 'draft',
381
+ source: 'jira',
382
+ created: new Date().toISOString().split('T')[0]
383
+ },
384
+ sourceMetadata: {
385
+ source_type: 'jira'
386
+ },
387
+ summary: `This increment addresses ${workItems.stories.length} user stories, ${workItems.bugs.length} bugs, and ${workItems.tasks.length} technical tasks.`,
388
+ motivation: `Implementation plan for ${title}.`,
389
+ workItems: flexibleWorkItems // V2 uses single array, auto-groups by strategy
390
+ };
391
+ // Generate RFC using flexible generator (V2)
392
+ await this.rfcGenerator.generateRFC(rfcContent);
393
+ }
394
+ // ... (rest of helper methods: getNextIncrementId, ensureDir, parseMarkdownWithFrontmatter, etc.)
395
+ getNextIncrementId() {
396
+ const incrementsDir = path.join(this.projectRoot, '.specweave', 'increments');
397
+ this.ensureDir(incrementsDir);
398
+ const existing = fs.readdirSync(incrementsDir)
399
+ .filter(name => /^\d{4}/.test(name))
400
+ .map(name => parseInt(name.split('-')[0]))
401
+ .sort((a, b) => b - a);
402
+ const nextNum = existing.length > 0 ? existing[0] + 1 : 1;
403
+ return String(nextNum).padStart(4, '0');
404
+ }
405
+ ensureDir(dir) {
406
+ if (!fs.existsSync(dir)) {
407
+ fs.mkdirSync(dir, { recursive: true });
408
+ }
409
+ }
410
+ parseMarkdownWithFrontmatter(content) {
411
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
412
+ if (frontmatterMatch) {
413
+ const frontmatter = yaml.load(frontmatterMatch[1]);
414
+ const markdownContent = frontmatterMatch[2];
415
+ return { frontmatter, content: markdownContent };
416
+ }
417
+ return { frontmatter: {}, content };
418
+ }
419
+ serializeMarkdownWithFrontmatter(frontmatter, content) {
420
+ const frontmatterYaml = yaml.dump(frontmatter);
421
+ return `---\n${frontmatterYaml}---\n\n${content}`;
422
+ }
423
+ extractTextFromJiraDescription(description) {
424
+ if (!description)
425
+ return '';
426
+ if (typeof description === 'object' && description.type === 'doc') {
427
+ const texts = [];
428
+ const extractText = (node) => {
429
+ if (node.type === 'text')
430
+ texts.push(node.text);
431
+ else if (node.content)
432
+ node.content.forEach(extractText);
433
+ };
434
+ description.content?.forEach(extractText);
435
+ return texts.join(' ');
436
+ }
437
+ return String(description);
438
+ }
439
+ mapJiraStatusToSpecWeave(jiraStatus) {
440
+ const statusLower = jiraStatus.toLowerCase();
441
+ if (statusLower.includes('to do') || statusLower.includes('backlog'))
442
+ return 'planned';
443
+ if (statusLower.includes('in progress'))
444
+ return 'in-progress';
445
+ if (statusLower.includes('done'))
446
+ return 'completed';
447
+ return 'planned';
448
+ }
449
+ mapJiraPriorityToSpecWeave(jiraPriority) {
450
+ if (!jiraPriority)
451
+ return 'P3';
452
+ const priorityLower = jiraPriority.toLowerCase();
453
+ if (priorityLower.includes('highest') || priorityLower.includes('critical'))
454
+ return 'P1';
455
+ if (priorityLower.includes('high'))
456
+ return 'P2';
457
+ return 'P3';
458
+ }
459
+ slugify(text) {
460
+ return text.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
461
+ }
462
+ async generateContextManifest(incrementFolder) {
463
+ const manifest = {
464
+ spec_sections: [],
465
+ documentation: [],
466
+ max_context_tokens: 10000,
467
+ priority: 'high',
468
+ auto_refresh: false
469
+ };
470
+ const manifestYaml = yaml.dump(manifest);
471
+ fs.writeFileSync(path.join(incrementFolder, 'context-manifest.yaml'), `---\n${manifestYaml}---\n`, 'utf-8');
472
+ }
473
+ }
474
+ //# sourceMappingURL=jira-incremental-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-incremental-mapper.js","sourceRoot":"","sources":["../../../src/integrations/jira/jira-incremental-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Jira ↔ SpecWeave Bidirectional Mapper
3
+ *
4
+ * Handles conversion between Jira issues and SpecWeave documentation structure:
5
+ * - Jira Epic → SpecWeave Increment (RFC folder)
6
+ * - Jira Story → SpecWeave User Story (RFC document)
7
+ * - Jira Sub-task → SpecWeave Task (tasks.md)
8
+ *
9
+ * Syncs with:
10
+ * - .specweave/increments/{id}/ - Increment folder
11
+ * - .specweave/docs/rfcs/ - RFC documents for detailed specs
12
+ * - .specweave/docs/decisions/ - Architecture decisions (ADRs)
13
+ */
14
+ import { JiraClient } from './jira-client';
15
+ export interface SpecWeaveIncrement {
16
+ id: string;
17
+ title: string;
18
+ description: string;
19
+ status: 'planned' | 'in-progress' | 'completed' | 'cancelled';
20
+ priority: 'P1' | 'P2' | 'P3';
21
+ created_at: string;
22
+ updated_at: string;
23
+ jira?: {
24
+ epic_key: string;
25
+ epic_id: string;
26
+ epic_url: string;
27
+ last_sync: string;
28
+ sync_direction: 'import' | 'export' | 'bidirectional';
29
+ };
30
+ user_stories: SpecWeaveUserStory[];
31
+ }
32
+ export interface SpecWeaveUserStory {
33
+ id: string;
34
+ title: string;
35
+ description: string;
36
+ acceptance_criteria: string[];
37
+ jira?: {
38
+ key: string;
39
+ id: string;
40
+ url: string;
41
+ };
42
+ tasks: SpecWeaveTask[];
43
+ }
44
+ export interface SpecWeaveTask {
45
+ id: string;
46
+ description: string;
47
+ completed: boolean;
48
+ jira?: {
49
+ key: string;
50
+ id: string;
51
+ };
52
+ }
53
+ export interface SyncResult {
54
+ success: boolean;
55
+ operation: 'import' | 'export' | 'sync';
56
+ direction: 'jira-to-specweave' | 'specweave-to-jira' | 'bidirectional';
57
+ changes: {
58
+ created: number;
59
+ updated: number;
60
+ deleted: number;
61
+ };
62
+ conflicts: SyncConflict[];
63
+ summary: string;
64
+ }
65
+ export interface SyncConflict {
66
+ type: 'title' | 'description' | 'status' | 'priority';
67
+ jira_value: string;
68
+ specweave_value: string;
69
+ resolution?: 'jira' | 'specweave' | 'manual';
70
+ }
71
+ export declare class JiraMapper {
72
+ private client;
73
+ private projectRoot;
74
+ constructor(client: JiraClient, projectRoot?: string);
75
+ /**
76
+ * Import Jira Epic as SpecWeave Increment with RFC documentation
77
+ */
78
+ importEpicAsIncrement(epicKey: string): Promise<SyncResult>;
79
+ /**
80
+ * Export SpecWeave Increment to Jira Epic
81
+ */
82
+ exportIncrementAsEpic(incrementId: string, projectKey: string): Promise<SyncResult>;
83
+ /**
84
+ * Bidirectional sync between SpecWeave Increment and Jira Epic
85
+ */
86
+ syncIncrement(incrementId: string): Promise<SyncResult>;
87
+ private getNextIncrementId;
88
+ private ensureDir;
89
+ private generateSpecMd;
90
+ private generateTasksMd;
91
+ private generateRFC;
92
+ private generateContextManifest;
93
+ private parseMarkdownWithFrontmatter;
94
+ private serializeMarkdownWithFrontmatter;
95
+ private extractTextFromJiraDescription;
96
+ private extractDescription;
97
+ private extractUserStories;
98
+ private parseTasksMd;
99
+ private updateSpecWithJiraMetadata;
100
+ private mapJiraStatusToSpecWeave;
101
+ private mapJiraPriorityToSpecWeave;
102
+ private mapPriorityToJira;
103
+ private slugify;
104
+ }
105
+ //# sourceMappingURL=jira-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-mapper.d.ts","sourceRoot":"","sources":["../../../src/integrations/jira/jira-mapper.ts"],"names":[],"mappings":"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"}