specweave 1.0.520 → 1.0.522

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 (129) hide show
  1. package/.claude-plugin/README.md +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/README.md +1 -1
  4. package/bin/specweave.js +8 -8
  5. package/dist/plugins/specweave/lib/integrations/github/duplicate-detector.js +6 -6
  6. package/dist/plugins/specweave/lib/integrations/github/duplicate-detector.js.map +1 -1
  7. package/dist/plugins/specweave/lib/integrations/github/github-ac-comment-poster.d.ts.map +1 -1
  8. package/dist/plugins/specweave/lib/integrations/github/github-ac-comment-poster.js +34 -9
  9. package/dist/plugins/specweave/lib/integrations/github/github-ac-comment-poster.js.map +1 -1
  10. package/dist/plugins/specweave/lib/integrations/github/github-body-utils.d.ts +38 -0
  11. package/dist/plugins/specweave/lib/integrations/github/github-body-utils.d.ts.map +1 -0
  12. package/dist/plugins/specweave/lib/integrations/github/github-body-utils.js +50 -0
  13. package/dist/plugins/specweave/lib/integrations/github/github-body-utils.js.map +1 -0
  14. package/dist/plugins/specweave/lib/integrations/github/github-feature-sync.d.ts +0 -2
  15. package/dist/plugins/specweave/lib/integrations/github/github-feature-sync.d.ts.map +1 -1
  16. package/dist/plugins/specweave/lib/integrations/github/github-feature-sync.js +194 -173
  17. package/dist/plugins/specweave/lib/integrations/github/github-feature-sync.js.map +1 -1
  18. package/dist/src/adapters/codex/README.md +1 -1
  19. package/dist/src/adapters/gemini/README.md +1 -1
  20. package/dist/src/cli/commands/complete.d.ts +10 -7
  21. package/dist/src/cli/commands/complete.d.ts.map +1 -1
  22. package/dist/src/cli/commands/complete.js +60 -14
  23. package/dist/src/cli/commands/complete.js.map +1 -1
  24. package/dist/src/cli/commands/create-increment.d.ts.map +1 -1
  25. package/dist/src/cli/commands/create-increment.js +2 -10
  26. package/dist/src/cli/commands/create-increment.js.map +1 -1
  27. package/dist/src/cli/commands/evaluate-completion.d.ts.map +1 -1
  28. package/dist/src/cli/commands/evaluate-completion.js +8 -38
  29. package/dist/src/cli/commands/evaluate-completion.js.map +1 -1
  30. package/dist/src/cli/commands/init.d.ts.map +1 -1
  31. package/dist/src/cli/commands/init.js +25 -0
  32. package/dist/src/cli/commands/init.js.map +1 -1
  33. package/dist/src/cli/commands/save.js +1 -1
  34. package/dist/src/cli/commands/save.js.map +1 -1
  35. package/dist/src/cli/commands/sync-progress.d.ts.map +1 -1
  36. package/dist/src/cli/commands/sync-progress.js +10 -0
  37. package/dist/src/cli/commands/sync-progress.js.map +1 -1
  38. package/dist/src/cli/helpers/init/claude-settings-lsp.js +1 -1
  39. package/dist/src/cli/helpers/init/claude-settings-lsp.js.map +1 -1
  40. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts +1 -8
  41. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
  42. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +57 -88
  43. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
  44. package/dist/src/cli/helpers/issue-tracker/github.d.ts.map +1 -1
  45. package/dist/src/cli/helpers/issue-tracker/github.js +1 -3
  46. package/dist/src/cli/helpers/issue-tracker/github.js.map +1 -1
  47. package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
  48. package/dist/src/core/increment/completion-validator.js +2 -3
  49. package/dist/src/core/increment/completion-validator.js.map +1 -1
  50. package/dist/src/core/increment/increment-utils.d.ts +7 -7
  51. package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
  52. package/dist/src/core/increment/increment-utils.js +19 -13
  53. package/dist/src/core/increment/increment-utils.js.map +1 -1
  54. package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
  55. package/dist/src/core/increment/status-change-sync-trigger.js +9 -0
  56. package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
  57. package/dist/src/core/repo-structure/prompt-consolidator.d.ts +3 -17
  58. package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
  59. package/dist/src/core/repo-structure/prompt-consolidator.js +1 -55
  60. package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
  61. package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
  62. package/dist/src/core/repo-structure/repo-structure-manager.js +3 -1
  63. package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
  64. package/dist/src/core/repo-structure/setup-state-manager.d.ts.map +1 -1
  65. package/dist/src/core/repo-structure/setup-state-manager.js +2 -1
  66. package/dist/src/core/repo-structure/setup-state-manager.js.map +1 -1
  67. package/dist/src/core/repo-structure/setup-summary.js +1 -1
  68. package/dist/src/core/repo-structure/setup-summary.js.map +1 -1
  69. package/dist/src/core/sync-throttle.d.ts +49 -0
  70. package/dist/src/core/sync-throttle.d.ts.map +1 -0
  71. package/dist/src/core/sync-throttle.js +94 -0
  72. package/dist/src/core/sync-throttle.js.map +1 -0
  73. package/dist/src/dashboard/server/dashboard-server.js +1 -1
  74. package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
  75. package/dist/src/hooks/auto-create-external-issue.js +11 -0
  76. package/dist/src/hooks/auto-create-external-issue.js.map +1 -1
  77. package/dist/src/init/InitFlow.d.ts.map +1 -1
  78. package/dist/src/init/InitFlow.js +4 -8
  79. package/dist/src/init/InitFlow.js.map +1 -1
  80. package/dist/src/init/research/src/config/ConfigManager.js +1 -1
  81. package/dist/src/init/research/src/config/ConfigManager.js.map +1 -1
  82. package/dist/src/init/research/src/config/types.d.ts +0 -1
  83. package/dist/src/init/research/src/config/types.d.ts.map +1 -1
  84. package/dist/src/init/research/src/config/types.js +1 -1
  85. package/dist/src/init/research/src/config/types.js.map +1 -1
  86. package/dist/src/locales/de/cli.json +1 -1
  87. package/dist/src/locales/en/cli.json +1 -1
  88. package/dist/src/locales/es/cli.json +1 -1
  89. package/dist/src/locales/fr/cli.json +1 -1
  90. package/dist/src/locales/ja/cli.json +1 -1
  91. package/dist/src/locales/ko/cli.json +1 -1
  92. package/dist/src/locales/pt/cli.json +1 -1
  93. package/dist/src/locales/ru/cli.json +1 -1
  94. package/dist/src/locales/zh/cli.json +1 -1
  95. package/dist/src/utils/resolve-increment-id.d.ts +24 -0
  96. package/dist/src/utils/resolve-increment-id.d.ts.map +1 -0
  97. package/dist/src/utils/resolve-increment-id.js +53 -0
  98. package/dist/src/utils/resolve-increment-id.js.map +1 -0
  99. package/package.json +1 -1
  100. package/plugins/specweave/.claude-plugin/plugin.json +2 -2
  101. package/plugins/specweave/commands/import-external.md +4 -4
  102. package/plugins/specweave/lib/integrations/github/duplicate-detector.js +1 -1
  103. package/plugins/specweave/lib/integrations/github/duplicate-detector.ts +6 -6
  104. package/plugins/specweave/lib/integrations/github/github-ac-comment-poster.js +39 -13
  105. package/plugins/specweave/lib/integrations/github/github-ac-comment-poster.ts +43 -13
  106. package/plugins/specweave/lib/integrations/github/github-body-utils.js +15 -0
  107. package/plugins/specweave/lib/integrations/github/github-body-utils.ts +52 -0
  108. package/plugins/specweave/lib/integrations/github/github-feature-sync.js +160 -136
  109. package/plugins/specweave/lib/integrations/github/github-feature-sync.ts +49 -29
  110. package/plugins/specweave/skills/increment/SKILL.md +45 -88
  111. package/plugins/specweave/skills/team-lead/SKILL.md +68 -4
  112. package/scripts/check-node-version.js +1 -1
  113. package/src/templates/lsp-plugin/plugin.json +1 -1
  114. package/dist/src/core/migration/consolidation-engine.d.ts +0 -59
  115. package/dist/src/core/migration/consolidation-engine.d.ts.map +0 -1
  116. package/dist/src/core/migration/consolidation-engine.js +0 -177
  117. package/dist/src/core/migration/consolidation-engine.js.map +0 -1
  118. package/dist/src/core/migration/spec-project-mapper.d.ts +0 -51
  119. package/dist/src/core/migration/spec-project-mapper.d.ts.map +0 -1
  120. package/dist/src/core/migration/spec-project-mapper.js +0 -299
  121. package/dist/src/core/migration/spec-project-mapper.js.map +0 -1
  122. package/dist/src/core/migration/types.d.ts +0 -132
  123. package/dist/src/core/migration/types.d.ts.map +0 -1
  124. package/dist/src/core/migration/types.js +0 -10
  125. package/dist/src/core/migration/types.js.map +0 -1
  126. package/dist/src/core/migration/umbrella-migrator.d.ts +0 -58
  127. package/dist/src/core/migration/umbrella-migrator.d.ts.map +0 -1
  128. package/dist/src/core/migration/umbrella-migrator.js +0 -617
  129. package/dist/src/core/migration/umbrella-migrator.js.map +0 -1
