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,494 @@
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 * as fs from 'fs';
15
+ import * as path from 'path';
16
+ import * as yaml from 'js-yaml';
17
+ export class JiraMapper {
18
+ constructor(client, projectRoot = process.cwd()) {
19
+ this.client = client;
20
+ this.projectRoot = projectRoot;
21
+ }
22
+ /**
23
+ * Import Jira Epic as SpecWeave Increment with RFC documentation
24
+ */
25
+ async importEpicAsIncrement(epicKey) {
26
+ console.log(`\n📥 Importing Jira Epic ${epicKey} as SpecWeave Increment...`);
27
+ try {
28
+ // 1. Fetch Epic from Jira
29
+ const epic = await this.client.getIssue(epicKey);
30
+ console.log(` ✅ Fetched Epic: ${epic.fields.summary}`);
31
+ // 2. Fetch all Stories linked to this Epic
32
+ const stories = await this.client.searchIssues({
33
+ jql: `parent = ${epicKey} AND issuetype = Story`,
34
+ maxResults: 100
35
+ });
36
+ console.log(` ✅ Found ${stories.length} stories`);
37
+ // 3. Fetch all Sub-tasks for each Story
38
+ const storyTasks = await Promise.all(stories.map(async (story) => {
39
+ const subtasks = await this.client.searchIssues({
40
+ jql: `parent = ${story.key} AND issuetype = Sub-task`,
41
+ maxResults: 50
42
+ });
43
+ return { story, subtasks };
44
+ }));
45
+ // 4. Auto-number next increment
46
+ const incrementId = this.getNextIncrementId();
47
+ console.log(` ✅ Auto-numbered as Increment ${incrementId}`);
48
+ // 5. Create increment folder structure
49
+ const incrementFolder = path.join(this.projectRoot, '.specweave', 'increments', incrementId);
50
+ this.ensureDir(incrementFolder);
51
+ // 6. Generate spec.md
52
+ await this.generateSpecMd(incrementFolder, epic, stories, incrementId);
53
+ console.log(` ✅ Generated spec.md`);
54
+ // 7. Generate tasks.md
55
+ await this.generateTasksMd(incrementFolder, storyTasks);
56
+ console.log(` ✅ Generated tasks.md`);
57
+ // 8. Generate RFC document (detailed spec)
58
+ await this.generateRFC(epic, stories, incrementId);
59
+ console.log(` ✅ Generated RFC document`);
60
+ // 9. Generate context-manifest.yaml
61
+ await this.generateContextManifest(incrementFolder);
62
+ console.log(` ✅ Generated context-manifest.yaml`);
63
+ // 10. Update Epic in Jira with SpecWeave ID
64
+ await this.client.updateIssue({
65
+ key: epicKey,
66
+ customFields: {
67
+ 'SpecWeave-Increment-ID': incrementId
68
+ }
69
+ });
70
+ return {
71
+ success: true,
72
+ operation: 'import',
73
+ direction: 'jira-to-specweave',
74
+ changes: {
75
+ created: 1 + stories.length + storyTasks.reduce((sum, st) => sum + st.subtasks.length, 0),
76
+ updated: 1, // Updated Epic with SpecWeave ID
77
+ deleted: 0
78
+ },
79
+ conflicts: [],
80
+ summary: `Successfully imported Epic ${epicKey} as Increment ${incrementId} with ${stories.length} stories and ${storyTasks.reduce((sum, st) => sum + st.subtasks.length, 0)} tasks`
81
+ };
82
+ }
83
+ catch (error) {
84
+ console.error(` ❌ Import failed:`, error.message);
85
+ return {
86
+ success: false,
87
+ operation: 'import',
88
+ direction: 'jira-to-specweave',
89
+ changes: { created: 0, updated: 0, deleted: 0 },
90
+ conflicts: [],
91
+ summary: `Import failed: ${error.message}`
92
+ };
93
+ }
94
+ }
95
+ /**
96
+ * Export SpecWeave Increment to Jira Epic
97
+ */
98
+ async exportIncrementAsEpic(incrementId, projectKey) {
99
+ console.log(`\n📤 Exporting Increment ${incrementId} to Jira...`);
100
+ try {
101
+ // 1. Read increment spec.md
102
+ const incrementFolder = path.join(this.projectRoot, '.specweave', 'increments', incrementId);
103
+ const specPath = path.join(incrementFolder, 'spec.md');
104
+ const specContent = fs.readFileSync(specPath, 'utf-8');
105
+ // 2. Parse frontmatter and content
106
+ const parsed = this.parseMarkdownWithFrontmatter(specContent);
107
+ console.log(` ✅ Parsed spec.md: ${parsed.frontmatter.title}`);
108
+ // 3. Check if already synced
109
+ if (parsed.frontmatter.jira?.epic_key) {
110
+ console.log(` ⚠️ Already synced to Jira Epic ${parsed.frontmatter.jira.epic_key}`);
111
+ return this.syncIncrement(incrementId);
112
+ }
113
+ // 4. Create Epic in Jira
114
+ const epic = await this.client.createIssue({
115
+ issueType: 'Epic',
116
+ summary: `[Increment ${incrementId}] ${parsed.frontmatter.title}`,
117
+ description: this.extractDescription(parsed.content),
118
+ priority: this.mapPriorityToJira(parsed.frontmatter.priority),
119
+ labels: ['specweave', `increment-${incrementId}`]
120
+ }, projectKey);
121
+ console.log(` ✅ Created Epic ${epic.key}`);
122
+ // 5. Create Stories for each User Story
123
+ const userStories = this.extractUserStories(parsed.content);
124
+ const createdStories = [];
125
+ for (const us of userStories) {
126
+ const story = await this.client.createIssue({
127
+ issueType: 'Story',
128
+ summary: us.title,
129
+ description: us.description,
130
+ priority: this.mapPriorityToJira(parsed.frontmatter.priority),
131
+ labels: ['specweave', `user-story-${us.id}`],
132
+ epicKey: epic.key
133
+ }, projectKey);
134
+ createdStories.push(story);
135
+ console.log(` ✅ Created Story ${story.key}: ${us.title}`);
136
+ }
137
+ // 6. Create Sub-tasks from tasks.md
138
+ const tasksPath = path.join(incrementFolder, 'tasks.md');
139
+ if (fs.existsSync(tasksPath)) {
140
+ const tasks = this.parseTasksMd(tasksPath);
141
+ let taskCount = 0;
142
+ for (const storyId in tasks) {
143
+ const storyIndex = userStories.findIndex(us => us.id === storyId);
144
+ if (storyIndex >= 0 && createdStories[storyIndex]) {
145
+ for (const task of tasks[storyId]) {
146
+ await this.client.createIssue({
147
+ issueType: 'Sub-task',
148
+ summary: task.description,
149
+ parentKey: createdStories[storyIndex].key,
150
+ labels: ['specweave', 'task']
151
+ }, projectKey);
152
+ taskCount++;
153
+ }
154
+ }
155
+ }
156
+ console.log(` ✅ Created ${taskCount} sub-tasks`);
157
+ }
158
+ // 7. Update spec.md with Jira metadata
159
+ await this.updateSpecWithJiraMetadata(specPath, epic, createdStories);
160
+ console.log(` ✅ Updated spec.md with Jira metadata`);
161
+ return {
162
+ success: true,
163
+ operation: 'export',
164
+ direction: 'specweave-to-jira',
165
+ changes: {
166
+ created: 1 + createdStories.length,
167
+ updated: 1, // Updated spec.md
168
+ deleted: 0
169
+ },
170
+ conflicts: [],
171
+ summary: `Successfully exported Increment ${incrementId} as Epic ${epic.key} with ${createdStories.length} stories`
172
+ };
173
+ }
174
+ catch (error) {
175
+ console.error(` ❌ Export failed:`, error.message);
176
+ return {
177
+ success: false,
178
+ operation: 'export',
179
+ direction: 'specweave-to-jira',
180
+ changes: { created: 0, updated: 0, deleted: 0 },
181
+ conflicts: [],
182
+ summary: `Export failed: ${error.message}`
183
+ };
184
+ }
185
+ }
186
+ /**
187
+ * Bidirectional sync between SpecWeave Increment and Jira Epic
188
+ */
189
+ async syncIncrement(incrementId) {
190
+ console.log(`\n🔄 Syncing Increment ${incrementId} with Jira...`);
191
+ try {
192
+ // 1. Read increment spec.md
193
+ const incrementFolder = path.join(this.projectRoot, '.specweave', 'increments', incrementId);
194
+ const specPath = path.join(incrementFolder, 'spec.md');
195
+ const specContent = fs.readFileSync(specPath, 'utf-8');
196
+ const parsed = this.parseMarkdownWithFrontmatter(specContent);
197
+ if (!parsed.frontmatter.jira?.epic_key) {
198
+ throw new Error('Increment not linked to Jira Epic. Export first.');
199
+ }
200
+ const epicKey = parsed.frontmatter.jira.epic_key;
201
+ const lastSync = new Date(parsed.frontmatter.jira.last_sync || 0);
202
+ // 2. Fetch Epic from Jira
203
+ const epic = await this.client.getIssue(epicKey);
204
+ // 3. Detect changes since last sync
205
+ const conflicts = [];
206
+ const changes = { created: 0, updated: 0, deleted: 0 };
207
+ // Compare title
208
+ const specTitle = parsed.frontmatter.title;
209
+ const jiraTitle = epic.fields.summary.replace(/^\[Increment \d+\] /, '');
210
+ if (specTitle !== jiraTitle) {
211
+ conflicts.push({
212
+ type: 'title',
213
+ jira_value: jiraTitle,
214
+ specweave_value: specTitle
215
+ });
216
+ }
217
+ // Compare status
218
+ const specStatus = parsed.frontmatter.status;
219
+ const jiraStatus = this.mapJiraStatusToSpecWeave(epic.fields.status.name);
220
+ if (specStatus !== jiraStatus) {
221
+ conflicts.push({
222
+ type: 'status',
223
+ jira_value: epic.fields.status.name,
224
+ specweave_value: specStatus
225
+ });
226
+ }
227
+ // 4. Resolve conflicts (for now, Jira wins)
228
+ if (conflicts.length > 0) {
229
+ console.log(` ⚠️ Found ${conflicts.length} conflicts`);
230
+ for (const conflict of conflicts) {
231
+ console.log(` - ${conflict.type}: Jira="${conflict.jira_value}" vs SpecWeave="${conflict.specweave_value}"`);
232
+ conflict.resolution = 'jira'; // TODO: Ask user for resolution
233
+ }
234
+ // Update SpecWeave with Jira values
235
+ if (conflicts.some(c => c.type === 'title')) {
236
+ parsed.frontmatter.title = jiraTitle;
237
+ changes.updated++;
238
+ }
239
+ if (conflicts.some(c => c.type === 'status')) {
240
+ parsed.frontmatter.status = jiraStatus;
241
+ changes.updated++;
242
+ }
243
+ // Write updated spec.md
244
+ const updatedContent = this.serializeMarkdownWithFrontmatter(parsed.frontmatter, parsed.content);
245
+ fs.writeFileSync(specPath, updatedContent, 'utf-8');
246
+ }
247
+ // 5. Update last sync timestamp
248
+ parsed.frontmatter.jira.last_sync = new Date().toISOString();
249
+ parsed.frontmatter.jira.sync_direction = 'bidirectional';
250
+ const updatedContent = this.serializeMarkdownWithFrontmatter(parsed.frontmatter, parsed.content);
251
+ fs.writeFileSync(specPath, updatedContent, 'utf-8');
252
+ console.log(` ✅ Sync complete`);
253
+ return {
254
+ success: true,
255
+ operation: 'sync',
256
+ direction: 'bidirectional',
257
+ changes,
258
+ conflicts,
259
+ summary: `Synced Increment ${incrementId} with Epic ${epicKey}. ${conflicts.length} conflicts resolved.`
260
+ };
261
+ }
262
+ catch (error) {
263
+ console.error(` ❌ Sync failed:`, error.message);
264
+ return {
265
+ success: false,
266
+ operation: 'sync',
267
+ direction: 'bidirectional',
268
+ changes: { created: 0, updated: 0, deleted: 0 },
269
+ conflicts: [],
270
+ summary: `Sync failed: ${error.message}`
271
+ };
272
+ }
273
+ }
274
+ // ========== Helper Methods ==========
275
+ getNextIncrementId() {
276
+ const incrementsDir = path.join(this.projectRoot, '.specweave', 'increments');
277
+ this.ensureDir(incrementsDir);
278
+ const existing = fs.readdirSync(incrementsDir)
279
+ .filter(name => /^\d{4}/.test(name))
280
+ .map(name => parseInt(name.split('-')[0]))
281
+ .sort((a, b) => b - a);
282
+ const nextNum = existing.length > 0 ? existing[0] + 1 : 1;
283
+ return String(nextNum).padStart(4, '0');
284
+ }
285
+ ensureDir(dir) {
286
+ if (!fs.existsSync(dir)) {
287
+ fs.mkdirSync(dir, { recursive: true });
288
+ }
289
+ }
290
+ async generateSpecMd(incrementFolder, epic, stories, incrementId) {
291
+ const frontmatter = {
292
+ increment_id: incrementId,
293
+ title: epic.fields.summary,
294
+ status: this.mapJiraStatusToSpecWeave(epic.fields.status.name),
295
+ priority: this.mapJiraPriorityToSpecWeave(epic.fields.priority?.name),
296
+ created_at: new Date().toISOString(),
297
+ updated_at: new Date().toISOString(),
298
+ jira: {
299
+ epic_key: epic.key,
300
+ epic_id: epic.id,
301
+ epic_url: `https://${process.env.JIRA_DOMAIN}/browse/${epic.key}`,
302
+ imported_at: new Date().toISOString(),
303
+ last_sync: new Date().toISOString(),
304
+ sync_direction: 'import'
305
+ }
306
+ };
307
+ let content = `# ${epic.fields.summary}\n\n`;
308
+ content += this.extractTextFromJiraDescription(epic.fields.description) + '\n\n';
309
+ content += `## User Stories\n\n`;
310
+ stories.forEach((story, index) => {
311
+ const usId = `US${incrementId}-${String(index + 1).padStart(3, '0')}`;
312
+ content += `### ${usId}: ${story.fields.summary}\n\n`;
313
+ content += this.extractTextFromJiraDescription(story.fields.description) + '\n\n';
314
+ content += `**Jira Story**: [${story.key}](https://${process.env.JIRA_DOMAIN}/browse/${story.key})\n\n`;
315
+ });
316
+ const specMd = this.serializeMarkdownWithFrontmatter(frontmatter, content);
317
+ fs.writeFileSync(path.join(incrementFolder, 'spec.md'), specMd, 'utf-8');
318
+ }
319
+ async generateTasksMd(incrementFolder, storyTasks) {
320
+ let content = `# Tasks\n\n`;
321
+ storyTasks.forEach(({ story, subtasks }, storyIndex) => {
322
+ if (subtasks.length === 0)
323
+ return;
324
+ const usId = `US-${String(storyIndex + 1).padStart(3, '0')}`;
325
+ content += `## User Story: ${usId}\n\n`;
326
+ subtasks.forEach(subtask => {
327
+ const checked = subtask.fields.status.name.toLowerCase() === 'done' ? 'x' : ' ';
328
+ content += `- [${checked}] ${subtask.fields.summary} (Jira: ${subtask.key})\n`;
329
+ });
330
+ content += '\n';
331
+ });
332
+ fs.writeFileSync(path.join(incrementFolder, 'tasks.md'), content, 'utf-8');
333
+ }
334
+ async generateRFC(epic, stories, incrementId) {
335
+ const rfcFolder = path.join(this.projectRoot, '.specweave', 'docs', 'rfcs');
336
+ this.ensureDir(rfcFolder);
337
+ const rfcPath = path.join(rfcFolder, `rfc-${incrementId}-${this.slugify(epic.fields.summary)}.md`);
338
+ let content = `# RFC ${incrementId}: ${epic.fields.summary}\n\n`;
339
+ content += `**Status**: Draft\n`;
340
+ content += `**Created**: ${new Date().toISOString().split('T')[0]}\n`;
341
+ content += `**Jira Epic**: [${epic.key}](https://${process.env.JIRA_DOMAIN}/browse/${epic.key})\n\n`;
342
+ content += `## Summary\n\n`;
343
+ content += this.extractTextFromJiraDescription(epic.fields.description) + '\n\n';
344
+ content += `## Motivation\n\n`;
345
+ content += `This RFC outlines the implementation plan for ${epic.fields.summary}.\n\n`;
346
+ content += `## Detailed Design\n\n`;
347
+ stories.forEach((story, index) => {
348
+ content += `### ${index + 1}. ${story.fields.summary}\n\n`;
349
+ content += this.extractTextFromJiraDescription(story.fields.description) + '\n\n';
350
+ });
351
+ content += `## Alternatives Considered\n\n`;
352
+ content += `(To be filled in during design phase)\n\n`;
353
+ content += `## Implementation Plan\n\n`;
354
+ content += `See increment ${incrementId} in \`.specweave/increments/${incrementId}/\`\n`;
355
+ fs.writeFileSync(rfcPath, content, 'utf-8');
356
+ }
357
+ async generateContextManifest(incrementFolder) {
358
+ const manifest = {
359
+ spec_sections: [],
360
+ documentation: [],
361
+ max_context_tokens: 10000,
362
+ priority: 'high',
363
+ auto_refresh: false
364
+ };
365
+ const manifestYaml = yaml.dump(manifest);
366
+ fs.writeFileSync(path.join(incrementFolder, 'context-manifest.yaml'), `---\n${manifestYaml}---\n`, 'utf-8');
367
+ }
368
+ parseMarkdownWithFrontmatter(content) {
369
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
370
+ if (frontmatterMatch) {
371
+ const frontmatter = yaml.load(frontmatterMatch[1]);
372
+ const markdownContent = frontmatterMatch[2];
373
+ return { frontmatter, content: markdownContent };
374
+ }
375
+ return { frontmatter: {}, content };
376
+ }
377
+ serializeMarkdownWithFrontmatter(frontmatter, content) {
378
+ const frontmatterYaml = yaml.dump(frontmatter);
379
+ return `---\n${frontmatterYaml}---\n\n${content}`;
380
+ }
381
+ extractTextFromJiraDescription(description) {
382
+ if (!description)
383
+ return '';
384
+ // Handle Atlassian Document Format (ADF)
385
+ if (typeof description === 'object' && description.type === 'doc') {
386
+ const texts = [];
387
+ const extractText = (node) => {
388
+ if (node.type === 'text') {
389
+ texts.push(node.text);
390
+ }
391
+ else if (node.content) {
392
+ node.content.forEach(extractText);
393
+ }
394
+ };
395
+ description.content?.forEach(extractText);
396
+ return texts.join(' ');
397
+ }
398
+ return String(description);
399
+ }
400
+ extractDescription(content) {
401
+ const lines = content.split('\n').slice(0, 5);
402
+ return lines.join('\n').trim();
403
+ }
404
+ extractUserStories(content) {
405
+ const stories = [];
406
+ const lines = content.split('\n');
407
+ let currentStory = null;
408
+ for (const line of lines) {
409
+ const match = line.match(/^###\s+(US\d+-\d+):\s+(.+)$/);
410
+ if (match) {
411
+ if (currentStory)
412
+ stories.push(currentStory);
413
+ currentStory = { id: match[1], title: match[2], description: '' };
414
+ }
415
+ else if (currentStory && line.trim()) {
416
+ currentStory.description += line + '\n';
417
+ }
418
+ }
419
+ if (currentStory)
420
+ stories.push(currentStory);
421
+ return stories;
422
+ }
423
+ parseTasksMd(tasksPath) {
424
+ const content = fs.readFileSync(tasksPath, 'utf-8');
425
+ const tasks = {};
426
+ let currentStoryId = null;
427
+ const lines = content.split('\n');
428
+ for (const line of lines) {
429
+ const storyMatch = line.match(/^##\s+User Story:\s+(US-\d+)/);
430
+ if (storyMatch) {
431
+ currentStoryId = storyMatch[1];
432
+ tasks[currentStoryId] = [];
433
+ }
434
+ else if (currentStoryId) {
435
+ const taskMatch = line.match(/^-\s+\[([ x])\]\s+(.+?)(?:\s+\(Jira: .+\))?$/);
436
+ if (taskMatch) {
437
+ tasks[currentStoryId].push({
438
+ description: taskMatch[2],
439
+ completed: taskMatch[1] === 'x'
440
+ });
441
+ }
442
+ }
443
+ }
444
+ return tasks;
445
+ }
446
+ async updateSpecWithJiraMetadata(specPath, epic, stories) {
447
+ const content = fs.readFileSync(specPath, 'utf-8');
448
+ const parsed = this.parseMarkdownWithFrontmatter(content);
449
+ parsed.frontmatter.jira = {
450
+ epic_key: epic.key,
451
+ epic_id: epic.id,
452
+ epic_url: `https://${process.env.JIRA_DOMAIN}/browse/${epic.key}`,
453
+ stories: stories.map(s => ({ key: s.key, id: s.id })),
454
+ last_sync: new Date().toISOString(),
455
+ sync_direction: 'export'
456
+ };
457
+ const updated = this.serializeMarkdownWithFrontmatter(parsed.frontmatter, parsed.content);
458
+ fs.writeFileSync(specPath, updated, 'utf-8');
459
+ }
460
+ mapJiraStatusToSpecWeave(jiraStatus) {
461
+ const statusLower = jiraStatus.toLowerCase();
462
+ if (statusLower.includes('to do') || statusLower.includes('backlog'))
463
+ return 'planned';
464
+ if (statusLower.includes('in progress'))
465
+ return 'in-progress';
466
+ if (statusLower.includes('done') || statusLower.includes('complete'))
467
+ return 'completed';
468
+ return 'planned';
469
+ }
470
+ mapJiraPriorityToSpecWeave(jiraPriority) {
471
+ if (!jiraPriority)
472
+ return 'P3';
473
+ const priorityLower = jiraPriority.toLowerCase();
474
+ if (priorityLower.includes('highest') || priorityLower.includes('critical'))
475
+ return 'P1';
476
+ if (priorityLower.includes('high'))
477
+ return 'P2';
478
+ return 'P3';
479
+ }
480
+ mapPriorityToJira(priority) {
481
+ if (priority === 'P1')
482
+ return 'Highest';
483
+ if (priority === 'P2')
484
+ return 'High';
485
+ return 'Medium';
486
+ }
487
+ slugify(text) {
488
+ return text
489
+ .toLowerCase()
490
+ .replace(/[^a-z0-9]+/g, '-')
491
+ .replace(/^-+|-+$/g, '');
492
+ }
493
+ }
494
+ //# sourceMappingURL=jira-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-mapper.js","sourceRoot":"","sources":["../../../src/integrations/jira/jira-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Test Generator - Converts YAML Test Specifications to Executable TypeScript Tests
3
+ *
4
+ * Takes test-cases (YAML) and generates executable integration tests.
5
+ *
6
+ * Supports:
7
+ * - Skill activation tests
8
+ * - API integration tests (Jira, ADO, GitHub)
9
+ * - End-to-end workflow tests
10
+ * - Uses .env credentials for real API calls
11
+ */
12
+ export interface TestSpec {
13
+ name: string;
14
+ description: string;
15
+ type?: 'skill_activation' | 'api_integration' | 'e2e_workflow';
16
+ input: {
17
+ prompt?: string;
18
+ api_call?: {
19
+ method: string;
20
+ endpoint: string;
21
+ body?: any;
22
+ headers?: Record<string, string>;
23
+ };
24
+ setup?: string[];
25
+ };
26
+ expected_output: {
27
+ skill_activated?: boolean;
28
+ agent_invoked?: string;
29
+ api_response?: {
30
+ status: number;
31
+ body?: any;
32
+ };
33
+ files_created?: string[];
34
+ result?: any;
35
+ };
36
+ requires?: {
37
+ env_vars?: string[];
38
+ credentials?: string[];
39
+ };
40
+ }
41
+ export interface GeneratedTest {
42
+ skillName: string;
43
+ testFilePath: string;
44
+ testCount: number;
45
+ content: string;
46
+ }
47
+ export declare class TestGenerator {
48
+ private projectRoot;
49
+ private testSpecsDir;
50
+ private testOutputDir;
51
+ constructor(projectRoot?: string);
52
+ /**
53
+ * Generate tests for a specific skill
54
+ */
55
+ generateTestsForSkill(skillName: string): Promise<GeneratedTest | null>;
56
+ /**
57
+ * Generate tests for all skills
58
+ */
59
+ generateAllTests(): Promise<GeneratedTest[]>;
60
+ /**
61
+ * Load test spec from YAML file
62
+ */
63
+ private loadTestSpec;
64
+ /**
65
+ * Generate TypeScript test file from specs
66
+ */
67
+ private generateTestFile;
68
+ /**
69
+ * Generate file header with imports
70
+ */
71
+ private generateFileHeader;
72
+ /**
73
+ * Generate test class
74
+ */
75
+ private generateTestClass;
76
+ /**
77
+ * Generate individual test method
78
+ */
79
+ private generateTestMethod;
80
+ /**
81
+ * Generate skill activation test logic
82
+ */
83
+ private generateSkillActivationTest;
84
+ /**
85
+ * Generate API integration test logic
86
+ */
87
+ private generateApiIntegrationTest;
88
+ /**
89
+ * Generate generic test logic
90
+ */
91
+ private generateGenericTest;
92
+ /**
93
+ * Generate report method
94
+ */
95
+ private generateReportMethod;
96
+ /**
97
+ * Generate test runner
98
+ */
99
+ private generateTestRunner;
100
+ /**
101
+ * Format skill name for display
102
+ */
103
+ private formatSkillName;
104
+ /**
105
+ * Format class name
106
+ */
107
+ private formatClassName;
108
+ /**
109
+ * Convert to camelCase - sanitizes all special characters
110
+ */
111
+ private camelCase;
112
+ /**
113
+ * Escape string for use in single-quoted JavaScript strings
114
+ */
115
+ private escapeString;
116
+ }
117
+ //# sourceMappingURL=test-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-generator.d.ts","sourceRoot":"","sources":["../../src/testing/test-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,cAAc,CAAC;IAC/D,KAAK,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE;YACT,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,CAAC,EAAE,GAAG,CAAC;YACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAClC,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,eAAe,EAAE;QACf,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE;YACb,MAAM,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,GAAG,CAAC;SACZ,CAAC;QACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,EAAE,GAAG,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAS;gBAElB,WAAW,GAAE,MAAsB;IAM/C;;OAEG;IACU,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAiDpF;;OAEG;IACU,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAuBzD;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoC1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwDzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuC1B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IASnC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAclC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsC5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAcjB;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB"}