specweave 1.0.14 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
  2. package/dist/src/cli/helpers/init/external-import.js +108 -0
  3. package/dist/src/cli/helpers/init/external-import.js.map +1 -1
  4. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts +1 -1
  5. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
  6. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +3 -12
  7. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
  8. package/dist/src/cli/helpers/issue-tracker/github.d.ts +2 -5
  9. package/dist/src/cli/helpers/issue-tracker/github.d.ts.map +1 -1
  10. package/dist/src/cli/helpers/issue-tracker/github.js +9 -81
  11. package/dist/src/cli/helpers/issue-tracker/github.js.map +1 -1
  12. package/dist/src/core/repo-structure/multi-repo-configurator.d.ts +4 -3
  13. package/dist/src/core/repo-structure/multi-repo-configurator.d.ts.map +1 -1
  14. package/dist/src/core/repo-structure/multi-repo-configurator.js +103 -434
  15. package/dist/src/core/repo-structure/multi-repo-configurator.js.map +1 -1
  16. package/dist/src/core/repo-structure/prompt-consolidator.d.ts +1 -1
  17. package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
  18. package/dist/src/core/repo-structure/prompt-consolidator.js +14 -18
  19. package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
  20. package/dist/src/core/repo-structure/repo-structure-manager.d.ts +6 -2
  21. package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
  22. package/dist/src/core/repo-structure/repo-structure-manager.js +13 -39
  23. package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
  24. package/dist/src/core/repo-structure/setup-state-manager.d.ts +4 -0
  25. package/dist/src/core/repo-structure/setup-state-manager.d.ts.map +1 -1
  26. package/dist/src/core/repo-structure/setup-state-manager.js.map +1 -1
  27. package/package.json +1 -1
  28. package/dist/src/cli/commands/validate-parent-repo.d.ts +0 -8
  29. package/dist/src/cli/commands/validate-parent-repo.d.ts.map +0 -1
  30. package/dist/src/cli/commands/validate-parent-repo.js +0 -15
  31. package/dist/src/cli/commands/validate-parent-repo.js.map +0 -1
  32. package/dist/src/core/cicd/parent-repo-validator.d.ts +0 -42
  33. package/dist/src/core/cicd/parent-repo-validator.d.ts.map +0 -1
  34. package/dist/src/core/cicd/parent-repo-validator.js +0 -201
  35. package/dist/src/core/cicd/parent-repo-validator.js.map +0 -1