@@ -1,617 +0,0 @@
1
- /**
2
- * Umbrella Migrator
3
- *
4
- * Converts single-repo SpecWeave projects to umbrella/multi-repo structure.
5
- * Creates a sibling umbrella directory and moves SpecWeave-managed files to it,
6
- * leaving the original project completely untouched.
7
- *
8
- * @module core/migration/umbrella-migrator
9
- */
10
- import * as fs from 'fs';
11
- import * as path from 'path';
12
- import { consoleLogger } from '../../utils/logger.js';
13
- import { isWorkingDirectoryClean, detectRepository } from '../../utils/git-utils.js';
14
- import { persistUmbrellaConfig } from '../living-docs/umbrella-detector.js';
15
- import { execFileNoThrow } from '../../utils/execFileNoThrow.js';
16
- /**
17
- * Classifies an existing umbrella directory to determine how to handle the collision.
18
- *
19
- * @param umbrellaPath - Path to the existing umbrella directory
20
- * @param projectRoot - Path to the original project (for checking backup manifest)
21
- * @returns Classification or null if directory doesn't exist
22
- */
23
- export async function classifyExistingUmbrella(umbrellaPath, projectRoot) {
24
- if (!fs.existsSync(umbrellaPath)) {
25
- return null;
26
- }
27
- // Check for .specweave/ inside umbrella (previous successful migration)
28
- if (fs.existsSync(path.join(umbrellaPath, '.specweave'))) {
29
- return 'previous-migration';
30
- }
31
- // Check for backup manifest at projectRoot (partial/failed migration)
32
- const manifestPath = path.join(projectRoot, BACKUP_DIR_NAME, MANIFEST_FILE);
33
- if (fs.existsSync(manifestPath)) {
34
- return 'partial-migration';
35
- }
36
- // Directory exists but no SpecWeave markers
37
- return 'unrelated';
38
- }
39
- // ---------------------------------------------------------------------------
40
- // Detection (T-002)
41
- // ---------------------------------------------------------------------------
42
- /**
43
- * Detects whether the current project is a single-repo SpecWeave project
44
- * eligible for umbrella migration.
45
- */
46
- export async function detectSingleRepoProject(projectRoot, logger = consoleLogger) {
47
- const configPath = path.join(projectRoot, '.specweave', 'config.json');
48
- if (!fs.existsSync(configPath)) {
49
- logger.debug('No .specweave/config.json found — not a SpecWeave project');
50
- return null;
51
- }
52
- let config;
53
- try {
54
- config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
55
- }
56
- catch {
57
- logger.warn('Could not parse .specweave/config.json');
58
- return null;
59
- }
60
- if (config.umbrella?.enabled) {
61
- logger.log('Project is already an umbrella — nothing to migrate');
62
- return null;
63
- }
64
- // Extract org name from config or git remote
65
- let orgName = config.repository?.organization || '';
66
- let repoName = config.project?.name || path.basename(projectRoot);
67
- if (!orgName) {
68
- const repo = await detectRepository('origin', projectRoot);
69
- if (repo) {
70
- orgName = repo.owner;
71
- if (!config.project?.name) {
72
- repoName = repo.repo;
73
- }
74
- }
75
- }
76
- return {
77
- projectRoot,
78
- configPath,
79
- orgName: orgName || path.basename(path.dirname(projectRoot)),
80
- repoName,
81
- hasClaudeMd: fs.existsSync(path.join(projectRoot, 'CLAUDE.md')),
82
- hasAgentsMd: fs.existsSync(path.join(projectRoot, 'AGENTS.md')),
83
- hasDocsSite: fs.existsSync(path.join(projectRoot, 'docs-site')),
84
- };
85
- }
86
- // ---------------------------------------------------------------------------
87
- // Plan generation (T-003)
88
- // ---------------------------------------------------------------------------
89
- /**
90
- * Generates an ordered migration plan from a candidate.
91
- */
92
- export function generateMigrationPlan(candidate, options = {}) {
93
- const umbrellaName = options.umbrellaName || `${candidate.repoName}-umb`;
94
- const umbrellaPath = options.umbrellaPath ||
95
- path.join(path.dirname(candidate.projectRoot), umbrellaName);
96
- const steps = [];
97
- // 1. Create umbrella directory
98
- steps.push({
99
- type: 'create-dir',
100
- destination: umbrellaPath,
101
- description: `Create umbrella directory: ${umbrellaName}/`,
102
- });
103
- // 2. Create repositories dir
104
- const reposDir = path.join(umbrellaPath, 'repositories', candidate.orgName);
105
- steps.push({
106
- type: 'create-dir',
107
- destination: reposDir,
108
- description: `Create repositories/${candidate.orgName}/`,
109
- });
110
- // 3. Move .specweave/
111
- steps.push({
112
- type: 'move',
113
- source: path.join(candidate.projectRoot, '.specweave'),
114
- destination: path.join(umbrellaPath, '.specweave'),
115
- description: 'Move .specweave/ to umbrella root',
116
- });
117
- // 4. Move CLAUDE.md (if exists)
118
- if (candidate.hasClaudeMd) {
119
- steps.push({
120
- type: 'move',
121
- source: path.join(candidate.projectRoot, 'CLAUDE.md'),
122
- destination: path.join(umbrellaPath, 'CLAUDE.md'),
123
- description: 'Move CLAUDE.md to umbrella root',
124
- });
125
- }
126
- // 5. Move AGENTS.md (if exists)
127
- if (candidate.hasAgentsMd) {
128
- steps.push({
129
- type: 'move',
130
- source: path.join(candidate.projectRoot, 'AGENTS.md'),
131
- destination: path.join(umbrellaPath, 'AGENTS.md'),
132
- description: 'Move AGENTS.md to umbrella root',
133
- });
134
- }
135
- // 6. Move docs-site/ (if exists)
136
- if (candidate.hasDocsSite) {
137
- steps.push({
138
- type: 'move',
139
- source: path.join(candidate.projectRoot, 'docs-site'),
140
- destination: path.join(umbrellaPath, 'docs-site'),
141
- description: 'Move docs-site/ to umbrella root',
142
- });
143
- }
144
- // 7. Update config.json with umbrella settings
145
- steps.push({
146
- type: 'update-config',
147
- destination: path.join(umbrellaPath, '.specweave', 'config.json'),
148
- description: `Set umbrella.enabled=true, register ${candidate.repoName} as first childRepo`,
149
- });
150
- return { candidate, steps, umbrellaPath, umbrellaName };
151
- }
152
- // ---------------------------------------------------------------------------
153
- // Backup (T-004)
154
- // ---------------------------------------------------------------------------
155
- /** Well-known backup directory name (outside .specweave/ so it survives the move) */
156
- const BACKUP_DIR_NAME = '.specweave-migration-backup';
157
- /** Manifest filename inside the backup directory */
158
- const MANIFEST_FILE = 'migration-manifest.json';
159
- /**
160
- * Creates a backup of .specweave/ before migration.
161
- * Backup is stored at `{projectRoot}/.specweave-migration-backup/` — outside
162
- * `.specweave/` so it survives when `.specweave/` is moved to the umbrella.
163
- */
164
- export async function createBackup(projectRoot, logger = consoleLogger) {
165
- const specweavePath = path.join(projectRoot, '.specweave');
166
- const backupDir = path.join(projectRoot, BACKUP_DIR_NAME);
167
- await fs.promises.mkdir(backupDir, { recursive: true });
168
- // Recursively copy .specweave/ contents
169
- await copyDirRecursive(specweavePath, backupDir);
170
- logger.log(` Backup created: ${backupDir}`);
171
- // Initialize migration log
172
- const logsDir = path.join(specweavePath, 'logs');
173
- await fs.promises.mkdir(logsDir, { recursive: true });
174
- const logFile = path.join(logsDir, 'migration.log');
175
- const entry = `[${new Date().toISOString()}] Migration backup created at ${backupDir}\n`;
176
- await fs.promises.appendFile(logFile, entry);
177
- return backupDir;
178
- }
179
- /**
180
- * Writes a migration manifest to the backup directory.
181
- * Records what was moved and where, enabling full rollback.
182
- */
183
- async function writeManifest(backupDir, manifest) {
184
- const manifestPath = path.join(backupDir, MANIFEST_FILE);
185
- await fs.promises.writeFile(manifestPath, JSON.stringify(manifest, null, 2));
186
- }
187
- /**
188
- * Reads the migration manifest from a backup directory.
189
- */
190
- async function readManifest(backupDir) {
191
- const manifestPath = path.join(backupDir, MANIFEST_FILE);
192
- try {
193
- const raw = await fs.promises.readFile(manifestPath, 'utf-8');
194
- return JSON.parse(raw);
195
- }
196
- catch {
197
- return null;
198
- }
199
- }
200
- /**
201
- * Recursively copy directory contents, skipping listed directories.
202
- */
203
- async function copyDirRecursive(src, dest, skipDirs = []) {
204
- const entries = await fs.promises.readdir(src, { withFileTypes: true });
205
- for (const entry of entries) {
206
- if (skipDirs.includes(entry.name))
207
- continue;
208
- const srcPath = path.join(src, entry.name);
209
- const destPath = path.join(dest, entry.name);
210
- if (entry.isDirectory()) {
211
- await fs.promises.mkdir(destPath, { recursive: true });
212
- await copyDirRecursive(srcPath, destPath, skipDirs);
213
- }
214
- else {
215
- await fs.promises.copyFile(srcPath, destPath);
216
- }
217
- }
218
- }
219
- // ---------------------------------------------------------------------------
220
- // Uncommitted changes guard (T-006)
221
- // ---------------------------------------------------------------------------
222
- /**
223
- * Checks for uncommitted changes and throws if dirty.
224
- */
225
- export async function guardUncommittedChanges(projectRoot) {
226
- const clean = await isWorkingDirectoryClean(projectRoot);
227
- if (!clean) {
228
- throw new Error('Uncommitted changes detected. Please commit or stash your changes before migrating.\n' +
229
- ' git add -A && git commit -m "pre-migration snapshot"\n' +
230
- ' — or —\n' +
231
- ' git stash');
232
- }
233
- }
234
- // ---------------------------------------------------------------------------
235
- // Execution (T-005)
236
- // ---------------------------------------------------------------------------
237
- /**
238
- * Executes a migration plan, moving files to the umbrella directory.
239
- */
240
- export async function executeMigration(plan, logger = consoleLogger) {
241
- const errors = [];
242
- let completed = 0;
243
- // Create backup first
244
- let backupPath;
245
- try {
246
- backupPath = await createBackup(plan.candidate.projectRoot, logger);
247
- }
248
- catch (err) {
249
- const msg = `Backup failed: ${err instanceof Error ? err.message : String(err)}`;
250
- logger.error(msg);
251
- return {
252
- success: false,
253
- stepsCompleted: 0,
254
- stepsTotal: plan.steps.length,
255
- errors: [msg],
256
- };
257
- }
258
- // Log target switches from projectRoot to umbrellaPath after .specweave/ moves
259
- let logRoot = plan.candidate.projectRoot;
260
- // Log start
261
- await appendMigrationLog(logRoot, `Migration started: ${plan.umbrellaName} at ${plan.umbrellaPath}`);
262
- for (const step of plan.steps) {
263
- try {
264
- await executeStep(step, plan, logger);
265
- completed++;
266
- // After .specweave/ move, switch log target to umbrella
267
- if (step.type === 'move' && step.description.includes('.specweave')) {
268
- logRoot = plan.umbrellaPath;
269
- }
270
- await appendMigrationLog(logRoot, ` Step ${completed}/${plan.steps.length}: ${step.description} — OK`);
271
- }
272
- catch (err) {
273
- const msg = `Step "${step.description}" failed: ${err instanceof Error ? err.message : String(err)}`;
274
- errors.push(msg);
275
- logger.error(msg);
276
- await appendMigrationLog(logRoot, ` FAILED: ${msg}`);
277
- break; // Stop on first failure
278
- }
279
- }
280
- const success = errors.length === 0;
281
- await appendMigrationLog(logRoot, `Migration ${success ? 'completed successfully' : 'failed'}`);
282
- // Write manifest to backup so rollback knows what was moved
283
- if (success && backupPath) {
284
- const movedItems = plan.steps
285
- .filter((s) => s.type === 'move' && s.source)
286
- .map((s) => ({
287
- source: path.relative(plan.candidate.projectRoot, s.source),
288
- destination: path.relative(plan.umbrellaPath, s.destination),
289
- }));
290
- await writeManifest(backupPath, {
291
- timestamp: new Date().toISOString(),
292
- umbrellaPath: plan.umbrellaPath,
293
- projectRoot: plan.candidate.projectRoot,
294
- movedItems,
295
- });
296
- }
297
- return {
298
- success,
299
- stepsCompleted: completed,
300
- stepsTotal: plan.steps.length,
301
- backupPath,
302
- errors,
303
- umbrellaPath: success ? plan.umbrellaPath : undefined,
304
- };
305
- }
306
- async function executeStep(step, plan, logger) {
307
- switch (step.type) {
308
- case 'create-dir':
309
- await fs.promises.mkdir(step.destination, { recursive: true });
310
- logger.log(` Created: ${path.relative(path.dirname(plan.umbrellaPath), step.destination)}`);
311
- break;
312
- case 'move':
313
- if (!step.source)
314
- throw new Error('Move step requires source');
315
- // Safety: refuse to overwrite existing destination
316
- if (fs.existsSync(step.destination)) {
317
- throw new Error(`Destination already exists: ${step.destination}. ` +
318
- 'Use collision handling or remove manually.');
319
- }
320
- // Use rename for same-filesystem moves, fall back to copy+delete
321
- try {
322
- await fs.promises.rename(step.source, step.destination);
323
- }
324
- catch {
325
- // Cross-device move: copy then delete
326
- const stat = await fs.promises.stat(step.source);
327
- if (stat.isDirectory()) {
328
- await fs.promises.mkdir(step.destination, { recursive: true });
329
- await copyDirRecursive(step.source, step.destination);
330
- await fs.promises.rm(step.source, { recursive: true });
331
- }
332
- else {
333
- await fs.promises.copyFile(step.source, step.destination);
334
- await fs.promises.unlink(step.source);
335
- }
336
- }
337
- logger.log(` Moved: ${path.basename(step.source)} -> umbrella`);
338
- break;
339
- case 'copy':
340
- if (!step.source)
341
- throw new Error('Copy step requires source');
342
- await fs.promises.copyFile(step.source, step.destination);
343
- logger.log(` Copied: ${path.basename(step.source)}`);
344
- break;
345
- case 'update-config': {
346
- // Update config.json with umbrella settings
347
- const configPath = step.destination;
348
- let config = {};
349
- if (fs.existsSync(configPath)) {
350
- try {
351
- config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
352
- }
353
- catch {
354
- // Start fresh
355
- }
356
- }
357
- const repoName = plan.candidate.repoName;
358
- const childRepo = {
359
- id: repoName,
360
- path: path.relative(plan.umbrellaPath, plan.candidate.projectRoot),
361
- name: repoName,
362
- prefix: repoName.substring(0, 3).toUpperCase(),
363
- };
364
- // Inherit global sync config so child repos route correctly by default
365
- const childSync = {};
366
- if (config.sync?.github?.owner && config.sync?.github?.repo) {
367
- childSync.github = { owner: config.sync.github.owner, repo: repoName };
368
- }
369
- if (config.sync?.jira?.projectKey) {
370
- childSync.jira = { projectKey: config.sync.jira.projectKey };
371
- }
372
- if (config.sync?.ado?.project) {
373
- childSync.ado = { organization: config.sync.ado.organization, project: config.sync.ado.project };
374
- }
375
- if (Object.keys(childSync).length > 0) {
376
- childRepo.sync = childSync;
377
- }
378
- // Derive umbrella project name from directory (e.g., "my-umbrella-project")
379
- const umbrellaProjectName = path.basename(plan.umbrellaPath);
380
- config.umbrella = {
381
- enabled: true,
382
- projectName: umbrellaProjectName,
383
- childRepos: [childRepo],
384
- };
385
- // Copy existing sync config to umbrella.sync so umbrella-scoped
386
- // increments route to the umbrella repo (not to a child repo)
387
- if (config.sync?.github?.owner && config.sync?.github?.repo) {
388
- config.umbrella.sync = {
389
- github: { owner: config.sync.github.owner, repo: config.sync.github.repo },
390
- };
391
- if (config.sync?.jira?.projectKey) {
392
- config.umbrella.sync.jira = { projectKey: config.sync.jira.projectKey };
393
- }
394
- if (config.sync?.ado?.project) {
395
- config.umbrella.sync.ado = { project: config.sync.ado.project };
396
- }
397
- }
398
- // Ensure directory exists (config.json was moved as part of .specweave/)
399
- const configDir = path.dirname(configPath);
400
- if (!fs.existsSync(configDir)) {
401
- await fs.promises.mkdir(configDir, { recursive: true });
402
- }
403
- await fs.promises.writeFile(configPath, JSON.stringify(config, null, 2));
404
- logger.log(` Config updated: umbrella.enabled=true, projectName=${umbrellaProjectName}, childRepo=${repoName}`);
405
- break;
406
- }
407
- case 'create-file':
408
- await fs.promises.writeFile(step.destination, '', 'utf-8');
409
- logger.log(` Created: ${path.basename(step.destination)}`);
410
- break;
411
- }
412
- }
413
- // ---------------------------------------------------------------------------
414
- // Rollback (T-007)
415
- // ---------------------------------------------------------------------------
416
- /**
417
- * Rolls back a migration using the backup.
418
- * Looks for backup at `{projectRoot}/.specweave-migration-backup/`.
419
- * If a manifest exists, also restores moved files (CLAUDE.md, AGENTS.md, docs-site).
420
- */
421
- export async function rollbackMigration(projectRoot, logger = consoleLogger) {
422
- const backupDir = path.join(projectRoot, BACKUP_DIR_NAME);
423
- if (!fs.existsSync(backupDir)) {
424
- return {
425
- success: false,
426
- stepsCompleted: 0,
427
- stepsTotal: 1,
428
- errors: ['No migration backup found. Cannot rollback.'],
429
- };
430
- }
431
- // Validate backup has config.json
432
- const backupConfigPath = path.join(backupDir, 'config.json');
433
- if (!fs.existsSync(backupConfigPath)) {
434
- return {
435
- success: false,
436
- stepsCompleted: 0,
437
- stepsTotal: 1,
438
- errors: ['Backup is invalid: missing config.json'],
439
- };
440
- }
441
- logger.log(`Rolling back from backup: ${backupDir}`);
442
- try {
443
- // Read manifest to know what was moved
444
- const manifest = await readManifest(backupDir);
445
- // If manifest exists, restore moved files from umbrella back to project
446
- if (manifest) {
447
- for (const item of manifest.movedItems) {
448
- const umbrellaItem = path.join(manifest.umbrellaPath, item.destination);
449
- const projectItem = path.join(projectRoot, item.source);
450
- if (fs.existsSync(umbrellaItem)) {
451
- // Ensure parent directory exists
452
- await fs.promises.mkdir(path.dirname(projectItem), { recursive: true });
453
- try {
454
- await fs.promises.rename(umbrellaItem, projectItem);
455
- }
456
- catch {
457
- // Cross-device: copy then delete
458
- const stat = await fs.promises.stat(umbrellaItem);
459
- if (stat.isDirectory()) {
460
- await fs.promises.mkdir(projectItem, { recursive: true });
461
- await copyDirRecursive(umbrellaItem, projectItem);
462
- await fs.promises.rm(umbrellaItem, { recursive: true });
463
- }
464
- else {
465
- await fs.promises.copyFile(umbrellaItem, projectItem);
466
- await fs.promises.unlink(umbrellaItem);
467
- }
468
- }
469
- logger.log(` Restored: ${item.source}`);
470
- }
471
- }
472
- // Clean up empty umbrella directory
473
- if (fs.existsSync(manifest.umbrellaPath)) {
474
- try {
475
- await fs.promises.rm(manifest.umbrellaPath, { recursive: true });
476
- logger.log(` Removed umbrella directory: ${manifest.umbrellaPath}`);
477
- }
478
- catch {
479
- logger.warn(' Could not remove umbrella directory (may have user files)');
480
- }
481
- }
482
- }
483
- else {
484
- // Legacy fallback: no manifest, just restore .specweave/ from backup
485
- const specweavePath = path.join(projectRoot, '.specweave');
486
- await fs.promises.mkdir(specweavePath, { recursive: true });
487
- // Remove current .specweave/ contents
488
- const currentEntries = await fs.promises.readdir(specweavePath);
489
- for (const entry of currentEntries) {
490
- const entryPath = path.join(specweavePath, entry);
491
- await fs.promises.rm(entryPath, { recursive: true });
492
- }
493
- // Copy backup contents back (skip manifest file)
494
- await copyDirRecursive(backupDir, specweavePath, [MANIFEST_FILE]);
495
- }
496
- // Clean up backup directory
497
- await fs.promises.rm(backupDir, { recursive: true });
498
- await appendMigrationLog(projectRoot, `Rollback completed from ${backupDir}`);
499
- logger.log(' Rollback completed successfully');
500
- return {
501
- success: true,
502
- stepsCompleted: 1,
503
- stepsTotal: 1,
504
- backupPath: backupDir,
505
- errors: [],
506
- };
507
- }
508
- catch (err) {
509
- const msg = `Rollback failed: ${err instanceof Error ? err.message : String(err)}`;
510
- logger.error(msg);
511
- return {
512
- success: false,
513
- stepsCompleted: 0,
514
- stepsTotal: 1,
515
- errors: [msg],
516
- };
517
- }
518
- }
519
- // ---------------------------------------------------------------------------
520
- // Add Repo (T-010)
521
- // ---------------------------------------------------------------------------
522
- /**
523
- * Adds a new repository to an existing umbrella workspace.
524
- */
525
- export async function addRepoToUmbrella(umbrellaPath, repoName, orgName, options = {}, logger = consoleLogger) {
526
- const repoDir = path.join(umbrellaPath, 'repositories', orgName, repoName);
527
- // Check if gh CLI is available
528
- const ghAvailable = await isGhCliAvailable();
529
- if (ghAvailable) {
530
- // Create via gh CLI
531
- const fullName = `${orgName}/${repoName}`;
532
- const args = ['repo', 'create', fullName, '--clone'];
533
- if (options.description)
534
- args.push('--description', options.description);
535
- if (options.visibility === 'public') {
536
- args.push('--public');
537
- }
538
- else {
539
- args.push('--private');
540
- }
541
- logger.log(` Creating GitHub repo: ${fullName}`);
542
- // Ensure parent directory exists
543
- const parentDir = path.join(umbrellaPath, 'repositories', orgName);
544
- await fs.promises.mkdir(parentDir, { recursive: true });
545
- const result = await execFileNoThrow('gh', args, { cwd: parentDir });
546
- if (result.exitCode !== 0) {
547
- // Fall back to local directory
548
- logger.warn(` gh repo create failed: ${result.stderr}`);
549
- logger.log(' Falling back to local directory creation');
550
- await fs.promises.mkdir(repoDir, { recursive: true });
551
- }
552
- }
553
- else {
554
- logger.log(' gh CLI not available — creating local directory only');
555
- logger.log(' To create GitHub repos, install gh: https://cli.github.com/');
556
- await fs.promises.mkdir(repoDir, { recursive: true });
557
- }
558
- // Register in config using persistUmbrellaConfig for dedup-safe merge
559
- const prefix = options.prefix || repoName.substring(0, 3).toUpperCase();
560
- await persistUmbrellaConfig(umbrellaPath, {
561
- enabled: true,
562
- childRepos: [{
563
- id: repoName,
564
- path: `repositories/${orgName}/${repoName}`,
565
- name: repoName,
566
- }],
567
- });
568
- // Also persist the prefix (persistUmbrellaConfig doesn't handle it)
569
- const configPath = path.join(umbrellaPath, '.specweave', 'config.json');
570
- if (fs.existsSync(configPath)) {
571
- try {
572
- const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
573
- const repo = config.umbrella?.childRepos?.find((r) => r.id === repoName);
574
- if (repo) {
575
- repo.prefix = prefix;
576
- await fs.promises.writeFile(configPath, JSON.stringify(config, null, 2));
577
- }
578
- }
579
- catch {
580
- // Non-fatal
581
- }
582
- }
583
- logger.log(` Registered ${repoName} in umbrella config (prefix: ${prefix})`);
584
- return {
585
- success: true,
586
- repoName,
587
- repoPath: repoDir,
588
- usedGhCli: ghAvailable,
589
- };
590
- }
591
- /**
592
- * Checks if gh CLI is available and authenticated.
593
- */
594
- async function isGhCliAvailable() {
595
- const whichResult = await execFileNoThrow('which', ['gh']);
596
- if (whichResult.exitCode !== 0)
597
- return false;
598
- const authResult = await execFileNoThrow('gh', ['auth', 'status']);
599
- return authResult.exitCode === 0;
600
- }
601
- // ---------------------------------------------------------------------------
602
- // Utilities
603
- // ---------------------------------------------------------------------------
604
- async function appendMigrationLog(projectRoot, message) {
605
- const logFile = path.join(projectRoot, '.specweave', 'logs', 'migration.log');
606
- try {
607
- const logsDir = path.dirname(logFile);
608
- if (!fs.existsSync(logsDir)) {
609
- await fs.promises.mkdir(logsDir, { recursive: true });
610
- }
611
- await fs.promises.appendFile(logFile, `[${new Date().toISOString()}] ${message}\n`);
612
- }
613
- catch {
614
- // Logging failure is non-fatal
615
- }
616
- }
617
- //# sourceMappingURL=umbrella-migrator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"umbrella-migrator.js","sourceRoot":"","sources":["../../../../src/core/migration/umbrella-migrator.ts"],"names":[],"mappings":"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"}