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.
Files changed (271) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -0
  3. package/dist/cli/commands/claude.d.ts +19 -0
  4. package/dist/cli/commands/claude.d.ts.map +1 -0
  5. package/dist/cli/commands/claude.js +107 -0
  6. package/dist/cli/commands/claude.js.map +1 -0
  7. package/dist/cli/commands/coverage.d.ts +37 -0
  8. package/dist/cli/commands/coverage.d.ts.map +1 -0
  9. package/dist/cli/commands/coverage.js +374 -0
  10. package/dist/cli/commands/coverage.js.map +1 -0
  11. package/dist/cli/commands/doctor.d.ts +30 -0
  12. package/dist/cli/commands/doctor.d.ts.map +1 -0
  13. package/dist/cli/commands/doctor.js +187 -0
  14. package/dist/cli/commands/doctor.js.map +1 -0
  15. package/dist/cli/commands/gaps.d.ts +52 -0
  16. package/dist/cli/commands/gaps.d.ts.map +1 -0
  17. package/dist/cli/commands/gaps.js +487 -0
  18. package/dist/cli/commands/gaps.js.map +1 -0
  19. package/dist/cli/commands/help.d.ts +7 -0
  20. package/dist/cli/commands/help.d.ts.map +1 -0
  21. package/dist/cli/commands/help.js +51 -0
  22. package/dist/cli/commands/help.js.map +1 -0
  23. package/dist/cli/commands/init.d.ts +39 -0
  24. package/dist/cli/commands/init.d.ts.map +1 -0
  25. package/dist/cli/commands/init.js +246 -0
  26. package/dist/cli/commands/init.js.map +1 -0
  27. package/dist/cli/commands/prd.d.ts +30 -0
  28. package/dist/cli/commands/prd.d.ts.map +1 -0
  29. package/dist/cli/commands/prd.js +179 -0
  30. package/dist/cli/commands/prd.js.map +1 -0
  31. package/dist/cli/commands/repo/add.d.ts +36 -0
  32. package/dist/cli/commands/repo/add.d.ts.map +1 -0
  33. package/dist/cli/commands/repo/add.js +303 -0
  34. package/dist/cli/commands/repo/add.js.map +1 -0
  35. package/dist/cli/commands/scope.d.ts +36 -0
  36. package/dist/cli/commands/scope.d.ts.map +1 -0
  37. package/dist/cli/commands/scope.js +312 -0
  38. package/dist/cli/commands/scope.js.map +1 -0
  39. package/dist/cli/commands/send.d.ts +43 -0
  40. package/dist/cli/commands/send.d.ts.map +1 -0
  41. package/dist/cli/commands/send.js +469 -0
  42. package/dist/cli/commands/send.js.map +1 -0
  43. package/dist/cli/commands/status.d.ts +32 -0
  44. package/dist/cli/commands/status.d.ts.map +1 -0
  45. package/dist/cli/commands/status.js +422 -0
  46. package/dist/cli/commands/status.js.map +1 -0
  47. package/dist/cli/commands/sync.d.ts +37 -0
  48. package/dist/cli/commands/sync.d.ts.map +1 -0
  49. package/dist/cli/commands/sync.js +299 -0
  50. package/dist/cli/commands/sync.js.map +1 -0
  51. package/dist/cli/commands/version.d.ts +7 -0
  52. package/dist/cli/commands/version.d.ts.map +1 -0
  53. package/dist/cli/commands/version.js +45 -0
  54. package/dist/cli/commands/version.js.map +1 -0
  55. package/dist/cli/index.d.ts +3 -0
  56. package/dist/cli/index.d.ts.map +1 -0
  57. package/dist/cli/index.js +65 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/cli/ui/components/ActiveScopes.d.ts +13 -0
  60. package/dist/cli/ui/components/ActiveScopes.d.ts.map +1 -0
  61. package/dist/cli/ui/components/ActiveScopes.js +25 -0
  62. package/dist/cli/ui/components/ActiveScopes.js.map +1 -0
  63. package/dist/cli/ui/components/EmptyState.d.ts +24 -0
  64. package/dist/cli/ui/components/EmptyState.d.ts.map +1 -0
  65. package/dist/cli/ui/components/EmptyState.js +13 -0
  66. package/dist/cli/ui/components/EmptyState.js.map +1 -0
  67. package/dist/cli/ui/components/Header.d.ts +11 -0
  68. package/dist/cli/ui/components/Header.d.ts.map +1 -0
  69. package/dist/cli/ui/components/Header.js +32 -0
  70. package/dist/cli/ui/components/Header.js.map +1 -0
  71. package/dist/cli/ui/components/PrdCoverage.d.ts +12 -0
  72. package/dist/cli/ui/components/PrdCoverage.d.ts.map +1 -0
  73. package/dist/cli/ui/components/PrdCoverage.js +15 -0
  74. package/dist/cli/ui/components/PrdCoverage.js.map +1 -0
  75. package/dist/cli/ui/components/RecentActivity.d.ts +12 -0
  76. package/dist/cli/ui/components/RecentActivity.d.ts.map +1 -0
  77. package/dist/cli/ui/components/RecentActivity.js +40 -0
  78. package/dist/cli/ui/components/RecentActivity.js.map +1 -0
  79. package/dist/cli/ui/components/RepoList.d.ts +12 -0
  80. package/dist/cli/ui/components/RepoList.d.ts.map +1 -0
  81. package/dist/cli/ui/components/RepoList.js +24 -0
  82. package/dist/cli/ui/components/RepoList.js.map +1 -0
  83. package/dist/cli/ui/components/Shortcuts.d.ts +7 -0
  84. package/dist/cli/ui/components/Shortcuts.d.ts.map +1 -0
  85. package/dist/cli/ui/components/Shortcuts.js +7 -0
  86. package/dist/cli/ui/components/Shortcuts.js.map +1 -0
  87. package/dist/cli/ui/components/index.d.ts +12 -0
  88. package/dist/cli/ui/components/index.d.ts.map +1 -0
  89. package/dist/cli/ui/components/index.js +12 -0
  90. package/dist/cli/ui/components/index.js.map +1 -0
  91. package/dist/cli/ui/dashboard.d.ts +9 -0
  92. package/dist/cli/ui/dashboard.d.ts.map +1 -0
  93. package/dist/cli/ui/dashboard.js +102 -0
  94. package/dist/cli/ui/dashboard.js.map +1 -0
  95. package/dist/core/commands.d.ts +32 -0
  96. package/dist/core/commands.d.ts.map +1 -0
  97. package/dist/core/commands.js +361 -0
  98. package/dist/core/commands.js.map +1 -0
  99. package/dist/core/config.d.ts +18 -0
  100. package/dist/core/config.d.ts.map +1 -0
  101. package/dist/core/config.js +78 -0
  102. package/dist/core/config.js.map +1 -0
  103. package/dist/core/coverage.d.ts +32 -0
  104. package/dist/core/coverage.d.ts.map +1 -0
  105. package/dist/core/coverage.js +286 -0
  106. package/dist/core/coverage.js.map +1 -0
  107. package/dist/core/dashboard/data.d.ts +73 -0
  108. package/dist/core/dashboard/data.d.ts.map +1 -0
  109. package/dist/core/dashboard/data.js +250 -0
  110. package/dist/core/dashboard/data.js.map +1 -0
  111. package/dist/core/dependencies.d.ts +39 -0
  112. package/dist/core/dependencies.d.ts.map +1 -0
  113. package/dist/core/dependencies.js +160 -0
  114. package/dist/core/dependencies.js.map +1 -0
  115. package/dist/core/doctor/auth.d.ts +22 -0
  116. package/dist/core/doctor/auth.d.ts.map +1 -0
  117. package/dist/core/doctor/auth.js +147 -0
  118. package/dist/core/doctor/auth.js.map +1 -0
  119. package/dist/core/doctor/config.d.ts +26 -0
  120. package/dist/core/doctor/config.d.ts.map +1 -0
  121. package/dist/core/doctor/config.js +172 -0
  122. package/dist/core/doctor/config.js.map +1 -0
  123. package/dist/core/doctor/environment.d.ts +26 -0
  124. package/dist/core/doctor/environment.d.ts.map +1 -0
  125. package/dist/core/doctor/environment.js +145 -0
  126. package/dist/core/doctor/environment.js.map +1 -0
  127. package/dist/core/doctor/index.d.ts +44 -0
  128. package/dist/core/doctor/index.d.ts.map +1 -0
  129. package/dist/core/doctor/index.js +134 -0
  130. package/dist/core/doctor/index.js.map +1 -0
  131. package/dist/core/doctor/repos.d.ts +22 -0
  132. package/dist/core/doctor/repos.d.ts.map +1 -0
  133. package/dist/core/doctor/repos.js +262 -0
  134. package/dist/core/doctor/repos.js.map +1 -0
  135. package/dist/core/doctor/sync.d.ts +18 -0
  136. package/dist/core/doctor/sync.d.ts.map +1 -0
  137. package/dist/core/doctor/sync.js +146 -0
  138. package/dist/core/doctor/sync.js.map +1 -0
  139. package/dist/core/gaps.d.ts +70 -0
  140. package/dist/core/gaps.d.ts.map +1 -0
  141. package/dist/core/gaps.js +448 -0
  142. package/dist/core/gaps.js.map +1 -0
  143. package/dist/core/github.d.ts +38 -0
  144. package/dist/core/github.d.ts.map +1 -0
  145. package/dist/core/github.js +102 -0
  146. package/dist/core/github.js.map +1 -0
  147. package/dist/core/prd/analyzer.d.ts +44 -0
  148. package/dist/core/prd/analyzer.d.ts.map +1 -0
  149. package/dist/core/prd/analyzer.js +259 -0
  150. package/dist/core/prd/analyzer.js.map +1 -0
  151. package/dist/core/prd/check.d.ts +17 -0
  152. package/dist/core/prd/check.d.ts.map +1 -0
  153. package/dist/core/prd/check.js +154 -0
  154. package/dist/core/prd/check.js.map +1 -0
  155. package/dist/core/prd/index.d.ts +6 -0
  156. package/dist/core/prd/index.d.ts.map +1 -0
  157. package/dist/core/prd/index.js +6 -0
  158. package/dist/core/prd/index.js.map +1 -0
  159. package/dist/core/project.d.ts +13 -0
  160. package/dist/core/project.d.ts.map +1 -0
  161. package/dist/core/project.js +810 -0
  162. package/dist/core/project.js.map +1 -0
  163. package/dist/core/prompts.d.ts +52 -0
  164. package/dist/core/prompts.d.ts.map +1 -0
  165. package/dist/core/prompts.js +266 -0
  166. package/dist/core/prompts.js.map +1 -0
  167. package/dist/core/repo/framework.d.ts +38 -0
  168. package/dist/core/repo/framework.d.ts.map +1 -0
  169. package/dist/core/repo/framework.js +142 -0
  170. package/dist/core/repo/framework.js.map +1 -0
  171. package/dist/core/repo/index.d.ts +6 -0
  172. package/dist/core/repo/index.d.ts.map +1 -0
  173. package/dist/core/repo/index.js +6 -0
  174. package/dist/core/repo/index.js.map +1 -0
  175. package/dist/core/repo/templates/claude-agents.d.ts +6 -0
  176. package/dist/core/repo/templates/claude-agents.d.ts.map +1 -0
  177. package/dist/core/repo/templates/claude-agents.js +173 -0
  178. package/dist/core/repo/templates/claude-agents.js.map +1 -0
  179. package/dist/core/repo/templates/claude-commands.d.ts +6 -0
  180. package/dist/core/repo/templates/claude-commands.d.ts.map +1 -0
  181. package/dist/core/repo/templates/claude-commands.js +278 -0
  182. package/dist/core/repo/templates/claude-commands.js.map +1 -0
  183. package/dist/core/repo/templates/claude-prompts.d.ts +6 -0
  184. package/dist/core/repo/templates/claude-prompts.d.ts.map +1 -0
  185. package/dist/core/repo/templates/claude-prompts.js +258 -0
  186. package/dist/core/repo/templates/claude-prompts.js.map +1 -0
  187. package/dist/core/repo/templates/claude-scripts.d.ts +6 -0
  188. package/dist/core/repo/templates/claude-scripts.d.ts.map +1 -0
  189. package/dist/core/repo/templates/claude-scripts.js +212 -0
  190. package/dist/core/repo/templates/claude-scripts.js.map +1 -0
  191. package/dist/core/repo/templates/index.d.ts +22 -0
  192. package/dist/core/repo/templates/index.d.ts.map +1 -0
  193. package/dist/core/repo/templates/index.js +121 -0
  194. package/dist/core/repo/templates/index.js.map +1 -0
  195. package/dist/core/repo/templates/vibe-readme.d.ts +6 -0
  196. package/dist/core/repo/templates/vibe-readme.d.ts.map +1 -0
  197. package/dist/core/repo/templates/vibe-readme.js +204 -0
  198. package/dist/core/repo/templates/vibe-readme.js.map +1 -0
  199. package/dist/core/repo/templates/vibe-scripts.d.ts +6 -0
  200. package/dist/core/repo/templates/vibe-scripts.d.ts.map +1 -0
  201. package/dist/core/repo/templates/vibe-scripts.js +308 -0
  202. package/dist/core/repo/templates/vibe-scripts.js.map +1 -0
  203. package/dist/core/repo/validation.d.ts +46 -0
  204. package/dist/core/repo/validation.d.ts.map +1 -0
  205. package/dist/core/repo/validation.js +154 -0
  206. package/dist/core/repo/validation.js.map +1 -0
  207. package/dist/core/runner.d.ts +38 -0
  208. package/dist/core/runner.d.ts.map +1 -0
  209. package/dist/core/runner.js +124 -0
  210. package/dist/core/runner.js.map +1 -0
  211. package/dist/core/send.d.ts +83 -0
  212. package/dist/core/send.d.ts.map +1 -0
  213. package/dist/core/send.js +565 -0
  214. package/dist/core/send.js.map +1 -0
  215. package/dist/core/status.d.ts +76 -0
  216. package/dist/core/status.d.ts.map +1 -0
  217. package/dist/core/status.js +430 -0
  218. package/dist/core/status.js.map +1 -0
  219. package/dist/core/sync/aggregator.d.ts +22 -0
  220. package/dist/core/sync/aggregator.d.ts.map +1 -0
  221. package/dist/core/sync/aggregator.js +278 -0
  222. package/dist/core/sync/aggregator.js.map +1 -0
  223. package/dist/core/sync/completion.d.ts +37 -0
  224. package/dist/core/sync/completion.d.ts.map +1 -0
  225. package/dist/core/sync/completion.js +264 -0
  226. package/dist/core/sync/completion.js.map +1 -0
  227. package/dist/core/sync/index.d.ts +51 -0
  228. package/dist/core/sync/index.d.ts.map +1 -0
  229. package/dist/core/sync/index.js +200 -0
  230. package/dist/core/sync/index.js.map +1 -0
  231. package/dist/core/sync/scanner.d.ts +39 -0
  232. package/dist/core/sync/scanner.d.ts.map +1 -0
  233. package/dist/core/sync/scanner.js +364 -0
  234. package/dist/core/sync/scanner.js.map +1 -0
  235. package/dist/types/config.d.ts +157 -0
  236. package/dist/types/config.d.ts.map +1 -0
  237. package/dist/types/config.js +58 -0
  238. package/dist/types/config.js.map +1 -0
  239. package/dist/types/coverage.d.ts +100 -0
  240. package/dist/types/coverage.d.ts.map +1 -0
  241. package/dist/types/coverage.js +8 -0
  242. package/dist/types/coverage.js.map +1 -0
  243. package/dist/types/doctor.d.ts +68 -0
  244. package/dist/types/doctor.d.ts.map +1 -0
  245. package/dist/types/doctor.js +5 -0
  246. package/dist/types/doctor.js.map +1 -0
  247. package/dist/types/gaps.d.ts +129 -0
  248. package/dist/types/gaps.d.ts.map +1 -0
  249. package/dist/types/gaps.js +8 -0
  250. package/dist/types/gaps.js.map +1 -0
  251. package/dist/types/prompts.d.ts +99 -0
  252. package/dist/types/prompts.d.ts.map +1 -0
  253. package/dist/types/prompts.js +5 -0
  254. package/dist/types/prompts.js.map +1 -0
  255. package/dist/types/runner.d.ts +156 -0
  256. package/dist/types/runner.d.ts.map +1 -0
  257. package/dist/types/runner.js +41 -0
  258. package/dist/types/runner.js.map +1 -0
  259. package/dist/types/send.d.ts +157 -0
  260. package/dist/types/send.d.ts.map +1 -0
  261. package/dist/types/send.js +18 -0
  262. package/dist/types/send.js.map +1 -0
  263. package/dist/types/status.d.ts +150 -0
  264. package/dist/types/status.d.ts.map +1 -0
  265. package/dist/types/status.js +15 -0
  266. package/dist/types/status.js.map +1 -0
  267. package/dist/types/sync.d.ts +259 -0
  268. package/dist/types/sync.d.ts.map +1 -0
  269. package/dist/types/sync.js +38 -0
  270. package/dist/types/sync.js.map +1 -0
  271. 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