@@ -1,201 +0,0 @@
1
- /**
2
- * Parent Repository Validation Utility
3
- *
4
- * Validates consistency of parent repo naming across:
5
- * - .specweave/config.json (source of truth)
6
- * - Git remote (origin)
7
- * - .env file (if exists)
8
- *
9
- * Prevents the common mistake of creating duplicate parent repos
10
- * when using multi-project mode with -shared flag.
11
- */
12
- import * as fs from '../../utils/fs-native.js';
13
- import * as path from 'path';
14
- import { execSync } from 'child_process';
15
- import chalk from 'chalk';
16
- /**
17
- * Extract parent repo name from config.json
18
- */
19
- function getConfigParentRepoName(projectRoot) {
20
- const configPath = path.join(projectRoot, '.specweave', 'config.json');
21
- if (!fs.existsSync(configPath)) {
22
- return null;
23
- }
24
- try {
25
- const config = fs.readJsonSync(configPath);
26
- return config.multiProject?.parentRepoName || null;
27
- }
28
- catch (error) {
29
- console.error(chalk.yellow('⚠️ Failed to parse config.json:'), error);
30
- return null;
31
- }
32
- }
33
- /**
34
- * Extract parent repo name from git remote origin
35
- */
36
- function getGitRemoteRepoName(projectRoot) {
37
- try {
38
- const remoteUrl = execSync('git remote get-url origin', {
39
- cwd: projectRoot,
40
- encoding: 'utf-8',
41
- stdio: ['pipe', 'pipe', 'ignore'] // Suppress stderr
42
- }).trim();
43
- // Extract repo name from URL
44
- // Examples:
45
- // - https://github.com/owner/repo.git → repo
46
- // - git@github.com:owner/repo.git → repo
47
- const match = remoteUrl.match(/\/([^\/]+?)(\.git)?$/);
48
- return match ? match[1].replace('.git', '') : null;
49
- }
50
- catch (error) {
51
- // Git remote doesn't exist or not a git repo
52
- return null;
53
- }
54
- }
55
- /**
56
- * Extract parent repo name from .env file
57
- */
58
- function getEnvParentRepoName(projectRoot) {
59
- const envPath = path.join(projectRoot, '.env');
60
- if (!fs.existsSync(envPath)) {
61
- return null;
62
- }
63
- try {
64
- const envContent = fs.readFileSync(envPath, 'utf-8');
65
- const match = envContent.match(/^PARENT_REPO_NAME=(.*)$/m);
66
- if (!match) {
67
- return null;
68
- }
69
- // Format: shared:repo-name or repo-name
70
- const value = match[1].trim();
71
- const parts = value.split(':');
72
- return parts.length === 2 ? parts[1] : value;
73
- }
74
- catch (error) {
75
- console.error(chalk.yellow('⚠️ Failed to read .env:'), error);
76
- return null;
77
- }
78
- }
79
- /**
80
- * Get all parent repo names from different sources
81
- */
82
- export function checkParentRepoSetup(projectRoot) {
83
- return {
84
- configParentName: getConfigParentRepoName(projectRoot),
85
- gitRemoteName: getGitRemoteRepoName(projectRoot),
86
- envParentName: getEnvParentRepoName(projectRoot)
87
- };
88
- }
89
- /**
90
- * Validate parent repo setup consistency
91
- */
92
- export function validateParentRepoSetup(projectRoot) {
93
- const result = {
94
- valid: true,
95
- errors: [],
96
- warnings: []
97
- };
98
- // Get all names
99
- const check = checkParentRepoSetup(projectRoot);
100
- result.configName = check.configParentName || undefined;
101
- result.gitRemoteName = check.gitRemoteName || undefined;
102
- result.envName = check.envParentName || undefined;
103
- // Check 1: Config has parent repo name (if multi-project enabled)
104
- const configPath = path.join(projectRoot, '.specweave', 'config.json');
105
- if (fs.existsSync(configPath)) {
106
- const config = fs.readJsonSync(configPath);
107
- const multiProjectEnabled = config.multiProject?.enabled === true;
108
- if (multiProjectEnabled && !check.configParentName) {
109
- result.valid = false;
110
- result.errors.push('❌ Multi-project enabled but parentRepoName not set in config.json');
111
- }
112
- }
113
- // Check 2: Git remote matches config (if both exist)
114
- if (check.configParentName && check.gitRemoteName) {
115
- if (check.configParentName !== check.gitRemoteName) {
116
- result.valid = false;
117
- result.errors.push('❌ Git remote mismatch!', ` Config expects: ${check.configParentName}`, ` Git remote has: ${check.gitRemoteName}`, '', ' Fix with:', ` git remote set-url origin https://github.com/OWNER/${check.configParentName}.git`);
118
- }
119
- }
120
- // Check 3: .env matches config (if both exist)
121
- if (check.configParentName && check.envParentName) {
122
- if (check.configParentName !== check.envParentName) {
123
- result.warnings.push('⚠️ .env mismatch (will be ignored):', ` Config: ${check.configParentName}`, ` .env: ${check.envParentName}`, '', ' Update .env to match config.json');
124
- }
125
- }
126
- // Check 4: -shared suffix consistency
127
- if (check.configParentName && check.configParentName.endsWith('-shared')) {
128
- // Config has -shared, check git and env also have it
129
- if (check.gitRemoteName && !check.gitRemoteName.endsWith('-shared')) {
130
- result.valid = false;
131
- result.errors.push('❌ Config has -shared suffix, but git remote doesn\'t', '', ` Config: ${check.configParentName} (has -shared)`, ` Git: ${check.gitRemoteName} (missing -shared)`, '');
132
- }
133
- if (check.envParentName && !check.envParentName.endsWith('-shared')) {
134
- result.warnings.push('⚠️ Config has -shared suffix, but .env doesn\'t', '', ` Config: ${check.configParentName} (has -shared)`, ` .env: ${check.envParentName} (missing -shared)`, '');
135
- }
136
- }
137
- return result;
138
- }
139
- /**
140
- * Print validation result to console
141
- */
142
- export function printValidationResult(result) {
143
- console.log('\n🔍 Validating Parent Repo Setup...\n');
144
- // Show current setup
145
- console.log('📋 Current Setup:\n');
146
- console.log(` Config (parentRepoName): ${result.configName || chalk.gray('<not set>')}`);
147
- console.log(` Git Remote (origin): ${result.gitRemoteName || chalk.gray('<not set>')}`);
148
- console.log(` .env (PARENT_REPO_NAME): ${result.envName || chalk.gray('<not set>')}`);
149
- console.log('');
150
- // Show errors
151
- if (result.errors.length > 0) {
152
- result.errors.forEach(error => {
153
- console.log(chalk.red(error));
154
- });
155
- console.log('');
156
- }
157
- // Show warnings
158
- if (result.warnings.length > 0) {
159
- result.warnings.forEach(warning => {
160
- console.log(chalk.yellow(warning));
161
- });
162
- console.log('');
163
- }
164
- // Summary
165
- console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
166
- if (result.valid && result.warnings.length === 0) {
167
- console.log(chalk.green('✅ All checks passed!'));
168
- console.log('\nYour parent repo setup is consistent across:');
169
- console.log(' ✓ .specweave/config.json');
170
- console.log(' ✓ git remote (origin)');
171
- if (result.envName) {
172
- console.log(' ✓ .env');
173
- }
174
- }
175
- else {
176
- if (!result.valid) {
177
- console.log(chalk.red(`❌ Validation failed with ${result.errors.length} error(s)`));
178
- }
179
- if (result.warnings.length > 0) {
180
- console.log(chalk.yellow(`⚠️ Found ${result.warnings.length} warning(s)`));
181
- }
182
- console.log('\nPlease fix the issues above before syncing to GitHub.');
183
- }
184
- console.log('');
185
- }
186
- /**
187
- * Validate and exit with error code if validation fails
188
- * Use this in CLI commands that require valid parent repo setup
189
- */
190
- export function validateOrExit(projectRoot) {
191
- const result = validateParentRepoSetup(projectRoot);
192
- printValidationResult(result);
193
- if (!result.valid) {
194
- process.exit(1);
195
- }
196
- // Show warnings but don't exit
197
- if (result.warnings.length > 0) {
198
- console.log(chalk.yellow('⚠️ Warnings detected but continuing...\n'));
199
- }
200
- }
201
- //# sourceMappingURL=parent-repo-validator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parent-repo-validator.js","sourceRoot":"","sources":["../../../../src/core/cicd/parent-repo-validator.ts"],"names":[],"mappings":"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"}