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.
- package/.claude-plugin/README.md +1 -1
- package/CLAUDE.md +1 -1
- package/README.md +1 -1
- package/bin/specweave.js +8 -8
- package/dist/plugins/specweave/lib/integrations/github/duplicate-detector.js +6 -6
- package/dist/plugins/specweave/lib/integrations/github/duplicate-detector.js.map +1 -1
- package/dist/plugins/specweave/lib/integrations/github/github-ac-comment-poster.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/integrations/github/github-ac-comment-poster.js +34 -9
- package/dist/plugins/specweave/lib/integrations/github/github-ac-comment-poster.js.map +1 -1
- package/dist/plugins/specweave/lib/integrations/github/github-body-utils.d.ts +38 -0
- package/dist/plugins/specweave/lib/integrations/github/github-body-utils.d.ts.map +1 -0
- package/dist/plugins/specweave/lib/integrations/github/github-body-utils.js +50 -0
- package/dist/plugins/specweave/lib/integrations/github/github-body-utils.js.map +1 -0
- package/dist/plugins/specweave/lib/integrations/github/github-feature-sync.d.ts +0 -2
- package/dist/plugins/specweave/lib/integrations/github/github-feature-sync.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/integrations/github/github-feature-sync.js +194 -173
- package/dist/plugins/specweave/lib/integrations/github/github-feature-sync.js.map +1 -1
- package/dist/src/adapters/codex/README.md +1 -1
- package/dist/src/adapters/gemini/README.md +1 -1
- package/dist/src/cli/commands/complete.d.ts +10 -7
- package/dist/src/cli/commands/complete.d.ts.map +1 -1
- package/dist/src/cli/commands/complete.js +60 -14
- package/dist/src/cli/commands/complete.js.map +1 -1
- package/dist/src/cli/commands/create-increment.d.ts.map +1 -1
- package/dist/src/cli/commands/create-increment.js +2 -10
- package/dist/src/cli/commands/create-increment.js.map +1 -1
- package/dist/src/cli/commands/evaluate-completion.d.ts.map +1 -1
- package/dist/src/cli/commands/evaluate-completion.js +8 -38
- package/dist/src/cli/commands/evaluate-completion.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +25 -0
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/save.js +1 -1
- package/dist/src/cli/commands/save.js.map +1 -1
- package/dist/src/cli/commands/sync-progress.d.ts.map +1 -1
- package/dist/src/cli/commands/sync-progress.js +10 -0
- package/dist/src/cli/commands/sync-progress.js.map +1 -1
- package/dist/src/cli/helpers/init/claude-settings-lsp.js +1 -1
- package/dist/src/cli/helpers/init/claude-settings-lsp.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts +1 -8
- 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 +57 -88
- 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 +1 -3
- package/dist/src/cli/helpers/issue-tracker/github.js.map +1 -1
- package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
- package/dist/src/core/increment/completion-validator.js +2 -3
- package/dist/src/core/increment/completion-validator.js.map +1 -1
- package/dist/src/core/increment/increment-utils.d.ts +7 -7
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
- package/dist/src/core/increment/increment-utils.js +19 -13
- package/dist/src/core/increment/increment-utils.js.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.js +9 -0
- package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts +3 -17
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.js +1 -55
- package/dist/src/core/repo-structure/prompt-consolidator.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 +3 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/repo-structure/setup-state-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/setup-state-manager.js +2 -1
- package/dist/src/core/repo-structure/setup-state-manager.js.map +1 -1
- package/dist/src/core/repo-structure/setup-summary.js +1 -1
- package/dist/src/core/repo-structure/setup-summary.js.map +1 -1
- package/dist/src/core/sync-throttle.d.ts +49 -0
- package/dist/src/core/sync-throttle.d.ts.map +1 -0
- package/dist/src/core/sync-throttle.js +94 -0
- package/dist/src/core/sync-throttle.js.map +1 -0
- package/dist/src/dashboard/server/dashboard-server.js +1 -1
- package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
- package/dist/src/hooks/auto-create-external-issue.js +11 -0
- package/dist/src/hooks/auto-create-external-issue.js.map +1 -1
- package/dist/src/init/InitFlow.d.ts.map +1 -1
- package/dist/src/init/InitFlow.js +4 -8
- package/dist/src/init/InitFlow.js.map +1 -1
- package/dist/src/init/research/src/config/ConfigManager.js +1 -1
- package/dist/src/init/research/src/config/ConfigManager.js.map +1 -1
- package/dist/src/init/research/src/config/types.d.ts +0 -1
- package/dist/src/init/research/src/config/types.d.ts.map +1 -1
- package/dist/src/init/research/src/config/types.js +1 -1
- package/dist/src/init/research/src/config/types.js.map +1 -1
- package/dist/src/locales/de/cli.json +1 -1
- package/dist/src/locales/en/cli.json +1 -1
- package/dist/src/locales/es/cli.json +1 -1
- package/dist/src/locales/fr/cli.json +1 -1
- package/dist/src/locales/ja/cli.json +1 -1
- package/dist/src/locales/ko/cli.json +1 -1
- package/dist/src/locales/pt/cli.json +1 -1
- package/dist/src/locales/ru/cli.json +1 -1
- package/dist/src/locales/zh/cli.json +1 -1
- package/dist/src/utils/resolve-increment-id.d.ts +24 -0
- package/dist/src/utils/resolve-increment-id.d.ts.map +1 -0
- package/dist/src/utils/resolve-increment-id.js +53 -0
- package/dist/src/utils/resolve-increment-id.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +2 -2
- package/plugins/specweave/commands/import-external.md +4 -4
- package/plugins/specweave/lib/integrations/github/duplicate-detector.js +1 -1
- package/plugins/specweave/lib/integrations/github/duplicate-detector.ts +6 -6
- package/plugins/specweave/lib/integrations/github/github-ac-comment-poster.js +39 -13
- package/plugins/specweave/lib/integrations/github/github-ac-comment-poster.ts +43 -13
- package/plugins/specweave/lib/integrations/github/github-body-utils.js +15 -0
- package/plugins/specweave/lib/integrations/github/github-body-utils.ts +52 -0
- package/plugins/specweave/lib/integrations/github/github-feature-sync.js +160 -136
- package/plugins/specweave/lib/integrations/github/github-feature-sync.ts +49 -29
- package/plugins/specweave/skills/increment/SKILL.md +45 -88
- package/plugins/specweave/skills/team-lead/SKILL.md +68 -4
- package/scripts/check-node-version.js +1 -1
- package/src/templates/lsp-plugin/plugin.json +1 -1
- package/dist/src/core/migration/consolidation-engine.d.ts +0 -59
- package/dist/src/core/migration/consolidation-engine.d.ts.map +0 -1
- package/dist/src/core/migration/consolidation-engine.js +0 -177
- package/dist/src/core/migration/consolidation-engine.js.map +0 -1
- package/dist/src/core/migration/spec-project-mapper.d.ts +0 -51
- package/dist/src/core/migration/spec-project-mapper.d.ts.map +0 -1
- package/dist/src/core/migration/spec-project-mapper.js +0 -299
- package/dist/src/core/migration/spec-project-mapper.js.map +0 -1
- package/dist/src/core/migration/types.d.ts +0 -132
- package/dist/src/core/migration/types.d.ts.map +0 -1
- package/dist/src/core/migration/types.js +0 -10
- package/dist/src/core/migration/types.js.map +0 -1
- package/dist/src/core/migration/umbrella-migrator.d.ts +0 -58
- package/dist/src/core/migration/umbrella-migrator.d.ts.map +0 -1
- package/dist/src/core/migration/umbrella-migrator.js +0 -617
- 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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"}
|