vibe-fabric 0.1.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/LICENSE +21 -0
- package/README.md +171 -0
- package/dist/cli/commands/claude.d.ts +19 -0
- package/dist/cli/commands/claude.d.ts.map +1 -0
- package/dist/cli/commands/claude.js +107 -0
- package/dist/cli/commands/claude.js.map +1 -0
- package/dist/cli/commands/coverage.d.ts +37 -0
- package/dist/cli/commands/coverage.d.ts.map +1 -0
- package/dist/cli/commands/coverage.js +374 -0
- package/dist/cli/commands/coverage.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +30 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +187 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/gaps.d.ts +52 -0
- package/dist/cli/commands/gaps.d.ts.map +1 -0
- package/dist/cli/commands/gaps.js +487 -0
- package/dist/cli/commands/gaps.js.map +1 -0
- package/dist/cli/commands/help.d.ts +7 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +51 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/init.d.ts +39 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +246 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/prd.d.ts +30 -0
- package/dist/cli/commands/prd.d.ts.map +1 -0
- package/dist/cli/commands/prd.js +179 -0
- package/dist/cli/commands/prd.js.map +1 -0
- package/dist/cli/commands/repo/add.d.ts +36 -0
- package/dist/cli/commands/repo/add.d.ts.map +1 -0
- package/dist/cli/commands/repo/add.js +303 -0
- package/dist/cli/commands/repo/add.js.map +1 -0
- package/dist/cli/commands/scope.d.ts +36 -0
- package/dist/cli/commands/scope.d.ts.map +1 -0
- package/dist/cli/commands/scope.js +312 -0
- package/dist/cli/commands/scope.js.map +1 -0
- package/dist/cli/commands/send.d.ts +43 -0
- package/dist/cli/commands/send.d.ts.map +1 -0
- package/dist/cli/commands/send.js +469 -0
- package/dist/cli/commands/send.js.map +1 -0
- package/dist/cli/commands/status.d.ts +32 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +422 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +37 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +299 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/version.d.ts +7 -0
- package/dist/cli/commands/version.d.ts.map +1 -0
- package/dist/cli/commands/version.js +45 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +65 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/components/ActiveScopes.d.ts +13 -0
- package/dist/cli/ui/components/ActiveScopes.d.ts.map +1 -0
- package/dist/cli/ui/components/ActiveScopes.js +25 -0
- package/dist/cli/ui/components/ActiveScopes.js.map +1 -0
- package/dist/cli/ui/components/EmptyState.d.ts +24 -0
- package/dist/cli/ui/components/EmptyState.d.ts.map +1 -0
- package/dist/cli/ui/components/EmptyState.js +13 -0
- package/dist/cli/ui/components/EmptyState.js.map +1 -0
- package/dist/cli/ui/components/Header.d.ts +11 -0
- package/dist/cli/ui/components/Header.d.ts.map +1 -0
- package/dist/cli/ui/components/Header.js +32 -0
- package/dist/cli/ui/components/Header.js.map +1 -0
- package/dist/cli/ui/components/PrdCoverage.d.ts +12 -0
- package/dist/cli/ui/components/PrdCoverage.d.ts.map +1 -0
- package/dist/cli/ui/components/PrdCoverage.js +15 -0
- package/dist/cli/ui/components/PrdCoverage.js.map +1 -0
- package/dist/cli/ui/components/RecentActivity.d.ts +12 -0
- package/dist/cli/ui/components/RecentActivity.d.ts.map +1 -0
- package/dist/cli/ui/components/RecentActivity.js +40 -0
- package/dist/cli/ui/components/RecentActivity.js.map +1 -0
- package/dist/cli/ui/components/RepoList.d.ts +12 -0
- package/dist/cli/ui/components/RepoList.d.ts.map +1 -0
- package/dist/cli/ui/components/RepoList.js +24 -0
- package/dist/cli/ui/components/RepoList.js.map +1 -0
- package/dist/cli/ui/components/Shortcuts.d.ts +7 -0
- package/dist/cli/ui/components/Shortcuts.d.ts.map +1 -0
- package/dist/cli/ui/components/Shortcuts.js +7 -0
- package/dist/cli/ui/components/Shortcuts.js.map +1 -0
- package/dist/cli/ui/components/index.d.ts +12 -0
- package/dist/cli/ui/components/index.d.ts.map +1 -0
- package/dist/cli/ui/components/index.js +12 -0
- package/dist/cli/ui/components/index.js.map +1 -0
- package/dist/cli/ui/dashboard.d.ts +9 -0
- package/dist/cli/ui/dashboard.d.ts.map +1 -0
- package/dist/cli/ui/dashboard.js +102 -0
- package/dist/cli/ui/dashboard.js.map +1 -0
- package/dist/core/commands.d.ts +32 -0
- package/dist/core/commands.d.ts.map +1 -0
- package/dist/core/commands.js +361 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/config.d.ts +18 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +78 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/coverage.d.ts +32 -0
- package/dist/core/coverage.d.ts.map +1 -0
- package/dist/core/coverage.js +286 -0
- package/dist/core/coverage.js.map +1 -0
- package/dist/core/dashboard/data.d.ts +73 -0
- package/dist/core/dashboard/data.d.ts.map +1 -0
- package/dist/core/dashboard/data.js +250 -0
- package/dist/core/dashboard/data.js.map +1 -0
- package/dist/core/dependencies.d.ts +39 -0
- package/dist/core/dependencies.d.ts.map +1 -0
- package/dist/core/dependencies.js +160 -0
- package/dist/core/dependencies.js.map +1 -0
- package/dist/core/doctor/auth.d.ts +22 -0
- package/dist/core/doctor/auth.d.ts.map +1 -0
- package/dist/core/doctor/auth.js +147 -0
- package/dist/core/doctor/auth.js.map +1 -0
- package/dist/core/doctor/config.d.ts +26 -0
- package/dist/core/doctor/config.d.ts.map +1 -0
- package/dist/core/doctor/config.js +172 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/environment.d.ts +26 -0
- package/dist/core/doctor/environment.d.ts.map +1 -0
- package/dist/core/doctor/environment.js +145 -0
- package/dist/core/doctor/environment.js.map +1 -0
- package/dist/core/doctor/index.d.ts +44 -0
- package/dist/core/doctor/index.d.ts.map +1 -0
- package/dist/core/doctor/index.js +134 -0
- package/dist/core/doctor/index.js.map +1 -0
- package/dist/core/doctor/repos.d.ts +22 -0
- package/dist/core/doctor/repos.d.ts.map +1 -0
- package/dist/core/doctor/repos.js +262 -0
- package/dist/core/doctor/repos.js.map +1 -0
- package/dist/core/doctor/sync.d.ts +18 -0
- package/dist/core/doctor/sync.d.ts.map +1 -0
- package/dist/core/doctor/sync.js +146 -0
- package/dist/core/doctor/sync.js.map +1 -0
- package/dist/core/gaps.d.ts +70 -0
- package/dist/core/gaps.d.ts.map +1 -0
- package/dist/core/gaps.js +448 -0
- package/dist/core/gaps.js.map +1 -0
- package/dist/core/github.d.ts +38 -0
- package/dist/core/github.d.ts.map +1 -0
- package/dist/core/github.js +102 -0
- package/dist/core/github.js.map +1 -0
- package/dist/core/prd/analyzer.d.ts +44 -0
- package/dist/core/prd/analyzer.d.ts.map +1 -0
- package/dist/core/prd/analyzer.js +259 -0
- package/dist/core/prd/analyzer.js.map +1 -0
- package/dist/core/prd/check.d.ts +17 -0
- package/dist/core/prd/check.d.ts.map +1 -0
- package/dist/core/prd/check.js +154 -0
- package/dist/core/prd/check.js.map +1 -0
- package/dist/core/prd/index.d.ts +6 -0
- package/dist/core/prd/index.d.ts.map +1 -0
- package/dist/core/prd/index.js +6 -0
- package/dist/core/prd/index.js.map +1 -0
- package/dist/core/project.d.ts +13 -0
- package/dist/core/project.d.ts.map +1 -0
- package/dist/core/project.js +810 -0
- package/dist/core/project.js.map +1 -0
- package/dist/core/prompts.d.ts +52 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +266 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/repo/framework.d.ts +38 -0
- package/dist/core/repo/framework.d.ts.map +1 -0
- package/dist/core/repo/framework.js +142 -0
- package/dist/core/repo/framework.js.map +1 -0
- package/dist/core/repo/index.d.ts +6 -0
- package/dist/core/repo/index.d.ts.map +1 -0
- package/dist/core/repo/index.js +6 -0
- package/dist/core/repo/index.js.map +1 -0
- package/dist/core/repo/templates/claude-agents.d.ts +6 -0
- package/dist/core/repo/templates/claude-agents.d.ts.map +1 -0
- package/dist/core/repo/templates/claude-agents.js +173 -0
- package/dist/core/repo/templates/claude-agents.js.map +1 -0
- package/dist/core/repo/templates/claude-commands.d.ts +6 -0
- package/dist/core/repo/templates/claude-commands.d.ts.map +1 -0
- package/dist/core/repo/templates/claude-commands.js +278 -0
- package/dist/core/repo/templates/claude-commands.js.map +1 -0
- package/dist/core/repo/templates/claude-prompts.d.ts +6 -0
- package/dist/core/repo/templates/claude-prompts.d.ts.map +1 -0
- package/dist/core/repo/templates/claude-prompts.js +258 -0
- package/dist/core/repo/templates/claude-prompts.js.map +1 -0
- package/dist/core/repo/templates/claude-scripts.d.ts +6 -0
- package/dist/core/repo/templates/claude-scripts.d.ts.map +1 -0
- package/dist/core/repo/templates/claude-scripts.js +212 -0
- package/dist/core/repo/templates/claude-scripts.js.map +1 -0
- package/dist/core/repo/templates/index.d.ts +22 -0
- package/dist/core/repo/templates/index.d.ts.map +1 -0
- package/dist/core/repo/templates/index.js +121 -0
- package/dist/core/repo/templates/index.js.map +1 -0
- package/dist/core/repo/templates/vibe-readme.d.ts +6 -0
- package/dist/core/repo/templates/vibe-readme.d.ts.map +1 -0
- package/dist/core/repo/templates/vibe-readme.js +204 -0
- package/dist/core/repo/templates/vibe-readme.js.map +1 -0
- package/dist/core/repo/templates/vibe-scripts.d.ts +6 -0
- package/dist/core/repo/templates/vibe-scripts.d.ts.map +1 -0
- package/dist/core/repo/templates/vibe-scripts.js +308 -0
- package/dist/core/repo/templates/vibe-scripts.js.map +1 -0
- package/dist/core/repo/validation.d.ts +46 -0
- package/dist/core/repo/validation.d.ts.map +1 -0
- package/dist/core/repo/validation.js +154 -0
- package/dist/core/repo/validation.js.map +1 -0
- package/dist/core/runner.d.ts +38 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +124 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/send.d.ts +83 -0
- package/dist/core/send.d.ts.map +1 -0
- package/dist/core/send.js +565 -0
- package/dist/core/send.js.map +1 -0
- package/dist/core/status.d.ts +76 -0
- package/dist/core/status.d.ts.map +1 -0
- package/dist/core/status.js +430 -0
- package/dist/core/status.js.map +1 -0
- package/dist/core/sync/aggregator.d.ts +22 -0
- package/dist/core/sync/aggregator.d.ts.map +1 -0
- package/dist/core/sync/aggregator.js +278 -0
- package/dist/core/sync/aggregator.js.map +1 -0
- package/dist/core/sync/completion.d.ts +37 -0
- package/dist/core/sync/completion.d.ts.map +1 -0
- package/dist/core/sync/completion.js +264 -0
- package/dist/core/sync/completion.js.map +1 -0
- package/dist/core/sync/index.d.ts +51 -0
- package/dist/core/sync/index.d.ts.map +1 -0
- package/dist/core/sync/index.js +200 -0
- package/dist/core/sync/index.js.map +1 -0
- package/dist/core/sync/scanner.d.ts +39 -0
- package/dist/core/sync/scanner.d.ts.map +1 -0
- package/dist/core/sync/scanner.js +364 -0
- package/dist/core/sync/scanner.js.map +1 -0
- package/dist/types/config.d.ts +157 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +58 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/coverage.d.ts +100 -0
- package/dist/types/coverage.d.ts.map +1 -0
- package/dist/types/coverage.js +8 -0
- package/dist/types/coverage.js.map +1 -0
- package/dist/types/doctor.d.ts +68 -0
- package/dist/types/doctor.d.ts.map +1 -0
- package/dist/types/doctor.js +5 -0
- package/dist/types/doctor.js.map +1 -0
- package/dist/types/gaps.d.ts +129 -0
- package/dist/types/gaps.d.ts.map +1 -0
- package/dist/types/gaps.js +8 -0
- package/dist/types/gaps.js.map +1 -0
- package/dist/types/prompts.d.ts +99 -0
- package/dist/types/prompts.d.ts.map +1 -0
- package/dist/types/prompts.js +5 -0
- package/dist/types/prompts.js.map +1 -0
- package/dist/types/runner.d.ts +156 -0
- package/dist/types/runner.d.ts.map +1 -0
- package/dist/types/runner.js +41 -0
- package/dist/types/runner.js.map +1 -0
- package/dist/types/send.d.ts +157 -0
- package/dist/types/send.d.ts.map +1 -0
- package/dist/types/send.js +18 -0
- package/dist/types/send.js.map +1 -0
- package/dist/types/status.d.ts +150 -0
- package/dist/types/status.d.ts.map +1 -0
- package/dist/types/status.js +15 -0
- package/dist/types/status.js.map +1 -0
- package/dist/types/sync.d.ts +259 -0
- package/dist/types/sync.d.ts.map +1 -0
- package/dist/types/sync.js +38 -0
- package/dist/types/sync.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggregator for multi-repo sync results
|
|
3
|
+
* Combines per-repo status into overall progress view
|
|
4
|
+
*/
|
|
5
|
+
import { readdir } from 'fs/promises';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { STATUS_PRIORITY, } from '../../types/sync.js';
|
|
8
|
+
/**
|
|
9
|
+
* Get the minimum (lowest) status across multiple statuses
|
|
10
|
+
*/
|
|
11
|
+
export function getMinStatus(statuses) {
|
|
12
|
+
if (statuses.length === 0)
|
|
13
|
+
return 'unknown';
|
|
14
|
+
let minStatus = 'completed';
|
|
15
|
+
let minPriority = STATUS_PRIORITY.completed;
|
|
16
|
+
for (const status of statuses) {
|
|
17
|
+
const priority = STATUS_PRIORITY[status];
|
|
18
|
+
if (priority < minPriority) {
|
|
19
|
+
minPriority = priority;
|
|
20
|
+
minStatus = status;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return minStatus;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Count scopes in a hub directory
|
|
27
|
+
*/
|
|
28
|
+
async function countScopesInDir(projectPath, subdir) {
|
|
29
|
+
const dirPath = path.join(projectPath, 'docs', 'scopes', subdir);
|
|
30
|
+
try {
|
|
31
|
+
const files = await readdir(dirPath);
|
|
32
|
+
const scopeFiles = files.filter((f) => f.startsWith('SCOPE-') && f.endsWith('.md'));
|
|
33
|
+
const ids = scopeFiles.map((f) => f.replace('.md', '').split('-').slice(0, 2).join('-'));
|
|
34
|
+
return { count: scopeFiles.length, ids };
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { count: 0, ids: [] };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Aggregate sync results from multiple repositories
|
|
42
|
+
*/
|
|
43
|
+
export async function aggregateResults(repoResults, projectPath) {
|
|
44
|
+
const now = new Date().toISOString();
|
|
45
|
+
// Aggregate scope statuses across repos
|
|
46
|
+
const scopesByRepo = {};
|
|
47
|
+
const allScopeIds = new Set();
|
|
48
|
+
const activePlansList = [];
|
|
49
|
+
const blockers = [];
|
|
50
|
+
// Process each repo result
|
|
51
|
+
for (const result of repoResults) {
|
|
52
|
+
if (!result.success)
|
|
53
|
+
continue;
|
|
54
|
+
scopesByRepo[result.alias] = {};
|
|
55
|
+
// Collect all scope IDs
|
|
56
|
+
for (const scopeId of Object.keys(result.scopeStatus)) {
|
|
57
|
+
allScopeIds.add(scopeId);
|
|
58
|
+
const info = result.scopeStatus[scopeId];
|
|
59
|
+
if (info) {
|
|
60
|
+
let partsStr;
|
|
61
|
+
if (info.parts.length > 0) {
|
|
62
|
+
const completed = info.parts.filter((p) => p.status === 'completed').length;
|
|
63
|
+
const firstPart = info.parts[0];
|
|
64
|
+
const total = firstPart ? firstPart.total : 1;
|
|
65
|
+
partsStr = `${completed}/${total}`;
|
|
66
|
+
}
|
|
67
|
+
const repoScopes = scopesByRepo[result.alias];
|
|
68
|
+
if (repoScopes) {
|
|
69
|
+
repoScopes[scopeId] = {
|
|
70
|
+
status: info.status,
|
|
71
|
+
parts: partsStr,
|
|
72
|
+
plans: info.plans,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Collect active plans
|
|
78
|
+
activePlansList.push(...result.activePlans);
|
|
79
|
+
// Collect blockers
|
|
80
|
+
for (const plan of result.activePlans) {
|
|
81
|
+
if (plan.blocked && plan.sourceScope) {
|
|
82
|
+
blockers.push({
|
|
83
|
+
planId: plan.id,
|
|
84
|
+
repo: result.alias,
|
|
85
|
+
sourceScope: plan.sourceScope,
|
|
86
|
+
blockedBy: plan.blockedBy || 'Unknown',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Calculate overall status for each scope
|
|
92
|
+
const pendingScopes = [];
|
|
93
|
+
const inProgressScopes = [];
|
|
94
|
+
const completedScopes = [];
|
|
95
|
+
const blockedScopes = [];
|
|
96
|
+
for (const scopeId of allScopeIds) {
|
|
97
|
+
const byRepo = {};
|
|
98
|
+
const statuses = [];
|
|
99
|
+
let totalCompletion = 0;
|
|
100
|
+
let repoCount = 0;
|
|
101
|
+
let isBlocked = false;
|
|
102
|
+
let blockedBy = null;
|
|
103
|
+
for (const [repoAlias, scopes] of Object.entries(scopesByRepo)) {
|
|
104
|
+
if (scopes[scopeId]) {
|
|
105
|
+
const info = scopes[scopeId];
|
|
106
|
+
byRepo[repoAlias] = info;
|
|
107
|
+
statuses.push(info.status);
|
|
108
|
+
if (info.status === 'blocked') {
|
|
109
|
+
isBlocked = true;
|
|
110
|
+
// Find blocker info
|
|
111
|
+
const blocker = blockers.find((b) => b.sourceScope === scopeId && b.repo === repoAlias);
|
|
112
|
+
if (blocker) {
|
|
113
|
+
blockedBy = blocker.blockedBy;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Parse completion from parts string
|
|
117
|
+
if (info.parts) {
|
|
118
|
+
const parts = info.parts.split('/').map(Number);
|
|
119
|
+
const completed = parts[0] || 0;
|
|
120
|
+
const total = parts[1] || 1;
|
|
121
|
+
if (total > 0) {
|
|
122
|
+
totalCompletion += (completed / total) * 100;
|
|
123
|
+
repoCount++;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const overallStatus = getMinStatus(statuses);
|
|
129
|
+
const avgCompletion = repoCount > 0 ? Math.round(totalCompletion / repoCount) : undefined;
|
|
130
|
+
const aggregatedScope = {
|
|
131
|
+
id: scopeId,
|
|
132
|
+
overallStatus,
|
|
133
|
+
completionPercentage: avgCompletion,
|
|
134
|
+
blocked: isBlocked,
|
|
135
|
+
blockedBy,
|
|
136
|
+
byRepo,
|
|
137
|
+
};
|
|
138
|
+
switch (overallStatus) {
|
|
139
|
+
case 'pending':
|
|
140
|
+
pendingScopes.push(scopeId);
|
|
141
|
+
break;
|
|
142
|
+
case 'in_progress':
|
|
143
|
+
inProgressScopes.push(aggregatedScope);
|
|
144
|
+
break;
|
|
145
|
+
case 'completed':
|
|
146
|
+
completedScopes.push(scopeId);
|
|
147
|
+
break;
|
|
148
|
+
case 'blocked':
|
|
149
|
+
blockedScopes.push(aggregatedScope);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Count hub scopes
|
|
154
|
+
const [drafts, ready, sent, completed] = await Promise.all([
|
|
155
|
+
countScopesInDir(projectPath, 'drafts'),
|
|
156
|
+
countScopesInDir(projectPath, 'ready'),
|
|
157
|
+
countScopesInDir(projectPath, 'sent'),
|
|
158
|
+
countScopesInDir(projectPath, 'completed'),
|
|
159
|
+
]);
|
|
160
|
+
// Calculate per-repo stats
|
|
161
|
+
const byRepo = {};
|
|
162
|
+
for (const result of repoResults) {
|
|
163
|
+
if (!result.success)
|
|
164
|
+
continue;
|
|
165
|
+
const scopePending = Object.values(result.scopeStatus).filter((s) => s.status === 'pending').length;
|
|
166
|
+
const scopeInProgress = Object.values(result.scopeStatus).filter((s) => s.status === 'in_progress' || s.status === 'blocked').length;
|
|
167
|
+
const scopeCompleted = Object.values(result.scopeStatus).filter((s) => s.status === 'completed').length;
|
|
168
|
+
const totalScopes = scopePending + scopeInProgress + scopeCompleted;
|
|
169
|
+
const completionRate = totalScopes > 0 ? Math.round((scopeCompleted / totalScopes) * 100) : 0;
|
|
170
|
+
const blockedPlans = result.activePlans.filter((p) => p.blocked).length;
|
|
171
|
+
byRepo[result.alias] = {
|
|
172
|
+
scopes_pending: scopePending,
|
|
173
|
+
scopes_in_progress: scopeInProgress,
|
|
174
|
+
scopes_completed: scopeCompleted,
|
|
175
|
+
completion_rate: completionRate,
|
|
176
|
+
active_plans: result.activePlans.length,
|
|
177
|
+
completed_plans: result.completedPlans.length,
|
|
178
|
+
blocked_plans: blockedPlans,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// Calculate totals
|
|
182
|
+
const totalScopes = pendingScopes.length + inProgressScopes.length + completedScopes.length + blockedScopes.length;
|
|
183
|
+
const completionRate = totalScopes > 0
|
|
184
|
+
? Math.round((completedScopes.length / totalScopes) * 100)
|
|
185
|
+
: 0;
|
|
186
|
+
const totalActivePlans = repoResults.reduce((sum, r) => sum + r.activePlans.length, 0);
|
|
187
|
+
const totalCompletedPlans = repoResults.reduce((sum, r) => sum + r.completedPlans.length, 0);
|
|
188
|
+
const totalBlockedPlans = blockers.length;
|
|
189
|
+
// KB summary
|
|
190
|
+
const kbByRepo = {};
|
|
191
|
+
let totalKbEntries = 0;
|
|
192
|
+
for (const result of repoResults) {
|
|
193
|
+
if (result.success) {
|
|
194
|
+
kbByRepo[result.alias] = result.kbEntries;
|
|
195
|
+
totalKbEntries += result.kbEntries;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
generated_at: now,
|
|
200
|
+
summary: {
|
|
201
|
+
scopes_sent: sent.count,
|
|
202
|
+
scopes_completed: completedScopes.length,
|
|
203
|
+
scopes_in_progress: inProgressScopes.length,
|
|
204
|
+
scopes_pending: pendingScopes.length,
|
|
205
|
+
completion_rate: completionRate,
|
|
206
|
+
active_plans: totalActivePlans,
|
|
207
|
+
completed_plans: totalCompletedPlans,
|
|
208
|
+
blocked_plans: totalBlockedPlans,
|
|
209
|
+
},
|
|
210
|
+
hub_scopes: {
|
|
211
|
+
drafts,
|
|
212
|
+
ready,
|
|
213
|
+
sent,
|
|
214
|
+
completed,
|
|
215
|
+
},
|
|
216
|
+
scope_status: {
|
|
217
|
+
pending: pendingScopes,
|
|
218
|
+
in_progress: inProgressScopes,
|
|
219
|
+
completed: completedScopes,
|
|
220
|
+
blocked: blockedScopes,
|
|
221
|
+
},
|
|
222
|
+
by_repo: byRepo,
|
|
223
|
+
active_plans: activePlansList,
|
|
224
|
+
blockers,
|
|
225
|
+
blocked_scopes: blockedScopes.map((s) => s.id),
|
|
226
|
+
cross_repo_issues: [],
|
|
227
|
+
kb_summary: {
|
|
228
|
+
total_entries: totalKbEntries,
|
|
229
|
+
by_repo: kbByRepo,
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Detect scope status changes by comparing with previous aggregated data
|
|
235
|
+
*/
|
|
236
|
+
export function detectStatusChanges(previous, current) {
|
|
237
|
+
if (!previous)
|
|
238
|
+
return [];
|
|
239
|
+
const changes = [];
|
|
240
|
+
// Build status maps
|
|
241
|
+
const prevStatusMap = {};
|
|
242
|
+
for (const id of previous.scope_status.pending) {
|
|
243
|
+
prevStatusMap[id] = 'pending';
|
|
244
|
+
}
|
|
245
|
+
for (const scope of previous.scope_status.in_progress) {
|
|
246
|
+
prevStatusMap[scope.id] = 'in_progress';
|
|
247
|
+
}
|
|
248
|
+
for (const id of previous.scope_status.completed) {
|
|
249
|
+
prevStatusMap[id] = 'completed';
|
|
250
|
+
}
|
|
251
|
+
for (const scope of previous.scope_status.blocked) {
|
|
252
|
+
prevStatusMap[scope.id] = 'blocked';
|
|
253
|
+
}
|
|
254
|
+
const currStatusMap = {};
|
|
255
|
+
for (const id of current.scope_status.pending) {
|
|
256
|
+
currStatusMap[id] = 'pending';
|
|
257
|
+
}
|
|
258
|
+
for (const scope of current.scope_status.in_progress) {
|
|
259
|
+
currStatusMap[scope.id] = 'in_progress';
|
|
260
|
+
}
|
|
261
|
+
for (const id of current.scope_status.completed) {
|
|
262
|
+
currStatusMap[id] = 'completed';
|
|
263
|
+
}
|
|
264
|
+
for (const scope of current.scope_status.blocked) {
|
|
265
|
+
currStatusMap[scope.id] = 'blocked';
|
|
266
|
+
}
|
|
267
|
+
// Find changes
|
|
268
|
+
const allIds = new Set([...Object.keys(prevStatusMap), ...Object.keys(currStatusMap)]);
|
|
269
|
+
for (const id of allIds) {
|
|
270
|
+
const prev = prevStatusMap[id] || 'unknown';
|
|
271
|
+
const curr = currStatusMap[id] || 'unknown';
|
|
272
|
+
if (prev !== curr && prev !== 'unknown' && curr !== 'unknown') {
|
|
273
|
+
changes.push({ scopeId: id, from: prev, to: curr });
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return changes;
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=aggregator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../../../src/core/sync/aggregator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Completion handler for auto-moving scopes and updating PRD
|
|
3
|
+
*/
|
|
4
|
+
import { AggregatedProgress, ScopeStatusChange, PrdUpdate } from '../../types/sync.js';
|
|
5
|
+
/**
|
|
6
|
+
* Find scopes that are completed across all repos and should be moved
|
|
7
|
+
*/
|
|
8
|
+
export declare function findCompletedScopes(aggregated: AggregatedProgress, sentScopeIds: string[]): string[];
|
|
9
|
+
/**
|
|
10
|
+
* Move a scope from sent/ to completed/
|
|
11
|
+
*/
|
|
12
|
+
export declare function moveScopeToCompleted(projectPath: string, scopeId: string): Promise<boolean>;
|
|
13
|
+
/**
|
|
14
|
+
* Move all completed scopes
|
|
15
|
+
*/
|
|
16
|
+
export declare function moveCompletedScopes(projectPath: string, scopeIds: string[]): Promise<string[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Get scope IDs from sent directory
|
|
19
|
+
*/
|
|
20
|
+
export declare function getSentScopeIds(projectPath: string): Promise<string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Update PRD requirement statuses based on completed scopes
|
|
23
|
+
*/
|
|
24
|
+
export declare function updatePrdStatuses(projectPath: string, completedScopeIds: string[]): Promise<PrdUpdate[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Update coverage.json with new status data
|
|
27
|
+
*/
|
|
28
|
+
export declare function updateCoverageJson(projectPath: string, aggregated: AggregatedProgress): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Build status change records
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildStatusChanges(changes: Array<{
|
|
33
|
+
scopeId: string;
|
|
34
|
+
from: string;
|
|
35
|
+
to: string;
|
|
36
|
+
}>, movedScopes: string[], aggregated: AggregatedProgress): ScopeStatusChange[];
|
|
37
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/core/sync/completion.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,EACV,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,kBAAkB,EAC9B,YAAY,EAAE,MAAM,EAAE,GACrB,MAAM,EAAE,CAcV;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAqElB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAe5E;AAgDD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,SAAS,EAAE,CAAC,CA0FtB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,EAC7D,WAAW,EAAE,MAAM,EAAE,EACrB,UAAU,EAAE,kBAAkB,GAC7B,iBAAiB,EAAE,CAqBrB"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Completion handler for auto-moving scopes and updating PRD
|
|
3
|
+
*/
|
|
4
|
+
import { readFile, writeFile, readdir, mkdir, unlink } from 'fs/promises';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* Find scopes that are completed across all repos and should be moved
|
|
9
|
+
*/
|
|
10
|
+
export function findCompletedScopes(aggregated, sentScopeIds) {
|
|
11
|
+
const completed = [];
|
|
12
|
+
// Get all completed scope IDs from aggregated data
|
|
13
|
+
const completedIds = new Set(aggregated.scope_status.completed);
|
|
14
|
+
// Check which sent scopes are now completed
|
|
15
|
+
for (const scopeId of sentScopeIds) {
|
|
16
|
+
if (completedIds.has(scopeId)) {
|
|
17
|
+
completed.push(scopeId);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return completed;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Move a scope from sent/ to completed/
|
|
24
|
+
*/
|
|
25
|
+
export async function moveScopeToCompleted(projectPath, scopeId) {
|
|
26
|
+
const sentDir = path.join(projectPath, 'docs', 'scopes', 'sent');
|
|
27
|
+
const completedDir = path.join(projectPath, 'docs', 'scopes', 'completed');
|
|
28
|
+
try {
|
|
29
|
+
// Find the scope file in sent/
|
|
30
|
+
const files = await readdir(sentDir);
|
|
31
|
+
const scopeFile = files.find((f) => f.startsWith(scopeId) && f.endsWith('.md'));
|
|
32
|
+
if (!scopeFile) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
const sourcePath = path.join(sentDir, scopeFile);
|
|
36
|
+
const destPath = path.join(completedDir, scopeFile);
|
|
37
|
+
// Ensure completed directory exists
|
|
38
|
+
if (!existsSync(completedDir)) {
|
|
39
|
+
await mkdir(completedDir, { recursive: true });
|
|
40
|
+
}
|
|
41
|
+
// Read the scope content
|
|
42
|
+
let content = await readFile(sourcePath, 'utf-8');
|
|
43
|
+
// Update status to completed
|
|
44
|
+
content = content.replace(/(\*\*Status\*\*\s*\|\s*)`?\w+`?/, '$1`completed`');
|
|
45
|
+
// Add completion metadata to tracking section
|
|
46
|
+
const completionInfo = {
|
|
47
|
+
completed_at: new Date().toISOString(),
|
|
48
|
+
completed_by: 'vibe sync (auto)',
|
|
49
|
+
};
|
|
50
|
+
// Try to update existing tracking section
|
|
51
|
+
const trackingMatch = content.match(/## Tracking\s*\n\n```json\n([\s\S]*?)\n```/);
|
|
52
|
+
if (trackingMatch && trackingMatch[1]) {
|
|
53
|
+
try {
|
|
54
|
+
const tracking = JSON.parse(trackingMatch[1]);
|
|
55
|
+
tracking.completed_at = completionInfo.completed_at;
|
|
56
|
+
tracking.completed_by = completionInfo.completed_by;
|
|
57
|
+
content = content.replace(/## Tracking\s*\n\n```json\n[\s\S]*?\n```/, `## Tracking\n\n\`\`\`json\n${JSON.stringify(tracking, null, 2)}\n\`\`\``);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Invalid JSON, append completion info
|
|
61
|
+
content += `\n\n## Completion\n\n- **Completed At:** ${completionInfo.completed_at}\n- **Completed By:** ${completionInfo.completed_by}\n`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// No tracking section, add completion info
|
|
66
|
+
content += `\n\n## Completion\n\n- **Completed At:** ${completionInfo.completed_at}\n- **Completed By:** ${completionInfo.completed_by}\n`;
|
|
67
|
+
}
|
|
68
|
+
// Write updated content to destination
|
|
69
|
+
await writeFile(destPath, content, 'utf-8');
|
|
70
|
+
// Remove source file (effectively move)
|
|
71
|
+
await unlink(sourcePath);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Move all completed scopes
|
|
80
|
+
*/
|
|
81
|
+
export async function moveCompletedScopes(projectPath, scopeIds) {
|
|
82
|
+
const moved = [];
|
|
83
|
+
for (const scopeId of scopeIds) {
|
|
84
|
+
const success = await moveScopeToCompleted(projectPath, scopeId);
|
|
85
|
+
if (success) {
|
|
86
|
+
moved.push(scopeId);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return moved;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get scope IDs from sent directory
|
|
93
|
+
*/
|
|
94
|
+
export async function getSentScopeIds(projectPath) {
|
|
95
|
+
const sentDir = path.join(projectPath, 'docs', 'scopes', 'sent');
|
|
96
|
+
try {
|
|
97
|
+
const files = await readdir(sentDir);
|
|
98
|
+
return files
|
|
99
|
+
.filter((f) => f.startsWith('SCOPE-') && f.endsWith('.md'))
|
|
100
|
+
.map((f) => {
|
|
101
|
+
const match = f.match(/(SCOPE-\d{3})/);
|
|
102
|
+
return match && match[1] ? match[1] : '';
|
|
103
|
+
})
|
|
104
|
+
.filter((id) => id !== '');
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Parse scope file to extract module info
|
|
112
|
+
*/
|
|
113
|
+
async function parseScopeModule(projectPath, scopeId) {
|
|
114
|
+
// Check in completed first, then sent
|
|
115
|
+
const dirs = ['completed', 'sent'];
|
|
116
|
+
for (const dir of dirs) {
|
|
117
|
+
const dirPath = path.join(projectPath, 'docs', 'scopes', dir);
|
|
118
|
+
try {
|
|
119
|
+
const files = await readdir(dirPath);
|
|
120
|
+
const scopeFile = files.find((f) => f.startsWith(scopeId) && f.endsWith('.md'));
|
|
121
|
+
if (!scopeFile)
|
|
122
|
+
continue;
|
|
123
|
+
const content = await readFile(path.join(dirPath, scopeFile), 'utf-8');
|
|
124
|
+
// Extract module
|
|
125
|
+
const moduleMatch = content.match(/\*\*Module\*\*\s*\|\s*`?([^|`\n]+)`?/);
|
|
126
|
+
const module = moduleMatch && moduleMatch[1] ? moduleMatch[1].trim() : undefined;
|
|
127
|
+
// Extract requirements from Requirements section
|
|
128
|
+
const requirements = [];
|
|
129
|
+
const reqSection = content.match(/## Requirements[\s\S]*?(?=\n##|$)/);
|
|
130
|
+
if (reqSection) {
|
|
131
|
+
const reqMatches = reqSection[0].matchAll(/REQ-[A-Z]+-\d+/g);
|
|
132
|
+
for (const match of reqMatches) {
|
|
133
|
+
requirements.push(match[0]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return { module, requirements };
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Update PRD requirement statuses based on completed scopes
|
|
146
|
+
*/
|
|
147
|
+
export async function updatePrdStatuses(projectPath, completedScopeIds) {
|
|
148
|
+
const updates = [];
|
|
149
|
+
for (const scopeId of completedScopeIds) {
|
|
150
|
+
const scopeInfo = await parseScopeModule(projectPath, scopeId);
|
|
151
|
+
if (!scopeInfo?.module)
|
|
152
|
+
continue;
|
|
153
|
+
// Find PRD module file
|
|
154
|
+
const modulesDir = path.join(projectPath, 'docs', 'prd', 'modules');
|
|
155
|
+
try {
|
|
156
|
+
// Search for module directory
|
|
157
|
+
const moduleDirs = await readdir(modulesDir);
|
|
158
|
+
let foundModuleDir = null;
|
|
159
|
+
for (const dir of moduleDirs) {
|
|
160
|
+
if (scopeInfo.module && (dir === scopeInfo.module || dir.includes(scopeInfo.module))) {
|
|
161
|
+
foundModuleDir = dir;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (!foundModuleDir)
|
|
166
|
+
continue;
|
|
167
|
+
// Read all files in module directory
|
|
168
|
+
const moduleDir = path.join(modulesDir, foundModuleDir);
|
|
169
|
+
const moduleFiles = await readdir(moduleDir);
|
|
170
|
+
for (const file of moduleFiles) {
|
|
171
|
+
if (!file.endsWith('.md') || file.startsWith('_'))
|
|
172
|
+
continue;
|
|
173
|
+
const filePath = path.join(moduleDir, file);
|
|
174
|
+
let content = await readFile(filePath, 'utf-8');
|
|
175
|
+
let modified = false;
|
|
176
|
+
// Find requirement ID in file
|
|
177
|
+
const reqIdMatch = content.match(/\*\*ID\*\*\s*\|\s*`?(REQ-[A-Z]+-\d+)`?/);
|
|
178
|
+
if (!reqIdMatch)
|
|
179
|
+
continue;
|
|
180
|
+
const reqId = reqIdMatch[1];
|
|
181
|
+
if (!reqId)
|
|
182
|
+
continue;
|
|
183
|
+
// Check if this requirement is in scope's requirements
|
|
184
|
+
if (scopeInfo.requirements && !scopeInfo.requirements.includes(reqId)) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
// Update status to implemented
|
|
188
|
+
const statusMatch = content.match(/(\*\*Status\*\*\s*\|\s*)`?(\w+)`?/);
|
|
189
|
+
if (statusMatch && statusMatch[2] !== 'implemented') {
|
|
190
|
+
content = content.replace(/(\*\*Status\*\*\s*\|\s*)`?\w+`?/, '$1`implemented`');
|
|
191
|
+
// Update Covered By field
|
|
192
|
+
const coveredByMatch = content.match(/\*\*Covered By\*\*\s*\|\s*([^|]+)/);
|
|
193
|
+
if (coveredByMatch && coveredByMatch[1]) {
|
|
194
|
+
const currentCoveredBy = coveredByMatch[1].trim();
|
|
195
|
+
if (currentCoveredBy === '-' || currentCoveredBy === '') {
|
|
196
|
+
content = content.replace(/(\*\*Covered By\*\*\s*\|\s*)[^|]+/, `$1${scopeId}`);
|
|
197
|
+
}
|
|
198
|
+
else if (!currentCoveredBy.includes(scopeId)) {
|
|
199
|
+
content = content.replace(/(\*\*Covered By\*\*\s*\|\s*)[^|]+/, `$1${currentCoveredBy}, ${scopeId}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
modified = true;
|
|
203
|
+
}
|
|
204
|
+
if (modified && foundModuleDir) {
|
|
205
|
+
await writeFile(filePath, content, 'utf-8');
|
|
206
|
+
updates.push({
|
|
207
|
+
module: foundModuleDir,
|
|
208
|
+
requirement: reqId,
|
|
209
|
+
status: 'implemented',
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// Module directory not found, skip
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return updates;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Update coverage.json with new status data
|
|
222
|
+
*/
|
|
223
|
+
export async function updateCoverageJson(projectPath, aggregated) {
|
|
224
|
+
const coveragePath = path.join(projectPath, 'docs', 'progress', 'coverage.json');
|
|
225
|
+
// Ensure progress directory exists
|
|
226
|
+
const progressDir = path.join(projectPath, 'docs', 'progress');
|
|
227
|
+
if (!existsSync(progressDir)) {
|
|
228
|
+
await mkdir(progressDir, { recursive: true });
|
|
229
|
+
}
|
|
230
|
+
const coverage = {
|
|
231
|
+
generated_at: aggregated.generated_at,
|
|
232
|
+
summary: aggregated.summary,
|
|
233
|
+
scope_status: {
|
|
234
|
+
pending: aggregated.scope_status.pending,
|
|
235
|
+
in_progress: aggregated.scope_status.in_progress.map((s) => s.id),
|
|
236
|
+
completed: aggregated.scope_status.completed,
|
|
237
|
+
blocked: aggregated.scope_status.blocked.map((s) => s.id),
|
|
238
|
+
},
|
|
239
|
+
by_repo: aggregated.by_repo,
|
|
240
|
+
};
|
|
241
|
+
await writeFile(coveragePath, JSON.stringify(coverage, null, 2), 'utf-8');
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Build status change records
|
|
245
|
+
*/
|
|
246
|
+
export function buildStatusChanges(changes, movedScopes, aggregated) {
|
|
247
|
+
const movedSet = new Set(movedScopes);
|
|
248
|
+
return changes.map((change) => {
|
|
249
|
+
// Find completion percentage if available
|
|
250
|
+
let completionPct;
|
|
251
|
+
const inProgressScope = aggregated.scope_status.in_progress.find((s) => s.id === change.scopeId);
|
|
252
|
+
if (inProgressScope?.completionPercentage) {
|
|
253
|
+
completionPct = inProgressScope.completionPercentage;
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
scopeId: change.scopeId,
|
|
257
|
+
from: change.from,
|
|
258
|
+
to: change.to,
|
|
259
|
+
autoMoved: movedSet.has(change.scopeId),
|
|
260
|
+
completionPercentage: completionPct,
|
|
261
|
+
};
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/core/sync/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main sync module - coordinates repository syncing
|
|
3
|
+
*/
|
|
4
|
+
import { Octokit } from 'octokit';
|
|
5
|
+
import { Config, Repo } from '../../types/config.js';
|
|
6
|
+
import { SyncConfig, SyncOptions, SyncResult, LastSyncData, AggregatedProgress } from '../../types/sync.js';
|
|
7
|
+
export * from './scanner.js';
|
|
8
|
+
export * from './aggregator.js';
|
|
9
|
+
export * from './completion.js';
|
|
10
|
+
/**
|
|
11
|
+
* Load sync configuration from project
|
|
12
|
+
*/
|
|
13
|
+
export declare function loadSyncConfig(_config: Config): SyncConfig;
|
|
14
|
+
/**
|
|
15
|
+
* Load last sync data
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadLastSync(projectPath: string): Promise<LastSyncData | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Save last sync data
|
|
20
|
+
*/
|
|
21
|
+
export declare function saveLastSync(projectPath: string, data: LastSyncData): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Load previous aggregated progress
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadAggregatedProgress(projectPath: string): Promise<AggregatedProgress | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Save aggregated progress
|
|
28
|
+
*/
|
|
29
|
+
export declare function saveAggregatedProgress(projectPath: string, data: AggregatedProgress): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Check if data is stale
|
|
32
|
+
*/
|
|
33
|
+
export declare function isDataStale(lastSync: LastSyncData | null, config: SyncConfig): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get time since last sync in human-readable format
|
|
36
|
+
*/
|
|
37
|
+
export declare function getTimeSinceLastSync(lastSync: LastSyncData | null): string;
|
|
38
|
+
/**
|
|
39
|
+
* Perform full sync operation
|
|
40
|
+
*/
|
|
41
|
+
export declare function performSync(octokit: Octokit, projectPath: string, config: Config, repos: Repo[], options: SyncOptions): Promise<SyncResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Check staleness only (--check mode)
|
|
44
|
+
*/
|
|
45
|
+
export declare function checkStaleness(projectPath: string, config: Config): Promise<{
|
|
46
|
+
isStale: boolean;
|
|
47
|
+
lastSync: string | null;
|
|
48
|
+
timeSinceSync: string;
|
|
49
|
+
threshold: number;
|
|
50
|
+
}>;
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|