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.
- package/.claude-plugin/README.md +1 -1
- package/CLAUDE.md +903 -99
- package/README.md +143 -207
- package/bin/specweave.js +67 -0
- package/dist/cli/commands/abandon.d.ts +13 -0
- package/dist/cli/commands/abandon.d.ts.map +1 -0
- package/dist/cli/commands/abandon.js +15 -0
- package/dist/cli/commands/abandon.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +90 -18
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/pause.d.ts +13 -0
- package/dist/cli/commands/pause.d.ts.map +1 -0
- package/dist/cli/commands/pause.js +15 -0
- package/dist/cli/commands/pause.js.map +1 -0
- package/dist/cli/commands/qa.d.ts +54 -0
- package/dist/cli/commands/qa.d.ts.map +1 -0
- package/dist/cli/commands/qa.js +98 -0
- package/dist/cli/commands/qa.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +12 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +14 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +23 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/ado.d.ts +57 -0
- package/dist/cli/helpers/issue-tracker/ado.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/ado.js +223 -0
- package/dist/cli/helpers/issue-tracker/ado.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/github.d.ts +65 -0
- package/dist/cli/helpers/issue-tracker/github.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/github.js +284 -0
- package/dist/cli/helpers/issue-tracker/github.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/index.d.ts +22 -0
- package/dist/cli/helpers/issue-tracker/index.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/index.js +270 -0
- package/dist/cli/helpers/issue-tracker/index.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/jira.d.ts +61 -0
- package/dist/cli/helpers/issue-tracker/jira.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/jira.js +265 -0
- package/dist/cli/helpers/issue-tracker/jira.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/types.d.ts +86 -0
- package/dist/cli/helpers/issue-tracker/types.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/types.js +16 -0
- package/dist/cli/helpers/issue-tracker/types.js.map +1 -0
- package/dist/cli/helpers/issue-tracker/utils.d.ts +103 -0
- package/dist/cli/helpers/issue-tracker/utils.d.ts.map +1 -0
- package/dist/cli/helpers/issue-tracker/utils.js +240 -0
- package/dist/cli/helpers/issue-tracker/utils.js.map +1 -0
- package/dist/core/increment/limits.d.ts +68 -0
- package/dist/core/increment/limits.d.ts.map +1 -0
- package/dist/core/increment/limits.js +224 -0
- package/dist/core/increment/limits.js.map +1 -0
- package/dist/core/increment/metadata-manager.d.ts +114 -0
- package/dist/core/increment/metadata-manager.d.ts.map +1 -0
- package/dist/core/increment/metadata-manager.js +320 -0
- package/dist/core/increment/metadata-manager.js.map +1 -0
- package/dist/core/increment/status-commands.d.ts +43 -0
- package/dist/core/increment/status-commands.d.ts.map +1 -0
- package/dist/core/increment/status-commands.js +277 -0
- package/dist/core/increment/status-commands.js.map +1 -0
- package/dist/core/plugin-detector.d.ts +1 -0
- package/dist/core/plugin-detector.d.ts.map +1 -1
- package/dist/core/plugin-detector.js +25 -0
- package/dist/core/plugin-detector.js.map +1 -1
- package/dist/core/qa/qa-runner.d.ts +16 -0
- package/dist/core/qa/qa-runner.d.ts.map +1 -0
- package/dist/core/qa/qa-runner.js +404 -0
- package/dist/core/qa/qa-runner.js.map +1 -0
- package/dist/core/qa/quality-gate-decider.d.ts +53 -0
- package/dist/core/qa/quality-gate-decider.d.ts.map +1 -0
- package/dist/core/qa/quality-gate-decider.js +268 -0
- package/dist/core/qa/quality-gate-decider.js.map +1 -0
- package/dist/core/qa/risk-calculator.d.ts +126 -0
- package/dist/core/qa/risk-calculator.d.ts.map +1 -0
- package/dist/core/qa/risk-calculator.js +247 -0
- package/dist/core/qa/risk-calculator.js.map +1 -0
- package/dist/core/qa/types.d.ts +315 -0
- package/dist/core/qa/types.d.ts.map +1 -0
- package/dist/core/qa/types.js +8 -0
- package/dist/core/qa/types.js.map +1 -0
- package/dist/core/types/config.d.ts +35 -0
- package/dist/core/types/config.d.ts.map +1 -1
- package/dist/core/types/config.js +16 -0
- package/dist/core/types/config.js.map +1 -1
- package/dist/core/types/increment-metadata.d.ts +120 -0
- package/dist/core/types/increment-metadata.d.ts.map +1 -0
- package/dist/core/types/increment-metadata.js +138 -0
- package/dist/core/types/increment-metadata.js.map +1 -0
- package/dist/hooks/lib/invoke-translator-skill.d.ts +60 -0
- package/dist/hooks/lib/invoke-translator-skill.d.ts.map +1 -0
- package/dist/hooks/lib/invoke-translator-skill.js +201 -0
- package/dist/hooks/lib/invoke-translator-skill.js.map +1 -0
- package/dist/hooks/lib/translate-file.d.ts +59 -0
- package/dist/hooks/lib/translate-file.d.ts.map +1 -0
- package/dist/hooks/lib/translate-file.js +350 -0
- package/dist/hooks/lib/translate-file.js.map +1 -0
- package/dist/locales/en/cli.json +3 -1
- package/dist/metrics/calculators/change-failure-rate.d.ts +22 -0
- package/dist/metrics/calculators/change-failure-rate.d.ts.map +1 -0
- package/dist/metrics/calculators/change-failure-rate.js +70 -0
- package/dist/metrics/calculators/change-failure-rate.js.map +1 -0
- package/dist/metrics/calculators/deployment-frequency.d.ts +20 -0
- package/dist/metrics/calculators/deployment-frequency.d.ts.map +1 -0
- package/dist/metrics/calculators/deployment-frequency.js +61 -0
- package/dist/metrics/calculators/deployment-frequency.js.map +1 -0
- package/dist/metrics/calculators/lead-time.d.ts +22 -0
- package/dist/metrics/calculators/lead-time.d.ts.map +1 -0
- package/dist/metrics/calculators/lead-time.js +82 -0
- package/dist/metrics/calculators/lead-time.js.map +1 -0
- package/dist/metrics/calculators/mttr.d.ts +21 -0
- package/dist/metrics/calculators/mttr.d.ts.map +1 -0
- package/dist/metrics/calculators/mttr.js +60 -0
- package/dist/metrics/calculators/mttr.js.map +1 -0
- package/dist/metrics/dora-calculator.d.ts +24 -0
- package/dist/metrics/dora-calculator.d.ts.map +1 -0
- package/dist/metrics/dora-calculator.js +104 -0
- package/dist/metrics/dora-calculator.js.map +1 -0
- package/dist/metrics/github-client.d.ts +51 -0
- package/dist/metrics/github-client.d.ts.map +1 -0
- package/dist/metrics/github-client.js +133 -0
- package/dist/metrics/github-client.js.map +1 -0
- package/dist/metrics/types.d.ts +112 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +10 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/metrics/utils/percentile.d.ts +25 -0
- package/dist/metrics/utils/percentile.d.ts.map +1 -0
- package/dist/metrics/utils/percentile.js +46 -0
- package/dist/metrics/utils/percentile.js.map +1 -0
- package/dist/metrics/utils/tier-classifier.d.ts +61 -0
- package/dist/metrics/utils/tier-classifier.d.ts.map +1 -0
- package/dist/metrics/utils/tier-classifier.js +100 -0
- package/dist/metrics/utils/tier-classifier.js.map +1 -0
- package/dist/utils/auth-helpers.d.ts +58 -0
- package/dist/utils/auth-helpers.d.ts.map +1 -0
- package/dist/utils/auth-helpers.js +108 -0
- package/dist/utils/auth-helpers.js.map +1 -0
- package/dist/utils/env-file.d.ts +88 -0
- package/dist/utils/env-file.d.ts.map +1 -0
- package/dist/utils/env-file.js +180 -0
- package/dist/utils/env-file.js.map +1 -0
- package/dist/utils/plugin-detection.d.ts +50 -0
- package/dist/utils/plugin-detection.d.ts.map +1 -0
- package/dist/utils/plugin-detection.js +229 -0
- package/dist/utils/plugin-detection.js.map +1 -0
- package/dist/utils/secrets-loader.d.ts +88 -0
- package/dist/utils/secrets-loader.d.ts.map +1 -0
- package/dist/utils/secrets-loader.js +271 -0
- package/dist/utils/secrets-loader.js.map +1 -0
- package/dist/utils/translation.d.ts +187 -0
- package/dist/utils/translation.d.ts.map +1 -0
- package/dist/utils/translation.js +414 -0
- package/dist/utils/translation.js.map +1 -0
- package/package.json +28 -44
- package/plugins/specweave/.claude-plugin/plugin.json +3 -3
- package/plugins/specweave/agents/pm/AGENT.md +330 -54
- package/plugins/specweave/agents/test-aware-planner/AGENT.md +1035 -0
- package/plugins/specweave/agents/test-aware-planner/templates/README.md +118 -0
- package/plugins/specweave/agents/test-aware-planner/templates/task-non-testable.md.template +24 -0
- package/plugins/specweave/agents/test-aware-planner/templates/task-testable.md.template +53 -0
- package/plugins/specweave/agents/test-aware-planner/templates/tasks-frontmatter.md.template +11 -0
- package/plugins/specweave/commands/README.md +88 -163
- package/plugins/specweave/commands/specweave-abandon.md +314 -0
- package/plugins/specweave/commands/specweave-check-tests.md +546 -0
- package/plugins/specweave/commands/{do.md ā specweave-do.md} +5 -7
- package/plugins/specweave/commands/{increment.md ā specweave-increment.md} +231 -4
- package/plugins/specweave/commands/specweave-pause.md +189 -0
- package/plugins/specweave/commands/specweave-qa.md +245 -0
- package/plugins/specweave/commands/specweave-resume.md +216 -0
- package/plugins/specweave/commands/specweave-status.md +397 -0
- package/plugins/specweave/commands/specweave-sync-tasks.md +256 -0
- package/plugins/specweave/commands/{translate.md ā specweave-translate.md} +3 -3
- package/plugins/specweave/commands/specweave-update-scope.md +351 -0
- package/plugins/specweave/commands/specweave.md +21 -21
- package/plugins/specweave/hooks/post-increment-planning.sh +335 -0
- package/plugins/specweave/hooks/post-task-completion.sh +141 -0
- package/plugins/specweave/skills/SKILLS-INDEX.md +1 -1
- package/plugins/specweave/skills/brownfield-analyzer/SKILL.md +9 -9
- package/plugins/specweave/skills/increment-planner/SKILL.md +400 -212
- package/plugins/specweave/skills/increment-quality-judge-v2/SKILL.md +499 -0
- package/plugins/specweave/skills/plugin-detector/SKILL.md +114 -1
- package/plugins/specweave/skills/project-kickstarter/SKILL.md +74 -1
- package/plugins/specweave/skills/{rfc-generator ā spec-generator}/SKILL.md +22 -29
- package/plugins/specweave/skills/specweave-detector/SKILL.md +3 -3
- package/plugins/specweave/skills/specweave-framework/SKILL.md +2 -2
- package/plugins/specweave-ado/.claude-plugin/plugin.json +18 -4
- package/plugins/specweave-ado/agents/ado-manager/AGENT.md +426 -0
- package/plugins/specweave-ado/commands/close-workitem.md +52 -0
- package/plugins/specweave-ado/commands/create-workitem.md +53 -0
- package/plugins/specweave-ado/commands/status.md +53 -0
- package/plugins/specweave-ado/commands/sync.md +55 -0
- package/plugins/specweave-ado/lib/ado-client.ts +361 -0
- package/plugins/specweave-ado/reference/ado-specweave-mapping.md +552 -0
- package/plugins/specweave-ado/skills/ado-sync/SKILL.md +344 -193
- package/plugins/specweave-docs/skills/docusaurus/SKILL.md +73 -0
- package/plugins/specweave-github/agents/github-manager/AGENT.md +49 -0
- package/plugins/specweave-github/commands/{github-close-issue.md ā close-issue.md} +1 -1
- package/plugins/specweave-github/commands/{github-create-issue.md ā create-issue.md} +1 -1
- package/plugins/specweave-github/commands/{github-status.md ā status.md} +1 -1
- package/plugins/specweave-github/commands/{github-sync-tasks.md ā sync-tasks.md} +1 -1
- package/plugins/specweave-github/commands/{github-sync.md ā sync.md} +1 -1
- package/plugins/specweave-github/reference/github-specweave-mapping.md +377 -0
- package/plugins/specweave-github/skills/github-sync/SKILL.md +11 -3
- package/plugins/specweave-infrastructure/commands/{specweave.monitor-setup.md ā monitor-setup.md} +5 -0
- package/plugins/specweave-infrastructure/commands/{specweave.slo-implement.md ā slo-implement.md} +5 -0
- package/plugins/specweave-jira/agents/jira-manager/AGENT.md +380 -0
- package/plugins/specweave-jira/commands/{specweave.sync-jira.md ā sync.md} +1 -1
- package/plugins/specweave-jira/reference/jira-specweave-mapping.md +508 -0
- package/plugins/specweave-ml/commands/ml-deploy.md +1 -1
- package/plugins/specweave-ml/commands/ml-evaluate.md +1 -1
- package/plugins/specweave-ml/commands/ml-explain.md +1 -1
- package/plugins/specweave-ml/commands/{specweave.ml-pipeline.md ā ml-pipeline.md} +5 -0
- package/src/templates/AGENTS.md.template +331 -31
- package/src/templates/CLAUDE.md.template +36 -21
- package/src/templates/COMPLETION-REPORT.template.md +128 -0
- package/src/templates/README.md.template +17 -16
- package/src/templates/docs/README.md +11 -9
- package/src/templates/docs/spec-template.md +229 -0
- package/plugins/specweave/commands/inc.md +0 -85
- package/plugins/specweave/commands/list-increments.md +0 -180
- package/src/adapters/README.md +0 -275
- package/src/adapters/adapter-base.ts +0 -182
- package/src/adapters/adapter-interface.ts +0 -166
- package/src/adapters/adapter-loader.ts +0 -256
- package/src/adapters/agents-md-generator.ts +0 -228
- package/src/adapters/claude/README.md +0 -233
- package/src/adapters/claude/adapter.ts +0 -468
- package/src/adapters/claude-md-generator.ts +0 -377
- package/src/adapters/codex/README.md +0 -105
- package/src/adapters/codex/adapter.ts +0 -333
- package/src/adapters/cursor/.cursor/context/docs-context.md +0 -62
- package/src/adapters/cursor/.cursor/context/increments-context.md +0 -71
- package/src/adapters/cursor/.cursor/context/strategy-context.md +0 -73
- package/src/adapters/cursor/.cursor/context/tests-context.md +0 -89
- package/src/adapters/cursor/README.md +0 -283
- package/src/adapters/cursor/adapter.ts +0 -451
- package/src/adapters/doc-generator.ts +0 -331
- package/src/adapters/gemini/README.md +0 -97
- package/src/adapters/gemini/adapter.ts +0 -298
- package/src/adapters/generic/README.md +0 -277
- package/src/adapters/generic/adapter.ts +0 -378
- package/src/adapters/registry.yaml +0 -187
- /package/plugins/specweave/commands/{costs.md ā specweave-costs.md} +0 -0
- /package/plugins/specweave/commands/{done.md ā specweave-done.md} +0 -0
- /package/plugins/specweave/commands/{next.md ā specweave-next.md} +0 -0
- /package/plugins/specweave/commands/{progress.md ā specweave-progress.md} +0 -0
- /package/plugins/specweave/commands/{sync-docs.md ā specweave-sync-docs.md} +0 -0
- /package/plugins/specweave/commands/{tdd-cycle.md ā specweave-tdd-cycle.md} +0 -0
- /package/plugins/specweave/commands/{tdd-green.md ā specweave-tdd-green.md} +0 -0
- /package/plugins/specweave/commands/{tdd-red.md ā specweave-tdd-red.md} +0 -0
- /package/plugins/specweave/commands/{tdd-refactor.md ā specweave-tdd-refactor.md} +0 -0
- /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":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACrH,OAAO,EACL,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAExE,SAAS;AACT,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AAErB,OAAO;AACP,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,WAAW,CAAC;AAEnB,eAAe;AACf,OAAO,EACL,mCAAmC,EACnC,4BAA4B,EAC5B,6BAA6B,EAC7B,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,UAAU,CAAC;AAElB;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAqB;IAC3D,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAC1D,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE1C,qDAAqD;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM;QACzB,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;QACrC,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM;QAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;QAC/B,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAElC,IAAI,IAAI,EAAE,CAAC;QACT,oDAAoD;QACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,mCAAmC;IACnC,MAAM,cAAc,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAEzD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,iCAAiC;YAC1C,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,oBAAoB,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC3E,KAAK,EAAE,QAAQ;iBAChB;gBACD;oBACE,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,MAAM;iBACd;gBACD;oBACE,IAAI,EAAE,mBAAmB,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;oBACvE,KAAK,EAAE,KAAK;iBACb;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,KAAK,EAAE,MAAM;iBACd;aACF;YACD,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC,CAAC;IAEJ,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yCAAyC;IACzC,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEtE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEhF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC7C,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,gBAAgB,qBAAqB,CAAC,OAAO,CAAC,eAAe;gBACtE,OAAO,EAAE,IAAI;aACd,CAAC,CAAC,CAAC;QAEJ,IAAI,WAAW,EAAE,CAAC;YAChB,gCAAgC;YAChC,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAE7F,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC7B,iBAAiB;gBACjB,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACvC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;gBACnE,6CAA6C;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE/D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8BAA8B;IAC9B,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAEpF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,gBAAgB,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAE7E,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACvC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,YAAY;gBACrB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC,CAAC;QAEJ,IAAI,KAAK,EAAE,CAAC;YACV,0DAA0D;YAC1D,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAED,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mCAAmC;IACnC,MAAM,eAAe,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAEzD,yBAAyB;IACzB,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEvC,+BAA+B;IAC/B,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAErC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,wBAAwB,CACrC,OAAqB,EACrB,WAAmB;IAEnB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,8BAA8B,CAAC,WAAW,CAAC,CAAC;QACrD,KAAK,MAAM;YACT,OAAO,4BAA4B,CAAC,WAAW,CAAC,CAAC;QACnD,KAAK,KAAK;YACR,OAAO,mCAAmC,CAAC,WAAW,CAAC,CAAC;QAC1D;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,OAAqB,EACrB,QAAgB;IAEhB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,uBAAuB,CAAC,QAAe,CAAC,CAAC;QAClD,KAAK,MAAM;YACT,OAAO,qBAAqB,CAAC,QAAe,CAAC,CAAC;QAChD,KAAK,KAAK;YACR,OAAO,4BAA4B,CAAC,QAAe,CAAC,CAAC;QACvD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,OAAqB,EACrB,WAA+B,EAC/B,UAAkB;IAElB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,wBAAwB,CAAC,WAAkB,EAAE,UAAU,CAAC,CAAC;QAClE,KAAK,MAAM;YACT,OAAO,sBAAsB,CAAC,WAAkB,EAAE,UAAU,CAAC,CAAC;QAChE,KAAK,KAAK;YACR,OAAO,6BAA6B,CAAC,WAAkB,EAAE,UAAU,CAAC,CAAC;QACvE;YACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,WAAmB,EACnB,OAAqB,EACrB,WAA+B;IAE/B,6CAA6C;IAC7C,IAAI,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAED,gCAAgC;IAChC,IAAI,OAAO,GAA0C,EAAE,CAAC;IAExD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,GAAG,gBAAgB,CAAC,WAAkB,CAAC,CAAC;YAC/C,MAAM;QACR,KAAK,MAAM;YACT,OAAO,GAAG,cAAc,CAAC,WAAkB,CAAC,CAAC;YAC7C,MAAM;QACR,KAAK,KAAK;YACR,OAAO,GAAG,qBAAqB,CAAC,WAAkB,CAAC,CAAC;YACpD,MAAM;IACV,CAAC;IAED,sBAAsB;IACtB,MAAM,cAAc,GAAG,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE1D,kBAAkB;IAClB,YAAY,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAE1C,4BAA4B;IAC5B,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,OAAqB,EAAE,QAAgB;IAClE,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,qBAAqB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC;IAEtF,mCAAmC;IACnC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,OAAO,cAAc,CAAC,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,OAAO,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,OAAO,cAAc,CAAC,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAqB,EAAE,QAAgB;IAChE,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,uBAAuB,CAAC,QAAe,CAAC,CAAC;YACzC,MAAM;QACR,KAAK,MAAM;YACT,qBAAqB,CAAC,QAAe,CAAC,CAAC;YACvC,MAAM;QACR,KAAK,KAAK;YACR,4BAA4B,CAAC,QAAe,CAAC,CAAC;YAC9C,MAAM;IACV,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAqB,EAAE,QAAgB;IAC/D,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,sBAAsB,CAAC,QAAe,CAAC,CAAC;YACxC,MAAM;QACR,KAAK,MAAM;YACT,oBAAoB,CAAC,QAAe,CAAC,CAAC;YACtC,MAAM;QACR,KAAK,KAAK;YACR,2BAA2B,CAAC,QAAe,CAAC,CAAC;YAC7C,MAAM;IACV,CAAC;AACH,CAAC;AAED,kDAAkD;AAClD,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
|
@@ -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
|