specweave 0.6.8 → 0.7.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 (255) hide show
  1. package/.claude-plugin/README.md +1 -1
  2. package/CLAUDE.md +903 -99
  3. package/README.md +143 -207
  4. package/bin/specweave.js +67 -0
  5. package/dist/cli/commands/abandon.d.ts +13 -0
  6. package/dist/cli/commands/abandon.d.ts.map +1 -0
  7. package/dist/cli/commands/abandon.js +15 -0
  8. package/dist/cli/commands/abandon.js.map +1 -0
  9. package/dist/cli/commands/init.d.ts.map +1 -1
  10. package/dist/cli/commands/init.js +90 -18
  11. package/dist/cli/commands/init.js.map +1 -1
  12. package/dist/cli/commands/pause.d.ts +13 -0
  13. package/dist/cli/commands/pause.d.ts.map +1 -0
  14. package/dist/cli/commands/pause.js +15 -0
  15. package/dist/cli/commands/pause.js.map +1 -0
  16. package/dist/cli/commands/qa.d.ts +54 -0
  17. package/dist/cli/commands/qa.d.ts.map +1 -0
  18. package/dist/cli/commands/qa.js +98 -0
  19. package/dist/cli/commands/qa.js.map +1 -0
  20. package/dist/cli/commands/resume.d.ts +12 -0
  21. package/dist/cli/commands/resume.d.ts.map +1 -0
  22. package/dist/cli/commands/resume.js +14 -0
  23. package/dist/cli/commands/resume.js.map +1 -0
  24. package/dist/cli/commands/status.d.ts +12 -0
  25. package/dist/cli/commands/status.d.ts.map +1 -0
  26. package/dist/cli/commands/status.js +23 -0
  27. package/dist/cli/commands/status.js.map +1 -0
  28. package/dist/cli/helpers/issue-tracker/ado.d.ts +57 -0
  29. package/dist/cli/helpers/issue-tracker/ado.d.ts.map +1 -0
  30. package/dist/cli/helpers/issue-tracker/ado.js +223 -0
  31. package/dist/cli/helpers/issue-tracker/ado.js.map +1 -0
  32. package/dist/cli/helpers/issue-tracker/github.d.ts +65 -0
  33. package/dist/cli/helpers/issue-tracker/github.d.ts.map +1 -0
  34. package/dist/cli/helpers/issue-tracker/github.js +284 -0
  35. package/dist/cli/helpers/issue-tracker/github.js.map +1 -0
  36. package/dist/cli/helpers/issue-tracker/index.d.ts +22 -0
  37. package/dist/cli/helpers/issue-tracker/index.d.ts.map +1 -0
  38. package/dist/cli/helpers/issue-tracker/index.js +270 -0
  39. package/dist/cli/helpers/issue-tracker/index.js.map +1 -0
  40. package/dist/cli/helpers/issue-tracker/jira.d.ts +61 -0
  41. package/dist/cli/helpers/issue-tracker/jira.d.ts.map +1 -0
  42. package/dist/cli/helpers/issue-tracker/jira.js +265 -0
  43. package/dist/cli/helpers/issue-tracker/jira.js.map +1 -0
  44. package/dist/cli/helpers/issue-tracker/types.d.ts +86 -0
  45. package/dist/cli/helpers/issue-tracker/types.d.ts.map +1 -0
  46. package/dist/cli/helpers/issue-tracker/types.js +16 -0
  47. package/dist/cli/helpers/issue-tracker/types.js.map +1 -0
  48. package/dist/cli/helpers/issue-tracker/utils.d.ts +103 -0
  49. package/dist/cli/helpers/issue-tracker/utils.d.ts.map +1 -0
  50. package/dist/cli/helpers/issue-tracker/utils.js +240 -0
  51. package/dist/cli/helpers/issue-tracker/utils.js.map +1 -0
  52. package/dist/core/increment/limits.d.ts +68 -0
  53. package/dist/core/increment/limits.d.ts.map +1 -0
  54. package/dist/core/increment/limits.js +224 -0
  55. package/dist/core/increment/limits.js.map +1 -0
  56. package/dist/core/increment/metadata-manager.d.ts +114 -0
  57. package/dist/core/increment/metadata-manager.d.ts.map +1 -0
  58. package/dist/core/increment/metadata-manager.js +320 -0
  59. package/dist/core/increment/metadata-manager.js.map +1 -0
  60. package/dist/core/increment/status-commands.d.ts +43 -0
  61. package/dist/core/increment/status-commands.d.ts.map +1 -0
  62. package/dist/core/increment/status-commands.js +277 -0
  63. package/dist/core/increment/status-commands.js.map +1 -0
  64. package/dist/core/plugin-detector.d.ts +1 -0
  65. package/dist/core/plugin-detector.d.ts.map +1 -1
  66. package/dist/core/plugin-detector.js +25 -0
  67. package/dist/core/plugin-detector.js.map +1 -1
  68. package/dist/core/qa/qa-runner.d.ts +16 -0
  69. package/dist/core/qa/qa-runner.d.ts.map +1 -0
  70. package/dist/core/qa/qa-runner.js +404 -0
  71. package/dist/core/qa/qa-runner.js.map +1 -0
  72. package/dist/core/qa/quality-gate-decider.d.ts +53 -0
  73. package/dist/core/qa/quality-gate-decider.d.ts.map +1 -0
  74. package/dist/core/qa/quality-gate-decider.js +268 -0
  75. package/dist/core/qa/quality-gate-decider.js.map +1 -0
  76. package/dist/core/qa/risk-calculator.d.ts +126 -0
  77. package/dist/core/qa/risk-calculator.d.ts.map +1 -0
  78. package/dist/core/qa/risk-calculator.js +247 -0
  79. package/dist/core/qa/risk-calculator.js.map +1 -0
  80. package/dist/core/qa/types.d.ts +315 -0
  81. package/dist/core/qa/types.d.ts.map +1 -0
  82. package/dist/core/qa/types.js +8 -0
  83. package/dist/core/qa/types.js.map +1 -0
  84. package/dist/core/types/config.d.ts +35 -0
  85. package/dist/core/types/config.d.ts.map +1 -1
  86. package/dist/core/types/config.js +16 -0
  87. package/dist/core/types/config.js.map +1 -1
  88. package/dist/core/types/increment-metadata.d.ts +120 -0
  89. package/dist/core/types/increment-metadata.d.ts.map +1 -0
  90. package/dist/core/types/increment-metadata.js +138 -0
  91. package/dist/core/types/increment-metadata.js.map +1 -0
  92. package/dist/hooks/lib/invoke-translator-skill.d.ts +60 -0
  93. package/dist/hooks/lib/invoke-translator-skill.d.ts.map +1 -0
  94. package/dist/hooks/lib/invoke-translator-skill.js +201 -0
  95. package/dist/hooks/lib/invoke-translator-skill.js.map +1 -0
  96. package/dist/hooks/lib/translate-file.d.ts +59 -0
  97. package/dist/hooks/lib/translate-file.d.ts.map +1 -0
  98. package/dist/hooks/lib/translate-file.js +350 -0
  99. package/dist/hooks/lib/translate-file.js.map +1 -0
  100. package/dist/locales/en/cli.json +3 -1
  101. package/dist/metrics/calculators/change-failure-rate.d.ts +22 -0
  102. package/dist/metrics/calculators/change-failure-rate.d.ts.map +1 -0
  103. package/dist/metrics/calculators/change-failure-rate.js +70 -0
  104. package/dist/metrics/calculators/change-failure-rate.js.map +1 -0
  105. package/dist/metrics/calculators/deployment-frequency.d.ts +20 -0
  106. package/dist/metrics/calculators/deployment-frequency.d.ts.map +1 -0
  107. package/dist/metrics/calculators/deployment-frequency.js +61 -0
  108. package/dist/metrics/calculators/deployment-frequency.js.map +1 -0
  109. package/dist/metrics/calculators/lead-time.d.ts +22 -0
  110. package/dist/metrics/calculators/lead-time.d.ts.map +1 -0
  111. package/dist/metrics/calculators/lead-time.js +82 -0
  112. package/dist/metrics/calculators/lead-time.js.map +1 -0
  113. package/dist/metrics/calculators/mttr.d.ts +21 -0
  114. package/dist/metrics/calculators/mttr.d.ts.map +1 -0
  115. package/dist/metrics/calculators/mttr.js +60 -0
  116. package/dist/metrics/calculators/mttr.js.map +1 -0
  117. package/dist/metrics/dora-calculator.d.ts +24 -0
  118. package/dist/metrics/dora-calculator.d.ts.map +1 -0
  119. package/dist/metrics/dora-calculator.js +104 -0
  120. package/dist/metrics/dora-calculator.js.map +1 -0
  121. package/dist/metrics/github-client.d.ts +51 -0
  122. package/dist/metrics/github-client.d.ts.map +1 -0
  123. package/dist/metrics/github-client.js +133 -0
  124. package/dist/metrics/github-client.js.map +1 -0
  125. package/dist/metrics/types.d.ts +112 -0
  126. package/dist/metrics/types.d.ts.map +1 -0
  127. package/dist/metrics/types.js +10 -0
  128. package/dist/metrics/types.js.map +1 -0
  129. package/dist/metrics/utils/percentile.d.ts +25 -0
  130. package/dist/metrics/utils/percentile.d.ts.map +1 -0
  131. package/dist/metrics/utils/percentile.js +46 -0
  132. package/dist/metrics/utils/percentile.js.map +1 -0
  133. package/dist/metrics/utils/tier-classifier.d.ts +61 -0
  134. package/dist/metrics/utils/tier-classifier.d.ts.map +1 -0
  135. package/dist/metrics/utils/tier-classifier.js +100 -0
  136. package/dist/metrics/utils/tier-classifier.js.map +1 -0
  137. package/dist/utils/auth-helpers.d.ts +58 -0
  138. package/dist/utils/auth-helpers.d.ts.map +1 -0
  139. package/dist/utils/auth-helpers.js +108 -0
  140. package/dist/utils/auth-helpers.js.map +1 -0
  141. package/dist/utils/env-file.d.ts +88 -0
  142. package/dist/utils/env-file.d.ts.map +1 -0
  143. package/dist/utils/env-file.js +180 -0
  144. package/dist/utils/env-file.js.map +1 -0
  145. package/dist/utils/plugin-detection.d.ts +50 -0
  146. package/dist/utils/plugin-detection.d.ts.map +1 -0
  147. package/dist/utils/plugin-detection.js +229 -0
  148. package/dist/utils/plugin-detection.js.map +1 -0
  149. package/dist/utils/secrets-loader.d.ts +88 -0
  150. package/dist/utils/secrets-loader.d.ts.map +1 -0
  151. package/dist/utils/secrets-loader.js +271 -0
  152. package/dist/utils/secrets-loader.js.map +1 -0
  153. package/dist/utils/translation.d.ts +187 -0
  154. package/dist/utils/translation.d.ts.map +1 -0
  155. package/dist/utils/translation.js +414 -0
  156. package/dist/utils/translation.js.map +1 -0
  157. package/package.json +28 -44
  158. package/plugins/specweave/.claude-plugin/plugin.json +3 -3
  159. package/plugins/specweave/agents/pm/AGENT.md +330 -54
  160. package/plugins/specweave/agents/test-aware-planner/AGENT.md +1035 -0
  161. package/plugins/specweave/agents/test-aware-planner/templates/README.md +118 -0
  162. package/plugins/specweave/agents/test-aware-planner/templates/task-non-testable.md.template +24 -0
  163. package/plugins/specweave/agents/test-aware-planner/templates/task-testable.md.template +53 -0
  164. package/plugins/specweave/agents/test-aware-planner/templates/tasks-frontmatter.md.template +11 -0
  165. package/plugins/specweave/commands/README.md +88 -163
  166. package/plugins/specweave/commands/specweave-abandon.md +314 -0
  167. package/plugins/specweave/commands/specweave-check-tests.md +546 -0
  168. package/plugins/specweave/commands/{do.md → specweave-do.md} +5 -7
  169. package/plugins/specweave/commands/{increment.md → specweave-increment.md} +231 -4
  170. package/plugins/specweave/commands/specweave-pause.md +189 -0
  171. package/plugins/specweave/commands/specweave-qa.md +245 -0
  172. package/plugins/specweave/commands/specweave-resume.md +216 -0
  173. package/plugins/specweave/commands/specweave-status.md +397 -0
  174. package/plugins/specweave/commands/specweave-sync-tasks.md +256 -0
  175. package/plugins/specweave/commands/{translate.md → specweave-translate.md} +3 -3
  176. package/plugins/specweave/commands/specweave-update-scope.md +351 -0
  177. package/plugins/specweave/commands/specweave.md +21 -21
  178. package/plugins/specweave/hooks/post-increment-planning.sh +335 -0
  179. package/plugins/specweave/hooks/post-task-completion.sh +141 -0
  180. package/plugins/specweave/skills/SKILLS-INDEX.md +1 -1
  181. package/plugins/specweave/skills/brownfield-analyzer/SKILL.md +9 -9
  182. package/plugins/specweave/skills/increment-planner/SKILL.md +400 -212
  183. package/plugins/specweave/skills/increment-quality-judge-v2/SKILL.md +499 -0
  184. package/plugins/specweave/skills/plugin-detector/SKILL.md +114 -1
  185. package/plugins/specweave/skills/project-kickstarter/SKILL.md +74 -1
  186. package/plugins/specweave/skills/{rfc-generator → spec-generator}/SKILL.md +22 -29
  187. package/plugins/specweave/skills/specweave-detector/SKILL.md +3 -3
  188. package/plugins/specweave/skills/specweave-framework/SKILL.md +2 -2
  189. package/plugins/specweave-ado/.claude-plugin/plugin.json +18 -4
  190. package/plugins/specweave-ado/agents/ado-manager/AGENT.md +426 -0
  191. package/plugins/specweave-ado/commands/close-workitem.md +52 -0
  192. package/plugins/specweave-ado/commands/create-workitem.md +53 -0
  193. package/plugins/specweave-ado/commands/status.md +53 -0
  194. package/plugins/specweave-ado/commands/sync.md +55 -0
  195. package/plugins/specweave-ado/lib/ado-client.ts +361 -0
  196. package/plugins/specweave-ado/reference/ado-specweave-mapping.md +552 -0
  197. package/plugins/specweave-ado/skills/ado-sync/SKILL.md +344 -193
  198. package/plugins/specweave-docs/skills/docusaurus/SKILL.md +73 -0
  199. package/plugins/specweave-github/agents/github-manager/AGENT.md +49 -0
  200. package/plugins/specweave-github/commands/{github-close-issue.md → close-issue.md} +1 -1
  201. package/plugins/specweave-github/commands/{github-create-issue.md → create-issue.md} +1 -1
  202. package/plugins/specweave-github/commands/{github-status.md → status.md} +1 -1
  203. package/plugins/specweave-github/commands/{github-sync-tasks.md → sync-tasks.md} +1 -1
  204. package/plugins/specweave-github/commands/{github-sync.md → sync.md} +1 -1
  205. package/plugins/specweave-github/reference/github-specweave-mapping.md +377 -0
  206. package/plugins/specweave-github/skills/github-sync/SKILL.md +11 -3
  207. package/plugins/specweave-infrastructure/commands/{specweave.monitor-setup.md → monitor-setup.md} +5 -0
  208. package/plugins/specweave-infrastructure/commands/{specweave.slo-implement.md → slo-implement.md} +5 -0
  209. package/plugins/specweave-jira/agents/jira-manager/AGENT.md +380 -0
  210. package/plugins/specweave-jira/commands/{specweave.sync-jira.md → sync.md} +1 -1
  211. package/plugins/specweave-jira/reference/jira-specweave-mapping.md +508 -0
  212. package/plugins/specweave-ml/commands/ml-deploy.md +1 -1
  213. package/plugins/specweave-ml/commands/ml-evaluate.md +1 -1
  214. package/plugins/specweave-ml/commands/ml-explain.md +1 -1
  215. package/plugins/specweave-ml/commands/{specweave.ml-pipeline.md → ml-pipeline.md} +5 -0
  216. package/src/templates/AGENTS.md.template +331 -31
  217. package/src/templates/CLAUDE.md.template +36 -21
  218. package/src/templates/COMPLETION-REPORT.template.md +128 -0
  219. package/src/templates/README.md.template +17 -16
  220. package/src/templates/docs/README.md +11 -9
  221. package/src/templates/docs/spec-template.md +229 -0
  222. package/plugins/specweave/commands/inc.md +0 -85
  223. package/plugins/specweave/commands/list-increments.md +0 -180
  224. package/src/adapters/README.md +0 -275
  225. package/src/adapters/adapter-base.ts +0 -182
  226. package/src/adapters/adapter-interface.ts +0 -166
  227. package/src/adapters/adapter-loader.ts +0 -256
  228. package/src/adapters/agents-md-generator.ts +0 -228
  229. package/src/adapters/claude/README.md +0 -233
  230. package/src/adapters/claude/adapter.ts +0 -468
  231. package/src/adapters/claude-md-generator.ts +0 -377
  232. package/src/adapters/codex/README.md +0 -105
  233. package/src/adapters/codex/adapter.ts +0 -333
  234. package/src/adapters/cursor/.cursor/context/docs-context.md +0 -62
  235. package/src/adapters/cursor/.cursor/context/increments-context.md +0 -71
  236. package/src/adapters/cursor/.cursor/context/strategy-context.md +0 -73
  237. package/src/adapters/cursor/.cursor/context/tests-context.md +0 -89
  238. package/src/adapters/cursor/README.md +0 -283
  239. package/src/adapters/cursor/adapter.ts +0 -451
  240. package/src/adapters/doc-generator.ts +0 -331
  241. package/src/adapters/gemini/README.md +0 -97
  242. package/src/adapters/gemini/adapter.ts +0 -298
  243. package/src/adapters/generic/README.md +0 -277
  244. package/src/adapters/generic/adapter.ts +0 -378
  245. package/src/adapters/registry.yaml +0 -187
  246. /package/plugins/specweave/commands/{costs.md → specweave-costs.md} +0 -0
  247. /package/plugins/specweave/commands/{done.md → specweave-done.md} +0 -0
  248. /package/plugins/specweave/commands/{next.md → specweave-next.md} +0 -0
  249. /package/plugins/specweave/commands/{progress.md → specweave-progress.md} +0 -0
  250. /package/plugins/specweave/commands/{sync-docs.md → specweave-sync-docs.md} +0 -0
  251. /package/plugins/specweave/commands/{tdd-cycle.md → specweave-tdd-cycle.md} +0 -0
  252. /package/plugins/specweave/commands/{tdd-green.md → specweave-tdd-green.md} +0 -0
  253. /package/plugins/specweave/commands/{tdd-red.md → specweave-tdd-red.md} +0 -0
  254. /package/plugins/specweave/commands/{tdd-refactor.md → specweave-tdd-refactor.md} +0 -0
  255. /package/plugins/specweave/commands/{validate.md → specweave-validate.md} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/cli/helpers/issue-tracker/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Issue Tracker Integration - Main Coordinator
