specweave 0.26.14 → 0.27.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.md +73 -1
- package/README.md +111 -466
- package/dist/plugins/specweave-jira/lib/setup-wizard.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/setup-wizard.js +57 -78
- package/dist/plugins/specweave-jira/lib/setup-wizard.js.map +1 -1
- package/dist/src/cli/commands/import-docs.d.ts.map +1 -1
- package/dist/src/cli/commands/import-docs.js +23 -31
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/import-external.d.ts.map +1 -1
- package/dist/src/cli/commands/import-external.js +6 -10
- package/dist/src/cli/commands/import-external.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +58 -73
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts +17 -11
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +221 -1874
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/install.d.ts.map +1 -1
- package/dist/src/cli/commands/install.js +14 -22
- package/dist/src/cli/commands/install.js.map +1 -1
- package/dist/src/cli/commands/migrate-config.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate-config.js +6 -10
- package/dist/src/cli/commands/migrate-config.js.map +1 -1
- package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/helpers/ado-area-path-mapper.d.ts.map +1 -1
- package/dist/src/cli/helpers/ado-area-path-mapper.js +36 -49
- package/dist/src/cli/helpers/ado-area-path-mapper.js.map +1 -1
- package/dist/src/cli/helpers/github/increment-profile-selector.d.ts.map +1 -1
- package/dist/src/cli/helpers/github/increment-profile-selector.js.map +1 -1
- package/dist/src/cli/helpers/github/profile-manager.d.ts.map +1 -1
- package/dist/src/cli/helpers/github/profile-manager.js +8 -11
- package/dist/src/cli/helpers/github/profile-manager.js.map +1 -1
- package/dist/src/cli/helpers/github-repo-selector.d.ts.map +1 -1
- package/dist/src/cli/helpers/github-repo-selector.js +26 -50
- package/dist/src/cli/helpers/github-repo-selector.js.map +1 -1
- package/dist/src/cli/helpers/import-strategy-prompter.d.ts.map +1 -1
- package/dist/src/cli/helpers/import-strategy-prompter.js +39 -52
- package/dist/src/cli/helpers/import-strategy-prompter.js.map +1 -1
- package/dist/src/cli/helpers/init/config-detection.d.ts +40 -0
- package/dist/src/cli/helpers/init/config-detection.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/config-detection.js +125 -0
- package/dist/src/cli/helpers/init/config-detection.js.map +1 -0
- package/dist/src/cli/helpers/init/directory-structure.d.ts +26 -0
- package/dist/src/cli/helpers/init/directory-structure.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/directory-structure.js +190 -0
- package/dist/src/cli/helpers/init/directory-structure.js.map +1 -0
- package/dist/src/cli/helpers/init/external-import.d.ts +15 -0
- package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/external-import.js +251 -0
- package/dist/src/cli/helpers/init/external-import.js.map +1 -0
- package/dist/src/cli/helpers/init/index.d.ts +15 -0
- package/dist/src/cli/helpers/init/index.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/index.js +26 -0
- package/dist/src/cli/helpers/init/index.js.map +1 -0
- package/dist/src/cli/helpers/init/next-steps.d.ts +15 -0
- package/dist/src/cli/helpers/init/next-steps.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/next-steps.js +72 -0
- package/dist/src/cli/helpers/init/next-steps.js.map +1 -0
- package/dist/src/cli/helpers/init/path-utils.d.ts +41 -0
- package/dist/src/cli/helpers/init/path-utils.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/path-utils.js +146 -0
- package/dist/src/cli/helpers/init/path-utils.js.map +1 -0
- package/dist/src/cli/helpers/init/plugin-installer.d.ts +28 -0
- package/dist/src/cli/helpers/init/plugin-installer.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/plugin-installer.js +238 -0
- package/dist/src/cli/helpers/init/plugin-installer.js.map +1 -0
- package/dist/src/cli/helpers/init/repository-setup.d.ts +28 -0
- package/dist/src/cli/helpers/init/repository-setup.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/repository-setup.js +78 -0
- package/dist/src/cli/helpers/init/repository-setup.js.map +1 -0
- package/dist/src/cli/helpers/init/smart-reinit.d.ts +30 -0
- package/dist/src/cli/helpers/init/smart-reinit.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/smart-reinit.js +140 -0
- package/dist/src/cli/helpers/init/smart-reinit.js.map +1 -0
- package/dist/src/cli/helpers/init/testing-config.d.ts +27 -0
- package/dist/src/cli/helpers/init/testing-config.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/testing-config.js +131 -0
- package/dist/src/cli/helpers/init/testing-config.js.map +1 -0
- package/dist/src/cli/helpers/init/types.d.ts +86 -0
- package/dist/src/cli/helpers/init/types.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/types.js +5 -0
- package/dist/src/cli/helpers/init/types.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.js +10 -12
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +43 -60
- package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +193 -230
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github.js +43 -54
- package/dist/src/cli/helpers/issue-tracker/github.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +27 -40
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.js +54 -70
- package/dist/src/cli/helpers/issue-tracker/jira.js.map +1 -1
- package/dist/src/cli/helpers/smart-filter.d.ts.map +1 -1
- package/dist/src/cli/helpers/smart-filter.js +62 -85
- package/dist/src/cli/helpers/smart-filter.js.map +1 -1
- package/dist/src/core/increment/auto-transition-manager.d.ts +12 -0
- package/dist/src/core/increment/auto-transition-manager.d.ts.map +1 -1
- package/dist/src/core/increment/auto-transition-manager.js +45 -0
- package/dist/src/core/increment/auto-transition-manager.js.map +1 -1
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +46 -0
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts +12 -0
- package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.js +48 -2
- package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +13 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +40 -0
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/repo-structure/repo-bulk-discovery.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-bulk-discovery.js +63 -83
- package/dist/src/core/repo-structure/repo-bulk-discovery.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +339 -424
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/sync/bidirectional-engine.d.ts.map +1 -1
- package/dist/src/core/sync/bidirectional-engine.js +21 -29
- package/dist/src/core/sync/bidirectional-engine.js.map +1 -1
- package/dist/src/init/InitFlow.js +15 -19
- package/dist/src/init/InitFlow.js.map +1 -1
- package/dist/src/init/repo/types.d.ts +1 -1
- package/dist/src/integrations/ado/area-path-mapper.d.ts.map +1 -1
- package/dist/src/integrations/ado/area-path-mapper.js +19 -23
- package/dist/src/integrations/ado/area-path-mapper.js.map +1 -1
- package/dist/src/utils/external-resource-validator.d.ts.map +1 -1
- package/dist/src/utils/external-resource-validator.js +41 -65
- package/dist/src/utils/external-resource-validator.js.map +1 -1
- package/dist/src/utils/project-detection.d.ts.map +1 -1
- package/dist/src/utils/project-detection.js +19 -21
- package/dist/src/utils/project-detection.js.map +1 -1
- package/dist/src/utils/project-validator.d.ts.map +1 -1
- package/dist/src/utils/project-validator.js +5 -7
- package/dist/src/utils/project-validator.js.map +1 -1
- package/package.json +2 -3
- package/plugins/specweave/agents/tech-lead/AGENT.md +9 -0
- package/plugins/specweave/hooks/docs-changed.sh.backup +79 -0
- package/plugins/specweave/hooks/human-input-required.sh.backup +75 -0
- package/plugins/specweave/hooks/post-first-increment.sh.backup +61 -0
- package/plugins/specweave/hooks/post-increment-change.sh.backup +98 -0
- package/plugins/specweave/hooks/post-increment-completion.sh.backup +231 -0
- package/plugins/specweave/hooks/post-increment-planning.sh.backup +1048 -0
- package/plugins/specweave/hooks/post-increment-status-change.sh.backup +147 -0
- package/plugins/specweave/hooks/post-spec-update.sh.backup +158 -0
- package/plugins/specweave/hooks/post-user-story-complete.sh.backup +179 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +83 -0
- package/plugins/specweave/hooks/pre-implementation.sh.backup +67 -0
- package/plugins/specweave/hooks/pre-task-completion.sh.backup +194 -0
- package/plugins/specweave/hooks/pre-tool-use.sh.backup +133 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh.backup +386 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +12 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +45 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -1
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +46 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -1
- package/plugins/specweave/skills/increment-planner/SKILL.md +10 -5
- package/plugins/specweave/skills/specweave-framework/SKILL.md +6 -4
- package/plugins/specweave/templates/coding-standards.md.template +36 -0
- package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +353 -0
- package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +172 -0
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +1 -0
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
- package/plugins/specweave-ado/lib/project-selector.js +56 -67
- package/plugins/specweave-ado/lib/project-selector.ts +72 -85
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +1104 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh.backup +258 -0
- package/plugins/specweave-github/lib/repo-selector.js +55 -66
- package/plugins/specweave-github/lib/repo-selector.ts +73 -84
- package/plugins/specweave-jira/commands/import-projects.js +3 -5
- package/plugins/specweave-jira/commands/import-projects.ts +3 -5
- package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +172 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
- package/plugins/specweave-jira/lib/project-selector.js +60 -71
- package/plugins/specweave-jira/lib/project-selector.ts +78 -91
- package/plugins/specweave-jira/lib/setup-wizard.js +51 -72
- package/plugins/specweave-jira/lib/setup-wizard.ts +56 -74
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +1017 -0
- package/plugins/specweave-release/hooks/post-task-completion.sh.backup +110 -0
- package/src/templates/CLAUDE.md.template +14 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart re-initialization logic
|
|
3
|
+
* Handles the case when .specweave/ already exists
|
|
4
|
+
* Consolidates duplicate logic from init.ts
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from '../../../utils/fs-native.js';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import { select, confirm } from '@inquirer/prompts';
|
|
10
|
+
import { countFilesRecursive } from './path-utils.js';
|
|
11
|
+
/**
|
|
12
|
+
* Prompt user for re-initialization action when .specweave/ already exists
|
|
13
|
+
* This consolidates the duplicate logic that appeared twice in init.ts
|
|
14
|
+
*
|
|
15
|
+
* @param options - Configuration options
|
|
16
|
+
* @returns The chosen action and whether to continue with existing project
|
|
17
|
+
*/
|
|
18
|
+
export async function promptSmartReinit(options) {
|
|
19
|
+
const { targetDir, isCI, hasForce } = options;
|
|
20
|
+
console.log(chalk.blue('\n📦 Existing SpecWeave project detected!'));
|
|
21
|
+
console.log(chalk.gray(' Found .specweave/ folder with your increments, docs, and configuration.\n'));
|
|
22
|
+
let action;
|
|
23
|
+
if (hasForce) {
|
|
24
|
+
// Force mode: warn about destructive action
|
|
25
|
+
console.log(chalk.red.bold('\n⛔ DANGER: --force DELETES ALL DATA!'));
|
|
26
|
+
console.log(chalk.red(' This will permanently delete:'));
|
|
27
|
+
console.log(chalk.red(' • All increments (.specweave/increments/)'));
|
|
28
|
+
console.log(chalk.red(' • All documentation (.specweave/docs/)'));
|
|
29
|
+
console.log(chalk.red(' • All configuration and history'));
|
|
30
|
+
console.log(chalk.yellow('\n 💡 TIP: Use "specweave init ." (no --force) for safe updates\n'));
|
|
31
|
+
if (isCI) {
|
|
32
|
+
// CI mode: proceed with force deletion without prompting
|
|
33
|
+
console.log(chalk.gray(' → CI mode: Proceeding with force deletion'));
|
|
34
|
+
action = 'fresh';
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Interactive: require explicit confirmation
|
|
38
|
+
const confirmDeletion = await confirm({
|
|
39
|
+
message: chalk.red('⚠️ Type "y" to PERMANENTLY DELETE all .specweave/ data:'),
|
|
40
|
+
default: false,
|
|
41
|
+
});
|
|
42
|
+
if (!confirmDeletion) {
|
|
43
|
+
console.log(chalk.green('\n✅ Deletion cancelled. No data lost.'));
|
|
44
|
+
console.log(chalk.gray(' → Run "specweave init ." (without --force) for safe updates'));
|
|
45
|
+
return { action: 'cancel', continueExisting: false };
|
|
46
|
+
}
|
|
47
|
+
action = 'fresh';
|
|
48
|
+
}
|
|
49
|
+
console.log(chalk.yellow('\n 🔄 Force mode: Proceeding with fresh start...'));
|
|
50
|
+
}
|
|
51
|
+
else if (isCI) {
|
|
52
|
+
// CI mode without force: auto-continue
|
|
53
|
+
console.log(chalk.gray(' → CI mode: Continuing with existing project'));
|
|
54
|
+
action = 'continue';
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Interactive mode: show choices
|
|
58
|
+
action = await select({
|
|
59
|
+
message: 'What would you like to do?',
|
|
60
|
+
choices: [
|
|
61
|
+
{
|
|
62
|
+
name: '✨ Continue working (keep all existing increments, docs, and history)',
|
|
63
|
+
value: 'continue',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: '🔄 Fresh start (delete .specweave/ and start from scratch)',
|
|
67
|
+
value: 'fresh',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: '❌ Cancel (exit without changes)',
|
|
71
|
+
value: 'cancel',
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
default: 'continue'
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (action === 'cancel') {
|
|
78
|
+
console.log(chalk.yellow('\n⏸️ Initialization cancelled. No changes made.'));
|
|
79
|
+
return { action: 'cancel', continueExisting: false };
|
|
80
|
+
}
|
|
81
|
+
if (action === 'fresh') {
|
|
82
|
+
// Handle fresh start
|
|
83
|
+
const freshResult = await handleFreshStart(targetDir, isCI, hasForce);
|
|
84
|
+
return { action: freshResult ? 'fresh' : 'cancel', continueExisting: false };
|
|
85
|
+
}
|
|
86
|
+
// Continue working
|
|
87
|
+
console.log(chalk.green('\n✅ Continuing with existing project'));
|
|
88
|
+
console.log(chalk.gray(' → Keeping all increments, docs, and history'));
|
|
89
|
+
console.log(chalk.gray(' → Config will be updated if needed\n'));
|
|
90
|
+
return { action: 'continue', continueExisting: true };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Handle fresh start action - backup and delete .specweave/
|
|
94
|
+
*
|
|
95
|
+
* @param targetDir - Target directory
|
|
96
|
+
* @param isCI - Whether running in CI mode
|
|
97
|
+
* @param hasForce - Whether --force flag was used
|
|
98
|
+
* @returns true if fresh start succeeded, false if cancelled
|
|
99
|
+
*/
|
|
100
|
+
async function handleFreshStart(targetDir, isCI, hasForce) {
|
|
101
|
+
const specweavePath = path.join(targetDir, '.specweave');
|
|
102
|
+
if (!hasForce) {
|
|
103
|
+
if (isCI) {
|
|
104
|
+
// CI mode without force: NEVER allow fresh start
|
|
105
|
+
console.log(chalk.red('\n⛔ ERROR: Cannot start fresh in CI mode without --force flag'));
|
|
106
|
+
console.log(chalk.gray(' → Use "specweave init . --force" if you really want to delete all data'));
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
// Interactive: ask for confirmation
|
|
110
|
+
console.log(chalk.yellow('\n⚠️ WARNING: This will DELETE all increments, docs, and configuration!'));
|
|
111
|
+
const confirmFresh = await confirm({
|
|
112
|
+
message: 'Are you sure you want to start fresh? (all .specweave/ content will be lost)',
|
|
113
|
+
default: false,
|
|
114
|
+
});
|
|
115
|
+
if (!confirmFresh) {
|
|
116
|
+
console.log(chalk.yellow('\n⏸️ Fresh start cancelled. No changes made.'));
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Create backup before deletion
|
|
121
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('T')[0];
|
|
122
|
+
const backupPath = path.join(targetDir, `.specweave.backup-${timestamp}`);
|
|
123
|
+
try {
|
|
124
|
+
console.log(chalk.cyan('\n 📦 Creating backup before deletion...'));
|
|
125
|
+
fs.copySync(specweavePath, backupPath);
|
|
126
|
+
console.log(chalk.green(` ✅ Backup saved: ${path.relative(targetDir, backupPath)}`));
|
|
127
|
+
console.log(chalk.gray(` To restore: mv ${path.basename(backupPath)} .specweave`));
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
console.log(chalk.yellow(' ⚠️ Could not create backup (proceeding anyway)'));
|
|
131
|
+
}
|
|
132
|
+
// Count files before deletion
|
|
133
|
+
const fileCount = countFilesRecursive(specweavePath);
|
|
134
|
+
// Delete .specweave/
|
|
135
|
+
fs.removeSync(specweavePath);
|
|
136
|
+
console.log(chalk.blue(`\n ♻️ Removed .specweave/ (${fileCount} files deleted)`));
|
|
137
|
+
console.log(chalk.green(' ✅ Starting fresh - will create new .specweave/ structure\n'));
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=smart-reinit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-reinit.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/smart-reinit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing configuration prompts
|
|
3
|
+
* Handles test mode selection and coverage targets
|
|
4
|
+
*/
|
|
5
|
+
import type { TestMode } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Result of testing configuration
|
|
8
|
+
*/
|
|
9
|
+
export interface TestingConfigResult {
|
|
10
|
+
testMode: TestMode;
|
|
11
|
+
coverageTarget: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Prompt user for testing configuration
|
|
15
|
+
*
|
|
16
|
+
* @returns Testing configuration
|
|
17
|
+
*/
|
|
18
|
+
export declare function promptTestingConfig(): Promise<TestingConfigResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Update config.json with testing configuration
|
|
21
|
+
*
|
|
22
|
+
* @param targetDir - Project directory
|
|
23
|
+
* @param testMode - Selected test mode
|
|
24
|
+
* @param coverageTarget - Selected coverage target
|
|
25
|
+
*/
|
|
26
|
+
export declare function updateConfigWithTesting(targetDir: string, testMode: TestMode, coverageTarget: number): void;
|
|
27
|
+
//# sourceMappingURL=testing-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing-config.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/testing-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAiGxE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,MAAM,GACrB,IAAI,CAqBN"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing configuration prompts
|
|
3
|
+
* Handles test mode selection and coverage targets
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from '../../../utils/fs-native.js';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { select, input } from '@inquirer/prompts';
|
|
9
|
+
/**
|
|
10
|
+
* Prompt user for testing configuration
|
|
11
|
+
*
|
|
12
|
+
* @returns Testing configuration
|
|
13
|
+
*/
|
|
14
|
+
export async function promptTestingConfig() {
|
|
15
|
+
console.log('');
|
|
16
|
+
console.log(chalk.cyan.bold('🧪 Testing Configuration'));
|
|
17
|
+
console.log(chalk.gray(' Configure your default testing approach and coverage targets'));
|
|
18
|
+
console.log('');
|
|
19
|
+
// Add guidance on which testing approach to choose
|
|
20
|
+
console.log(chalk.white('💡 Which testing approach should you choose?'));
|
|
21
|
+
console.log('');
|
|
22
|
+
console.log(chalk.green(' ✓ TDD (Test-Driven Development)'));
|
|
23
|
+
console.log(chalk.gray(' Best for: Complex business logic, critical features, refactoring'));
|
|
24
|
+
console.log(chalk.gray(' Benefits: Better design, fewer bugs, confidence in changes'));
|
|
25
|
+
console.log(chalk.gray(' Tradeoff: Slower initial development, requires discipline'));
|
|
26
|
+
console.log('');
|
|
27
|
+
console.log(chalk.blue(' ✓ Test-After'));
|
|
28
|
+
console.log(chalk.gray(' Best for: Most projects, rapid prototyping, exploratory work'));
|
|
29
|
+
console.log(chalk.gray(' Benefits: Fast iteration, flexible design, good coverage'));
|
|
30
|
+
console.log(chalk.gray(' Tradeoff: May miss edge cases, harder to test after design'));
|
|
31
|
+
console.log('');
|
|
32
|
+
console.log(chalk.yellow(' ✓ Manual Testing'));
|
|
33
|
+
console.log(chalk.gray(' Best for: Quick prototypes, proof-of-concepts, learning'));
|
|
34
|
+
console.log(chalk.gray(' Benefits: Fastest development, no test maintenance'));
|
|
35
|
+
console.log(chalk.gray(' Tradeoff: No safety net, regressions, hard to refactor'));
|
|
36
|
+
console.log('');
|
|
37
|
+
const testMode = await select({
|
|
38
|
+
message: 'Select your testing approach:',
|
|
39
|
+
choices: [
|
|
40
|
+
{
|
|
41
|
+
name: '🔴 TDD - Write tests first (recommended for production apps)',
|
|
42
|
+
value: 'TDD',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: '🔵 Test-After - Implement first, test later (balanced approach)',
|
|
46
|
+
value: 'test-after',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: '🟡 Manual - No automated tests (prototypes only)',
|
|
50
|
+
value: 'manual',
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
default: 'test-after'
|
|
54
|
+
});
|
|
55
|
+
let coverageTarget = 80;
|
|
56
|
+
// Only ask for coverage if not manual testing
|
|
57
|
+
if (testMode !== 'manual') {
|
|
58
|
+
const selectedCoverageLevel = await select({
|
|
59
|
+
message: 'Select your coverage target level:',
|
|
60
|
+
choices: [
|
|
61
|
+
{
|
|
62
|
+
name: '70% - Acceptable (core paths covered)',
|
|
63
|
+
value: 70,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: '80% - Good (recommended - most paths covered)',
|
|
67
|
+
value: 80,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: '90% - Excellent (comprehensive coverage)',
|
|
71
|
+
value: 90,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'Custom (enter your own value)',
|
|
75
|
+
value: 'custom',
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
default: 80
|
|
79
|
+
});
|
|
80
|
+
if (selectedCoverageLevel === 'custom') {
|
|
81
|
+
const customInput = await input({
|
|
82
|
+
message: 'Enter custom coverage target (70-95):',
|
|
83
|
+
default: '80',
|
|
84
|
+
validate: (val) => {
|
|
85
|
+
const num = parseInt(val, 10);
|
|
86
|
+
if (isNaN(num) || num < 70 || num > 95) {
|
|
87
|
+
return 'Coverage target must be between 70% and 95%';
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
coverageTarget = parseInt(customInput, 10);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
coverageTarget = selectedCoverageLevel;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
console.log('');
|
|
99
|
+
console.log(chalk.green(` ✔ Testing: ${testMode}`));
|
|
100
|
+
if (testMode !== 'manual') {
|
|
101
|
+
console.log(chalk.green(` ✔ Coverage Target: ${coverageTarget}%`));
|
|
102
|
+
}
|
|
103
|
+
console.log('');
|
|
104
|
+
return { testMode, coverageTarget };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Update config.json with testing configuration
|
|
108
|
+
*
|
|
109
|
+
* @param targetDir - Project directory
|
|
110
|
+
* @param testMode - Selected test mode
|
|
111
|
+
* @param coverageTarget - Selected coverage target
|
|
112
|
+
*/
|
|
113
|
+
export function updateConfigWithTesting(targetDir, testMode, coverageTarget) {
|
|
114
|
+
const configPath = path.join(targetDir, '.specweave', 'config.json');
|
|
115
|
+
if (!fs.existsSync(configPath)) {
|
|
116
|
+
console.error(chalk.red('⚠️ config.json not found, cannot update testing configuration'));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const config = fs.readJsonSync(configPath);
|
|
120
|
+
config.testing = {
|
|
121
|
+
defaultTestMode: testMode,
|
|
122
|
+
defaultCoverageTarget: coverageTarget,
|
|
123
|
+
coverageTargets: {
|
|
124
|
+
unit: Math.min(coverageTarget + 5, 95),
|
|
125
|
+
integration: coverageTarget,
|
|
126
|
+
e2e: Math.min(coverageTarget + 10, 100)
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
fs.writeJsonSync(configPath, config, { spaces: 2 });
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=testing-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing-config.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/testing-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for init command helpers
|
|
3
|
+
*/
|
|
4
|
+
import type { Logger } from '../../../utils/logger.js';
|
|
5
|
+
import type { SupportedLanguage } from '../../../core/i18n/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Options passed to the init command
|
|
8
|
+
*/
|
|
9
|
+
export interface InitOptions {
|
|
10
|
+
template?: string;
|
|
11
|
+
adapter?: string;
|
|
12
|
+
techStack?: string;
|
|
13
|
+
language?: string;
|
|
14
|
+
force?: boolean;
|
|
15
|
+
forceRefresh?: boolean;
|
|
16
|
+
logger?: Logger;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Result of smart re-initialization prompt
|
|
20
|
+
*/
|
|
21
|
+
export type ReinitAction = 'continue' | 'fresh' | 'cancel';
|
|
22
|
+
/**
|
|
23
|
+
* Repository hosting configuration
|
|
24
|
+
*/
|
|
25
|
+
export type RepositoryHosting = 'github-single' | 'github-multirepo' | 'bitbucket-single' | 'bitbucket-multirepo' | 'ado-single' | 'ado-multirepo' | 'local' | 'other-single' | 'other-multirepo';
|
|
26
|
+
/**
|
|
27
|
+
* Detected parent .specweave folder info
|
|
28
|
+
*/
|
|
29
|
+
export interface ParentSpecweaveFolder {
|
|
30
|
+
path: string;
|
|
31
|
+
depth: number;
|
|
32
|
+
isHomeDir?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* GitHub remote detection result
|
|
36
|
+
*/
|
|
37
|
+
export interface GitHubRemote {
|
|
38
|
+
owner: string;
|
|
39
|
+
repo: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* JIRA configuration detection result
|
|
43
|
+
*/
|
|
44
|
+
export interface JiraConfig {
|
|
45
|
+
host: string;
|
|
46
|
+
email?: string;
|
|
47
|
+
apiToken?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Azure DevOps configuration detection result
|
|
51
|
+
*/
|
|
52
|
+
export interface ADOConfig {
|
|
53
|
+
orgUrl: string;
|
|
54
|
+
project: string;
|
|
55
|
+
pat?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Testing mode configuration
|
|
59
|
+
*/
|
|
60
|
+
export type TestMode = 'TDD' | 'test-after' | 'manual';
|
|
61
|
+
/**
|
|
62
|
+
* Testing configuration for config.json
|
|
63
|
+
*/
|
|
64
|
+
export interface TestingConfig {
|
|
65
|
+
defaultTestMode: TestMode;
|
|
66
|
+
defaultCoverageTarget: number;
|
|
67
|
+
coverageTargets: {
|
|
68
|
+
unit: number;
|
|
69
|
+
integration: number;
|
|
70
|
+
e2e: number;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Context passed between init steps
|
|
75
|
+
*/
|
|
76
|
+
export interface InitContext {
|
|
77
|
+
targetDir: string;
|
|
78
|
+
projectName: string;
|
|
79
|
+
language: SupportedLanguage;
|
|
80
|
+
isCI: boolean;
|
|
81
|
+
continueExisting: boolean;
|
|
82
|
+
usedDotNotation: boolean;
|
|
83
|
+
toolName: string;
|
|
84
|
+
options: InitOptions;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,kBAAkB,GAClB,kBAAkB,GAClB,qBAAqB,GACrB,YAAY,GACZ,eAAe,GACf,OAAO,GACP,cAAc,GACd,iBAAiB,CAAC;AAEtB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,QAAQ,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ado-auto-discover.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/issue-tracker/ado-auto-discover.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"ado-auto-discover.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/issue-tracker/ado-auto-discover.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC,CA8GnB"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* @module cli/helpers/issue-tracker/ado-auto-discover
|
|
8
8
|
*/
|
|
9
9
|
import chalk from 'chalk';
|
|
10
|
+
import { checkbox } from '@inquirer/prompts';
|
|
10
11
|
/**
|
|
11
12
|
* Auto-discover ADO projects with smart pagination
|
|
12
13
|
*
|
|
@@ -80,18 +81,15 @@ export async function autoDiscoverAdoProjects(options) {
|
|
|
80
81
|
const result = await loader.fetchAllProjects(Math.min(50, totalCount));
|
|
81
82
|
const allProjects = result.projects.map(p => ({ name: p.name, value: p.name }));
|
|
82
83
|
// Show checkbox (all pre-selected per US-002 CLI-first defaults)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
{
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
]);
|
|
94
|
-
projectNames = selected.projects;
|
|
84
|
+
projectNames = await checkbox({
|
|
85
|
+
message: 'Select projects to import:',
|
|
86
|
+
choices: allProjects.map(p => ({
|
|
87
|
+
name: p.name,
|
|
88
|
+
value: p.value,
|
|
89
|
+
checked: true // All selected by default (CLI-first)
|
|
90
|
+
})),
|
|
91
|
+
pageSize: 20
|
|
92
|
+
});
|
|
95
93
|
}
|
|
96
94
|
else if (strategyResult.strategy === 'manual-entry') {
|
|
97
95
|
// Manual entry: use provided keys
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ado-auto-discover.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/issue-tracker/ado-auto-discover.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ado-auto-discover.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/issue-tracker/ado-auto-discover.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAU7C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAA+B;IAE/B,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEnD,4BAA4B;IAC5B,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAAC;QAC9E,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,gBAAgB,YAAY,EAAE,CAAC;QAEhD,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,GAAG,CAAW,QAAQ,CAAC,CAAC;QAClE,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACnE,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAE5D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;IACxE,MAAM,WAAW,GAAmB,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;IAE1D,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC;QACxC,WAAW;QACX,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,sCAAsC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,UAAU,4BAA4B,CAAC,CAAC,CAAC;IAE5E,iCAAiC;IACjC,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAChF,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC;QAChD,UAAU;QACV,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,oCAAoC;IACpC,IAAI,cAAc,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC7C,2DAA2D;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAE5D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,kBAAkB,CACnC,WAAW,EACX,KAAK,EACL;YACE,SAAS,EAAE,EAAE;YACb,eAAe,EAAE,CAAC;YAClB,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,yCAAyC,CAAC,CAAC,CAAC,SAAS;SAC7F,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACzD,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEhD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC;QAExE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,kCAAkC,CAAC,CAAC,CAAC;QACpF,CAAC;IAEH,CAAC;SAAM,IAAI,cAAc,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACzD,uDAAuD;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;QAErE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,kBAAkB,CACnC,WAAW,EACX,KAAK,EACL,EAAE,SAAS,EAAE,EAAE,EAAE,CAClB,CAAC;QAEF,wCAAwC;QACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEhF,iEAAiE;QACjE,YAAY,GAAG,MAAM,QAAQ,CAAC;YAC5B,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,IAAI,CAAE,sCAAsC;aACtD,CAAC,CAAC;YACH,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;IAEL,CAAC;SAAM,IAAI,cAAc,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;QACtD,kCAAkC;QAClC,YAAY,GAAG,cAAc,CAAC,WAAW,IAAI,EAAE,CAAC;IAClD,CAAC;IAED,sCAAsC;IACtC,IAAI,WAAW,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAAC;QAC9E,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,gBAAgB,YAAY,EAAE,CAAC;QAEhD,MAAM,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW;IAClF,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ado.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/issue-tracker/ado.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAKpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIrE;;;;;GAKG;AACH,wBAAsB,mCAAmC,CACvD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA2BrC;AAED;;;;;;;;GAQG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"ado.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/issue-tracker/ado.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAKpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIrE;;;;;GAKG;AACH,wBAAsB,mCAAmC,CACvD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA2BrC;AAED;;;;;;;;GAQG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CA0HxC;AAED;;;;;;;;;GASG;AACH,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,sBAAsB,EACnC,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,gBAAgB,CAAC,CA+D3B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,sBAAsB,GAClC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAevC;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAS9E;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAY7E;AAGD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @module cli/helpers/issue-tracker/ado
|
|
7
7
|
*/
|
|
8
8
|
import chalk from 'chalk';
|
|
9
|
-
import
|
|
9
|
+
import { confirm, input, password } from '@inquirer/prompts';
|
|
10
10
|
import ora from 'ora';
|
|
11
11
|
import { getAzureDevOpsAuth } from '../../../utils/auth-helpers.js';
|
|
12
12
|
import { parseEnvFile, readEnvFile } from '../../../utils/env-file.js';
|
|
@@ -72,12 +72,10 @@ export async function promptAzureDevOpsCredentials(language, projectRoot) {
|
|
|
72
72
|
console.log(chalk.gray(` Teams: ${cachedConfig.teams.join(', ')}`));
|
|
73
73
|
}
|
|
74
74
|
console.log('');
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
default: true
|
|
80
|
-
}]);
|
|
75
|
+
const reuseConfig = await confirm({
|
|
76
|
+
message: 'Use cached configuration?',
|
|
77
|
+
default: true
|
|
78
|
+
});
|
|
81
79
|
if (!reuseConfig) {
|
|
82
80
|
cachedConfig = null; // User wants to enter new config
|
|
83
81
|
}
|
|
@@ -89,12 +87,10 @@ export async function promptAzureDevOpsCredentials(language, projectRoot) {
|
|
|
89
87
|
console.log(chalk.gray(' 2. Click "New Token"'));
|
|
90
88
|
console.log(chalk.gray(' 3. Scopes: Work Items (Read, Write, Manage), Code (Read), Project (Read)'));
|
|
91
89
|
console.log(chalk.gray(' 4. Copy the token\n'));
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
default: true
|
|
97
|
-
}]);
|
|
90
|
+
const continueSetup = await confirm({
|
|
91
|
+
message: 'Continue with Azure DevOps setup?',
|
|
92
|
+
default: true
|
|
93
|
+
});
|
|
98
94
|
if (!continueSetup) {
|
|
99
95
|
return null;
|
|
100
96
|
}
|
|
@@ -108,60 +104,47 @@ export async function promptAzureDevOpsCredentials(language, projectRoot) {
|
|
|
108
104
|
}
|
|
109
105
|
else {
|
|
110
106
|
// Prompt for new configuration
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
validate: (input) => {
|
|
117
|
-
if (!input || input.trim() === '') {
|
|
118
|
-
return 'Organization cannot be empty';
|
|
119
|
-
}
|
|
120
|
-
return true;
|
|
107
|
+
org = await input({
|
|
108
|
+
message: 'Azure DevOps organization name:',
|
|
109
|
+
validate: (value) => {
|
|
110
|
+
if (!value || value.trim() === '') {
|
|
111
|
+
return 'Organization cannot be empty';
|
|
121
112
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
return true;
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
project = await input({
|
|
117
|
+
message: 'Project name:',
|
|
118
|
+
validate: (value) => {
|
|
119
|
+
if (!value || value.trim() === '') {
|
|
120
|
+
return 'Project cannot be empty';
|
|
132
121
|
}
|
|
133
|
-
|
|
134
|
-
{
|
|
135
|
-
type: 'input',
|
|
136
|
-
name: 'teams',
|
|
137
|
-
message: 'Team name(s) (optional, comma-separated):',
|
|
138
|
-
default: ''
|
|
122
|
+
return true;
|
|
139
123
|
}
|
|
140
|
-
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
124
|
+
});
|
|
125
|
+
const teamsInput = await input({
|
|
126
|
+
message: 'Team name(s) (optional, comma-separated):',
|
|
127
|
+
default: ''
|
|
128
|
+
});
|
|
129
|
+
teams = teamsInput
|
|
130
|
+
? teamsInput.split(',').map((t) => t.trim()).filter((t) => t.length > 0)
|
|
146
131
|
: [];
|
|
147
132
|
}
|
|
148
133
|
// Always prompt for PAT (never cache secrets)
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
if (input.length < 40) {
|
|
160
|
-
return 'Azure DevOps tokens should be at least 40 characters';
|
|
161
|
-
}
|
|
162
|
-
return true;
|
|
134
|
+
const pat = await password({
|
|
135
|
+
message: 'Paste your Personal Access Token:',
|
|
136
|
+
mask: '*',
|
|
137
|
+
validate: (value) => {
|
|
138
|
+
if (!value || value.length === 0) {
|
|
139
|
+
return 'Token cannot be empty';
|
|
140
|
+
}
|
|
141
|
+
// ADO PATs are typically 52 characters, but fine-grained tokens can be >= 40
|
|
142
|
+
if (value.length < 40) {
|
|
143
|
+
return 'Azure DevOps tokens should be at least 40 characters';
|
|
163
144
|
}
|
|
164
|
-
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
165
148
|
// Cache the configuration (NOT the PAT) for future use
|
|
166
149
|
if (projectRoot) {
|
|
167
150
|
const { CacheManager } = await import('../../../core/cache/cache-manager.js');
|