3
+ *
4
+ * Guides users through issue tracker setup during `specweave init`
5
+ * Supports GitHub, Jira, and Azure DevOps
6
+ *
7
+ * @module cli/helpers/issue-tracker
8
+ */
9
+ import type { SetupOptions } from './types.js';
10
+ /**
11
+ * Setup issue tracker integration during init
12
+ *
13
+ * Main entry point called from init.ts
14
+ * Guides user through tracker selection and setup
15
+ *
16
+ * @param options - Setup options
17
+ * @returns True if setup completed successfully
18
+ */
19
+ export declare function setupIssueTracker(options: SetupOptions): Promise<boolean>;
20
+ export * from './types.js';
21
+ export * from './utils.js';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/helpers/issue-tracker/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAoC,YAAY,EAAE,MAAM,YAAY,CAAC;AAyCjF;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CA+H/E;AAmKD,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Issue Tracker Integration - Main Coordinator
3
+ *
4
+ * Guides users through issue tracker setup during `specweave init`
5
+ * Supports GitHub, Jira, and Azure DevOps
6
+ *
7
+ * @module cli/helpers/issue-tracker
8
+ */
9
+ import chalk from 'chalk';
10
+ import inquirer from 'inquirer';
11
+ import ora from 'ora';
12
+ import { detectDefaultTracker, getTrackerDisplayName, installTrackerPlugin, isClaudeCliAvailable } from './utils.js';
13
+ import { readEnvFile, writeEnvFile, createEnvFromTemplate, updateEnvVars, ensureEnvGitignored } from '../../../utils/env-file.js';
14
+ import { getLocaleManager } from '../../../core/i18n/locale-manager.js';
15
+ // GitHub
16
+ import { checkExistingGitHubCredentials, promptGitHubCredentials, validateGitHubConnection, getGitHubEnvVars, showGitHubSetupComplete, showGitHubSetupSkipped } from './github.js';
17
+ // Jira
18
+ import { checkExistingJiraCredentials, promptJiraCredentials, validateJiraConnection, getJiraEnvVars, showJiraSetupComplete, showJiraSetupSkipped } from './jira.js';
19
+ // Azure DevOps
20
+ import { checkExistingAzureDevOpsCredentials, promptAzureDevOpsCredentials, validateAzureDevOpsConnection, getAzureDevOpsEnvVars, showAzureDevOpsSetupComplete, showAzureDevOpsSetupSkipped } from './ado.js';
21
+ /**
22
+ * Setup issue tracker integration during init
23
+ *
24
+ * Main entry point called from init.ts
25
+ * Guides user through tracker selection and setup
26
+ *
27
+ * @param options - Setup options
28
+ * @returns True if setup completed successfully
29
+ */
30
+ export async function setupIssueTracker(options) {
31
+ const { projectPath, language, maxRetries = 3 } = options;
32
+ const locale = getLocaleManager(language);
33
+ // Check if running in CI/non-interactive environment
34
+ const isCI = process.env.CI === 'true' ||
35
+ process.env.GITHUB_ACTIONS === 'true' ||
36
+ process.env.GITLAB_CI === 'true' ||
37
+ process.env.CIRCLECI === 'true' ||
38
+ !process.stdin.isTTY;
39
+ if (isCI) {
40
+ // In CI, skip issue tracker setup (non-interactive)
41
+ console.log('');
42
+ console.log(chalk.gray('ā­ļø CI environment detected - skipping issue tracker setup'));
43
+ console.log(chalk.gray(' You can configure later via /plugin install\n'));
44
+ return true;
45
+ }
46
+ console.log('');
47
+ console.log(chalk.cyan.bold('šŸŽÆ Issue Tracker Integration'));
48
+ console.log('');
49
+ // Step 1: Ask which tracker to use
50
+ const defaultTracker = detectDefaultTracker(projectPath);
51
+ const { tracker } = await inquirer.prompt([{
52
+ type: 'list',
53
+ name: 'tracker',
54
+ message: 'Which issue tracker do you use?',
55
+ choices: [
56
+ {
57
+ name: `šŸ™ GitHub Issues ${defaultTracker === 'github' ? '(detected)' : ''}`,
58
+ value: 'github'
59
+ },
60
+ {
61
+ name: `šŸ“‹ Jira`,
62
+ value: 'jira'
63
+ },
64
+ {
65
+ name: `šŸ”· Azure DevOps ${defaultTracker === 'ado' ? '(detected)' : ''}`,
66
+ value: 'ado'
67
+ },
68
+ {
69
+ name: 'ā­ļø None (skip)',
70
+ value: 'none'
71
+ }
72
+ ],
73
+ default: defaultTracker
74
+ }]);
75
+ if (tracker === 'none') {
76
+ console.log(chalk.gray('\nā­ļø Skipping issue tracker setup'));
77
+ console.log(chalk.gray(' You can configure later via /plugin install\n'));
78
+ return true;
79
+ }
80
+ // Step 2: Check for existing credentials
81
+ const existing = await checkExistingCredentials(tracker, projectPath);
82
+ if (existing) {
83
+ console.log(chalk.green(`\nāœ“ Found existing credentials (${existing.source})`));
84
+ const { useExisting } = await inquirer.prompt([{
85
+ type: 'confirm',
86
+ name: 'useExisting',
87
+ message: `Use existing ${getTrackerDisplayName(tracker)} credentials?`,
88
+ default: true
89
+ }]);
90
+ if (useExisting) {
91
+ // Validate existing credentials
92
+ const validationResult = await validateConnection(tracker, existing.credentials, maxRetries);
93
+ if (validationResult.success) {
94
+ // Install plugin
95
+ await installPlugin(tracker, language);
96
+ showSetupComplete(tracker, language);
97
+ return true;
98
+ }
99
+ else {
100
+ console.log(chalk.red(`\nāŒ Validation failed: ${validationResult.error}`));
101
+ console.log(chalk.yellow(' Let\'s configure new credentials\n'));
102
+ // Fall through to prompt for new credentials
103
+ }
104
+ }
105
+ }
106
+ // Step 3: Prompt for credentials
107
+ const credentials = await promptCredentials(tracker, language);
108
+ if (!credentials) {
109
+ showSetupSkipped(tracker, language);
110
+ return false;
111
+ }
112
+ // Step 4: Validate connection
113
+ const validationResult = await validateConnection(tracker, credentials, maxRetries);
114
+ if (!validationResult.success) {
115
+ console.log(chalk.red(`\nāŒ Connection failed: ${validationResult.error}\n`));
116
+ const { retry } = await inquirer.prompt([{
117
+ type: 'confirm',
118
+ name: 'retry',
119
+ message: 'Try again?',
120
+ default: true
121
+ }]);
122
+ if (retry) {
123
+ // Recursive retry (will respect maxRetries in validation)
124
+ return setupIssueTracker(options);
125
+ }
126
+ showSetupSkipped(tracker, language);
127
+ return false;
128
+ }
129
+ // Step 5: Save credentials to .env
130
+ await saveCredentials(projectPath, tracker, credentials);
131
+ // Step 6: Install plugin
132
+ await installPlugin(tracker, language);
133
+ // Step 7: Show success message
134
+ showSetupComplete(tracker, language);
135
+ return true;
136
+ }
137
+ /**
138
+ * Check for existing credentials
139
+ */
140
+ async function checkExistingCredentials(tracker, projectPath) {
141
+ switch (tracker) {
142
+ case 'github':
143
+ return checkExistingGitHubCredentials(projectPath);
144
+ case 'jira':
145
+ return checkExistingJiraCredentials(projectPath);
146
+ case 'ado':
147
+ return checkExistingAzureDevOpsCredentials(projectPath);
148
+ default:
149
+ return null;
150
+ }
151
+ }
152
+ /**
153
+ * Prompt for credentials
154
+ */
155
+ async function promptCredentials(tracker, language) {
156
+ switch (tracker) {
157
+ case 'github':
158
+ return promptGitHubCredentials(language);
159
+ case 'jira':
160
+ return promptJiraCredentials(language);
161
+ case 'ado':
162
+ return promptAzureDevOpsCredentials(language);
163
+ default:
164
+ return null;
165
+ }
166
+ }
167
+ /**
168
+ * Validate connection
169
+ */
170
+ async function validateConnection(tracker, credentials, maxRetries) {
171
+ switch (tracker) {
172
+ case 'github':
173
+ return validateGitHubConnection(credentials, maxRetries);
174
+ case 'jira':
175
+ return validateJiraConnection(credentials, maxRetries);
176
+ case 'ado':
177
+ return validateAzureDevOpsConnection(credentials, maxRetries);
178
+ default:
179
+ return { success: false, error: 'Unknown tracker' };
180
+ }
181
+ }
182
+ /**
183
+ * Save credentials to .env file
184
+ */
185
+ async function saveCredentials(projectPath, tracker, credentials) {
186
+ // Read existing .env or create from template
187
+ let envContent = readEnvFile(projectPath);
188
+ if (!envContent) {
189
+ envContent = createEnvFromTemplate(projectPath);
190
+ }
191
+ // Get tracker-specific env vars
192
+ let envVars = [];
193
+ switch (tracker) {
194
+ case 'github':
195
+ envVars = getGitHubEnvVars(credentials);
196
+ break;
197
+ case 'jira':
198
+ envVars = getJiraEnvVars(credentials);
199
+ break;
200
+ case 'ado':
201
+ envVars = getAzureDevOpsEnvVars(credentials);
202
+ break;
203
+ }
204
+ // Update .env content
205
+ const updatedContent = updateEnvVars(envContent, envVars);
206
+ // Write .env file
207
+ writeEnvFile(projectPath, updatedContent);
208
+ // Ensure .env is gitignored
209
+ ensureEnvGitignored(projectPath);
210
+ console.log(chalk.green('āœ“ Credentials saved to .env (gitignored)'));
211
+ }
212
+ /**
213
+ * Install tracker plugin
214
+ */
215
+ async function installPlugin(tracker, language) {
216
+ const spinner = ora(`Installing ${getTrackerDisplayName(tracker)} plugin...`).start();
217
+ // Check if Claude CLI is available
218
+ if (!isClaudeCliAvailable()) {
219
+ spinner.warn('Claude CLI not found');
220
+ console.log(chalk.yellow('\nšŸ“¦ Manual plugin installation required:'));
221
+ console.log(chalk.white(` /plugin install specweave-${tracker}@specweave\n`));
222
+ return;
223
+ }
224
+ // Install plugin
225
+ const success = installTrackerPlugin(tracker);
226
+ if (success) {
227
+ spinner.succeed(`${getTrackerDisplayName(tracker)} plugin installed`);
228
+ }
229
+ else {
230
+ spinner.fail(`Could not auto-install plugin`);
231
+ console.log(chalk.yellow('\nšŸ“¦ Manual plugin installation:'));
232
+ console.log(chalk.white(` /plugin install specweave-${tracker}@specweave\n`));
233
+ }
234
+ }
235
+ /**
236
+ * Show setup complete message
237
+ */
238
+ function showSetupComplete(tracker, language) {
239
+ switch (tracker) {
240
+ case 'github':
241
+ showGitHubSetupComplete(language);
242
+ break;
243
+ case 'jira':
244
+ showJiraSetupComplete(language);
245
+ break;
246
+ case 'ado':
247
+ showAzureDevOpsSetupComplete(language);
248
+ break;
249
+ }
250
+ }
251
+ /**
252
+ * Show setup skipped message
253
+ */
254
+ function showSetupSkipped(tracker, language) {
255
+ switch (tracker) {
256
+ case 'github':
257
+ showGitHubSetupSkipped(language);
258
+ break;
259
+ case 'jira':
260
+ showJiraSetupSkipped(language);
261
+ break;
262
+ case 'ado':
263
+ showAzureDevOpsSetupSkipped(language);
264
+ break;
265
+ }
266
+ }
267
+ // Export all types and utilities for external use
268
+ export * from './types.js';
269
+ export * from './utils.js';
270
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/helpers/issue-tracker/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Jira Integration for Issue Tracker Setup
3
+ *
4
+ * Handles Jira Cloud and Jira Server/Data Center authentication
5
+ *
6
+ * @module cli/helpers/issue-tracker/jira
7
+ */
8
+ import type { JiraCredentials, ExistingCredentials, ValidationResult } from './types.js';
9
+ import type { SupportedLanguage } from '../../../core/i18n/types.js';
10
+ /**
11
+ * Check for existing Jira credentials
12
+ *
13
+ * @param projectPath - Path to project root
14
+ * @returns Existing credentials or null
15
+ */
16
+ export declare function checkExistingJiraCredentials(projectPath: string): Promise<ExistingCredentials | null>;
17
+ /**
18
+ * Prompt user for Jira credentials
19
+ *
20
+ * Supports:
21
+ * - Jira Cloud (atlassian.net)
22
+ * - Jira Server/Data Center (self-hosted)
23
+ *
24
+ * @param language - User's language
25
+ * @returns Credentials or null if skipped
26
+ */
27
+ export declare function promptJiraCredentials(language: SupportedLanguage): Promise<JiraCredentials | null>;
28
+ /**
29
+ * Validate Jira connection
30
+ *
31
+ * Tests authentication and returns user information
32
+ * Handles rate limiting with retry logic
33
+ *
34
+ * @param credentials - Jira credentials
35
+ * @param maxRetries - Maximum retry attempts (default: 3)
36
+ * @returns Validation result
37
+ */
38
+ export declare function validateJiraConnection(credentials: JiraCredentials, maxRetries?: number): Promise<ValidationResult>;
39
+ /**
40
+ * Get Jira environment variables for .env file
41
+ *
42
+ * @param credentials - Jira credentials
43
+ * @returns Array of key-value pairs for .env
44
+ */
45
+ export declare function getJiraEnvVars(credentials: JiraCredentials): Array<{
46
+ key: string;
47
+ value: string;
48
+ }>;
49
+ /**
50
+ * Show Jira setup complete message
51
+ *
52
+ * @param language - User's language
53
+ */
54
+ export declare function showJiraSetupComplete(language: SupportedLanguage): void;
55
+ /**
56
+ * Show Jira setup skipped message
57
+ *
58
+ * @param language - User's language
59
+ */
60
+ export declare function showJiraSetupSkipped(language: SupportedLanguage): void;
61
+ //# sourceMappingURL=jira.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.d.ts","sourceRoot":"","sources":["../../../../src/cli/helpers/issue-tracker/jira.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAMpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIrE;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA+BrC;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAsGjC;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,eAAe,EAC5B,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAkE3B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAalG;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CASvE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAOtE"}
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Jira Integration for Issue Tracker Setup
3
+ *
4
+ * Handles Jira Cloud and Jira Server/Data Center authentication
5
+ *
6
+ * @module cli/helpers/issue-tracker/jira
7
+ */
8
+ import chalk from 'chalk';
9
+ import inquirer from 'inquirer';
10
+ import ora from 'ora';
11
+ import { getJiraAuth } from '../../../utils/auth-helpers.js';
12
+ import { parseEnvFile, readEnvFile } from '../../../utils/env-file.js';
13
+ import { isValidEmail, retryWithBackoff, checkRateLimit } from './utils.js';
14
+ import { getLocaleManager } from '../../../core/i18n/locale-manager.js';
15
+ import { RateLimitError } from './types.js';
16
+ /**
17
+ * Check for existing Jira credentials
18
+ *
19
+ * @param projectPath - Path to project root
20
+ * @returns Existing credentials or null
21
+ */
22
+ export async function checkExistingJiraCredentials(projectPath) {
23
+ // 1. Check project .env file
24
+ const envContent = readEnvFile(projectPath);
25
+ if (envContent) {
26
+ const parsed = parseEnvFile(envContent);
27
+ if (parsed.JIRA_API_TOKEN && parsed.JIRA_EMAIL && parsed.JIRA_DOMAIN) {
28
+ return {
29
+ source: '.env',
30
+ credentials: {
31
+ token: parsed.JIRA_API_TOKEN,
32
+ email: parsed.JIRA_EMAIL,
33
+ domain: parsed.JIRA_DOMAIN,
34
+ instanceType: 'cloud' // Assume cloud unless specified
35
+ }
36
+ };
37
+ }
38
+ }
39
+ // 2. Check environment variables
40
+ const auth = getJiraAuth();
41
+ if (auth) {
42
+ return {
43
+ source: 'env-vars',
44
+ credentials: {
45
+ ...auth,
46
+ instanceType: 'cloud'
47
+ }
48
+ };
49
+ }
50
+ return null;
51
+ }
52
+ /**
53
+ * Prompt user for Jira credentials
54
+ *
55
+ * Supports:
56
+ * - Jira Cloud (atlassian.net)
57
+ * - Jira Server/Data Center (self-hosted)
58
+ *
59
+ * @param language - User's language
60
+ * @returns Credentials or null if skipped
61
+ */
62
+ export async function promptJiraCredentials(language) {
63
+ const locale = getLocaleManager(language);
64
+ console.log(chalk.white('\nšŸ“‹ Jira Integration Setup\n'));
65
+ console.log(chalk.gray('SpecWeave will sync increments with Jira Issues.\n'));
66
+ // Step 1: Ask about instance type (Cloud vs Server)
67
+ const { instanceType } = await inquirer.prompt([{
68
+ type: 'list',
69
+ name: 'instanceType',
70
+ message: 'Which Jira instance are you using?',
71
+ choices: [
72
+ { name: 'Jira Cloud (*.atlassian.net)', value: 'cloud' },
73
+ { name: 'Jira Server/Data Center (self-hosted)', value: 'server' }
74
+ ],
75
+ default: 'cloud'
76
+ }]);
77
+ // Step 2: Show setup instructions
78
+ console.log(chalk.cyan('\nšŸ“‹ Quick Setup:'));
79
+ if (instanceType === 'cloud') {
80
+ console.log(chalk.gray(' 1. Go to: https://id.atlassian.com/manage-profile/security/api-tokens'));
81
+ console.log(chalk.gray(' 2. Click "Create API token"'));
82
+ console.log(chalk.gray(' 3. Label: "SpecWeave - [your-project]"'));
83
+ console.log(chalk.gray(' 4. Copy the token\n'));
84
+ }
85
+ else {
86
+ console.log(chalk.gray(' 1. Go to your Jira settings → Personal Access Tokens'));
87
+ console.log(chalk.gray(' 2. Create new token with "Read/Write" permissions'));
88
+ console.log(chalk.gray(' 3. Label: "SpecWeave - [your-project]"'));
89
+ console.log(chalk.gray(' 4. Copy the token\n'));
90
+ }
91
+ const { continueSetup } = await inquirer.prompt([{
92
+ type: 'confirm',
93
+ name: 'continueSetup',
94
+ message: 'Continue with Jira setup?',
95
+ default: true
96
+ }]);
97
+ if (!continueSetup) {
98
+ return null;
99
+ }
100
+ // Step 3: Collect credentials
101
+ const questions = [
102
+ {
103
+ type: 'input',
104
+ name: 'domain',
105
+ message: instanceType === 'cloud'
106
+ ? 'Jira domain (e.g., your-company.atlassian.net):'
107
+ : 'Jira Server URL (e.g., jira.company.com):',
108
+ validate: (input) => {
109
+ if (!input || input.trim() === '') {
110
+ return 'Domain cannot be empty';
111
+ }
112
+ // Prevent SSRF attacks - block localhost and internal IP addresses
113
+ if (/localhost|127\.0\.0\.1|192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[01])\./i.test(input)) {
114
+ return 'Internal IP addresses and localhost are not allowed';
115
+ }
116
+ // For cloud, suggest .atlassian.net but don't enforce (user might have custom domain)
117
+ if (instanceType === 'cloud' && !input.includes('.')) {
118
+ return 'Please enter a valid domain (e.g., your-company.atlassian.net)';
119
+ }
120
+ return true;
121
+ }
122
+ },
123
+ {
124
+ type: 'input',
125
+ name: 'email',
126
+ message: 'Your Jira email:',
127
+ validate: (input) => {
128
+ if (!isValidEmail(input)) {
129
+ return 'Please enter a valid email address';
130
+ }
131
+ return true;
132
+ }
133
+ },
134
+ {
135
+ type: 'password',
136
+ name: 'token',
137
+ message: 'Paste your Jira API token:',
138
+ mask: '*',
139
+ validate: (input) => {
140
+ if (!input || input.length === 0) {
141
+ return 'Token cannot be empty';
142
+ }
143
+ return true;
144
+ }
145
+ }
146
+ ];
147
+ const answers = await inquirer.prompt(questions);
148
+ return {
149
+ token: answers.token,
150
+ email: answers.email,
151
+ domain: answers.domain,
152
+ instanceType: instanceType
153
+ };
154
+ }
155
+ /**
156
+ * Validate Jira connection
157
+ *
158
+ * Tests authentication and returns user information
159
+ * Handles rate limiting with retry logic
160
+ *
161
+ * @param credentials - Jira credentials
162
+ * @param maxRetries - Maximum retry attempts (default: 3)
163
+ * @returns Validation result
164
+ */
165
+ export async function validateJiraConnection(credentials, maxRetries = 3) {
166
+ const spinner = ora('Testing connection...').start();
167
+ try {
168
+ const result = await retryWithBackoff(async () => {
169
+ // Determine API endpoint based on instance type
170
+ const apiBase = credentials.instanceType === 'cloud'
171
+ ? `https://${credentials.domain}/rest/api/3`
172
+ : `https://${credentials.domain}/rest/api/2`;
173
+ const userEndpoint = `${apiBase}/myself`;
174
+ // Basic auth header
175
+ const auth = Buffer.from(`${credentials.email}:${credentials.token}`).toString('base64');
176
+ const response = await fetch(userEndpoint, {
177
+ headers: {
178
+ 'Authorization': `Basic ${auth}`,
179
+ 'Accept': 'application/json'
180
+ }
181
+ });
182
+ // Check for rate limiting
183
+ const rateLimitInfo = checkRateLimit(response);
184
+ if (rateLimitInfo) {
185
+ throw new RateLimitError('Jira API rate limit exceeded', rateLimitInfo);
186
+ }
187
+ if (!response.ok) {
188
+ const errorText = await response.text();
189
+ let errorMessage = 'Authentication failed';
190
+ if (response.status === 401) {
191
+ errorMessage = 'Invalid credentials (check email and token)';
192
+ }
193
+ else if (response.status === 403) {
194
+ errorMessage = 'Access forbidden (check token permissions)';
195
+ }
196
+ else if (response.status === 404) {
197
+ errorMessage = 'Jira instance not found (check domain)';
198
+ }
199
+ else {
200
+ errorMessage = `HTTP ${response.status}: ${errorText}`;
201
+ }
202
+ throw new Error(errorMessage);
203
+ }
204
+ const user = await response.json();
205
+ return user;
206
+ }, maxRetries);
207
+ spinner.succeed(`Connected to Jira as ${result.displayName || result.name}`);
208
+ return {
209
+ success: true,
210
+ username: result.displayName || result.name
211
+ };
212
+ }
213
+ catch (error) {
214
+ spinner.fail('Jira authentication failed');
215
+ return {
216
+ success: false,
217
+ error: error.message || 'Unknown error'
218
+ };
219
+ }
220
+ }
221
+ /**
222
+ * Get Jira environment variables for .env file
223
+ *
224
+ * @param credentials - Jira credentials
225
+ * @returns Array of key-value pairs for .env
226
+ */
227
+ export function getJiraEnvVars(credentials) {
228
+ const vars = [
229
+ { key: 'JIRA_API_TOKEN', value: credentials.token },
230
+ { key: 'JIRA_EMAIL', value: credentials.email },
231
+ { key: 'JIRA_DOMAIN', value: credentials.domain }
232
+ ];
233
+ // Add Server-specific variables if needed
234
+ if (credentials.instanceType === 'server') {
235
+ vars.push({ key: 'JIRA_INSTANCE_TYPE', value: 'server' });
236
+ }
237
+ return vars;
238
+ }
239
+ /**
240
+ * Show Jira setup complete message
241
+ *
242
+ * @param language - User's language
243
+ */
244
+ export function showJiraSetupComplete(language) {
245
+ const locale = getLocaleManager(language);
246
+ console.log(chalk.green.bold('\nāœ… Jira integration complete!\n'));
247
+ console.log(chalk.white('Available commands:'));
248
+ console.log(chalk.gray(' /specweave-jira:sync'));
249
+ console.log(chalk.gray(' /specweave-jira:status\n'));
250
+ console.log(chalk.cyan('šŸ’” Tip: Use /specweave:inc "feature" to create an increment'));
251
+ console.log(chalk.gray(' It will automatically sync to Jira Issues!\n'));
252
+ }
253
+ /**
254
+ * Show Jira setup skipped message
255
+ *
256
+ * @param language - User's language
257
+ */
258
+ export function showJiraSetupSkipped(language) {
259
+ const locale = getLocaleManager(language);
260
+ console.log(chalk.yellow('\nā­ļø Skipped Jira setup\n'));
261
+ console.log(chalk.white('You can configure later:'));
262
+ console.log(chalk.gray(' 1. Add JIRA_API_TOKEN, JIRA_EMAIL, JIRA_DOMAIN to .env'));
263
+ console.log(chalk.gray(' 2. Install plugin: /plugin install specweave-jira@specweave\n'));
264
+ }
265
+ //# sourceMappingURL=jira.js.map