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,286 @@
1
+ /**
2
+ * Core coverage module - extended coverage analysis
3
+ *
4
+ * Provides detailed PRD coverage analysis with per-requirement
5
+ * breakdowns, status grouping, and scope linkage.
6
+ */
7
+ import { readFile, readdir } from 'fs/promises';
8
+ import { existsSync } from 'fs';
9
+ import path from 'path';
10
+ /**
11
+ * Parse scope files to get scope references
12
+ */
13
+ export async function loadScopes(projectPath) {
14
+ const scopes = [];
15
+ const scopesDir = path.join(projectPath, 'docs', 'scopes');
16
+ const directories = ['drafts', 'ready', 'sent', 'completed'];
17
+ for (const dir of directories) {
18
+ const dirPath = path.join(scopesDir, dir);
19
+ try {
20
+ if (!existsSync(dirPath))
21
+ continue;
22
+ const files = await readdir(dirPath);
23
+ const scopeFiles = files.filter((f) => f.startsWith('SCOPE-') && f.endsWith('.md'));
24
+ for (const file of scopeFiles) {
25
+ const filePath = path.join(dirPath, file);
26
+ const content = await readFile(filePath, 'utf-8');
27
+ // Extract scope ID
28
+ const idMatch = content.match(/\*\*ID\*\*\s*\|\s*`?(SCOPE-\d+)`?/);
29
+ const id = idMatch?.[1] ?? file.replace('.md', '');
30
+ // Extract title from first heading or summary section
31
+ const titleMatch = content.match(/^#\s+(.+?)(?:\n|$)/m);
32
+ const summaryMatch = content.match(/## Summary\s*\n\n([^\n]+)/);
33
+ const title = titleMatch?.[1]?.replace(/^SCOPE-\d+:\s*/, '') ??
34
+ summaryMatch?.[1] ??
35
+ id;
36
+ // Extract requirements this scope implements
37
+ const requirements = [];
38
+ // Look for requirements in the content (REQ-XXX-NNN pattern)
39
+ const reqMatches = content.matchAll(/REQ-[A-Z]+-\d+/g);
40
+ for (const match of reqMatches) {
41
+ if (!requirements.includes(match[0])) {
42
+ requirements.push(match[0]);
43
+ }
44
+ }
45
+ // Get completion date for completed scopes
46
+ let completedAt = null;
47
+ if (dir === 'completed') {
48
+ // Try to get from metadata or use file date
49
+ const dateMatch = content.match(/\*\*Completed\*\*\s*\|\s*([^\n|]+)/);
50
+ completedAt = dateMatch?.[1]?.trim() ?? null;
51
+ }
52
+ scopes.push({
53
+ id,
54
+ title,
55
+ status: dir === 'drafts' ? 'draft' :
56
+ dir === 'ready' ? 'ready' :
57
+ dir === 'sent' ? 'sent' : 'completed',
58
+ requirements,
59
+ completedAt,
60
+ });
61
+ }
62
+ }
63
+ catch {
64
+ // Directory doesn't exist or can't be read
65
+ }
66
+ }
67
+ return scopes;
68
+ }
69
+ /**
70
+ * Determine requirement status based on linked scopes
71
+ */
72
+ export function getRequirementStatus(reqId, scopes) {
73
+ const linkedScopes = scopes.filter((s) => s.requirements.includes(reqId));
74
+ if (linkedScopes.length === 0) {
75
+ return { status: 'not_started', scopeIds: [], completedAt: null };
76
+ }
77
+ const completed = linkedScopes.filter((s) => s.status === 'completed');
78
+ if (completed.length === linkedScopes.length) {
79
+ // All linked scopes are completed
80
+ const latestCompletion = completed
81
+ .map((s) => s.completedAt)
82
+ .filter(Boolean)
83
+ .sort()
84
+ .pop();
85
+ return {
86
+ status: 'implemented',
87
+ scopeIds: linkedScopes.map((s) => s.id),
88
+ completedAt: latestCompletion ?? null,
89
+ };
90
+ }
91
+ const inProgress = linkedScopes.filter((s) => s.status === 'sent' || s.status === 'ready');
92
+ if (inProgress.length > 0 || completed.length > 0) {
93
+ return {
94
+ status: 'in_progress',
95
+ scopeIds: linkedScopes.map((s) => s.id),
96
+ completedAt: null,
97
+ };
98
+ }
99
+ // Only drafts
100
+ return {
101
+ status: 'not_started',
102
+ scopeIds: linkedScopes.map((s) => s.id),
103
+ completedAt: null,
104
+ };
105
+ }
106
+ /**
107
+ * Parse a requirement file and extract details
108
+ */
109
+ async function parseRequirementFile(filePath, module, scopes) {
110
+ try {
111
+ const content = await readFile(filePath, 'utf-8');
112
+ // Check if this is a requirement file (has REQ- ID)
113
+ const idMatch = content.match(/\*\*ID\*\*\s*\|\s*`?(REQ-[A-Z]+-\d+)`?/);
114
+ if (!idMatch || !idMatch[1])
115
+ return null;
116
+ const id = idMatch[1];
117
+ // Extract title from first heading
118
+ const titleMatch = content.match(/^#\s+(?:REQ:\s*)?(.+?)(?:\n|$)/m);
119
+ const title = titleMatch?.[1] ?? id;
120
+ // Extract priority
121
+ const priorityMatch = content.match(/\*\*Priority\*\*\s*\|\s*`?(P[123])`?/);
122
+ const priority = priorityMatch?.[1] ?? 'P3';
123
+ // Get status based on scope linkage
124
+ const reqStatus = getRequirementStatus(id, scopes);
125
+ return {
126
+ id: id,
127
+ title: title,
128
+ status: reqStatus.status,
129
+ module,
130
+ priority: priority,
131
+ scopeId: reqStatus.scopeIds[0] ?? null,
132
+ scopeIds: reqStatus.scopeIds,
133
+ completedAt: reqStatus.completedAt,
134
+ };
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ /**
141
+ * Calculate extended coverage data with full requirement details
142
+ */
143
+ export async function calculateExtendedCoverage(projectPath) {
144
+ const data = {
145
+ totalRequirements: 0,
146
+ implementedRequirements: 0,
147
+ inProgressRequirements: 0,
148
+ notStartedRequirements: 0,
149
+ coveragePercentage: 0,
150
+ modules: [],
151
+ byStatus: {
152
+ implemented: [],
153
+ inProgress: [],
154
+ notStarted: [],
155
+ },
156
+ scopes: [],
157
+ };
158
+ const modulesDir = path.join(projectPath, 'docs', 'prd', 'modules');
159
+ // Load scopes first
160
+ const scopes = await loadScopes(projectPath);
161
+ data.scopes = scopes;
162
+ try {
163
+ if (!existsSync(modulesDir)) {
164
+ return data;
165
+ }
166
+ const moduleDirs = await readdir(modulesDir);
167
+ for (const moduleDir of moduleDirs) {
168
+ const modulePath = path.join(modulesDir, moduleDir);
169
+ const moduleCoverage = {
170
+ name: moduleDir,
171
+ total: 0,
172
+ implemented: 0,
173
+ inProgress: 0,
174
+ notStarted: 0,
175
+ percentage: 0,
176
+ requirements: [],
177
+ };
178
+ try {
179
+ const files = await readdir(modulePath);
180
+ for (const file of files) {
181
+ if (!file.endsWith('.md') || file.startsWith('_'))
182
+ continue;
183
+ const filePath = path.join(modulePath, file);
184
+ const req = await parseRequirementFile(filePath, moduleDir, scopes);
185
+ if (!req)
186
+ continue;
187
+ moduleCoverage.total++;
188
+ moduleCoverage.requirements.push(req);
189
+ // Update module counts
190
+ switch (req.status) {
191
+ case 'implemented':
192
+ moduleCoverage.implemented++;
193
+ data.byStatus.implemented.push(req);
194
+ break;
195
+ case 'in_progress':
196
+ moduleCoverage.inProgress++;
197
+ data.byStatus.inProgress.push(req);
198
+ break;
199
+ case 'not_started':
200
+ moduleCoverage.notStarted++;
201
+ data.byStatus.notStarted.push(req);
202
+ break;
203
+ }
204
+ }
205
+ // Calculate module percentage
206
+ if (moduleCoverage.total > 0) {
207
+ moduleCoverage.percentage = Math.round((moduleCoverage.implemented / moduleCoverage.total) * 100);
208
+ }
209
+ if (moduleCoverage.total > 0) {
210
+ data.modules.push(moduleCoverage);
211
+ }
212
+ }
213
+ catch {
214
+ // Can't read module directory
215
+ }
216
+ }
217
+ // Calculate totals
218
+ data.totalRequirements = data.modules.reduce((sum, m) => sum + m.total, 0);
219
+ data.implementedRequirements = data.modules.reduce((sum, m) => sum + m.implemented, 0);
220
+ data.inProgressRequirements = data.modules.reduce((sum, m) => sum + m.inProgress, 0);
221
+ data.notStartedRequirements = data.modules.reduce((sum, m) => sum + m.notStarted, 0);
222
+ if (data.totalRequirements > 0) {
223
+ data.coveragePercentage = Math.round((data.implementedRequirements / data.totalRequirements) * 100);
224
+ }
225
+ // Sort modules by coverage percentage (lowest first)
226
+ data.modules.sort((a, b) => a.percentage - b.percentage);
227
+ }
228
+ catch {
229
+ // Can't read modules directory
230
+ }
231
+ return data;
232
+ }
233
+ /**
234
+ * Get list of available module names
235
+ */
236
+ export async function getModuleNames(projectPath) {
237
+ const modulesDir = path.join(projectPath, 'docs', 'prd', 'modules');
238
+ try {
239
+ if (!existsSync(modulesDir)) {
240
+ return [];
241
+ }
242
+ const entries = await readdir(modulesDir, { withFileTypes: true });
243
+ return entries
244
+ .filter((e) => e.isDirectory())
245
+ .map((e) => e.name);
246
+ }
247
+ catch {
248
+ return [];
249
+ }
250
+ }
251
+ /**
252
+ * Convert coverage data to JSON output format
253
+ */
254
+ export function toCoverageJsonOutput(data) {
255
+ return {
256
+ timestamp: new Date().toISOString(),
257
+ summary: {
258
+ total: data.totalRequirements,
259
+ implemented: data.implementedRequirements,
260
+ inProgress: data.inProgressRequirements,
261
+ notStarted: data.notStartedRequirements,
262
+ percentage: data.coveragePercentage,
263
+ },
264
+ modules: data.modules.map((m) => ({
265
+ name: m.name,
266
+ total: m.total,
267
+ implemented: m.implemented,
268
+ inProgress: m.inProgress,
269
+ notStarted: m.notStarted,
270
+ percentage: m.percentage,
271
+ requirements: m.requirements.map((r) => ({
272
+ id: r.id,
273
+ title: r.title,
274
+ status: r.status,
275
+ scope: r.scopeId,
276
+ completedAt: r.completedAt,
277
+ })),
278
+ })),
279
+ byStatus: {
280
+ implemented: data.byStatus.implemented.map((r) => r.id),
281
+ inProgress: data.byStatus.inProgress.map((r) => r.id),
282
+ notStarted: data.byStatus.notStarted.map((r) => r.id),
283
+ },
284
+ };
285
+ }
286
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/core/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Dashboard data loading
3
+ * Loads data from config and sync-cache for dashboard display
4
+ */
5
+ /**
6
+ * Repository display info
7
+ */
8
+ export interface RepoInfo {
9
+ alias: string;
10
+ synced: boolean;
11
+ lastSync?: Date;
12
+ status: 'active' | 'planned' | 'archived';
13
+ }
14
+ /**
15
+ * PRD coverage info
16
+ */
17
+ export interface CoverageInfo {
18
+ percentage: number;
19
+ done: number;
20
+ total: number;
21
+ gaps: number;
22
+ }
23
+ /**
24
+ * Scope display info
25
+ */
26
+ export interface ScopeInfo {
27
+ id: string;
28
+ title: string;
29
+ target?: string;
30
+ status: 'draft' | 'sent' | 'in_progress' | 'completed';
31
+ progress: number;
32
+ }
33
+ /**
34
+ * Scope summary
35
+ */
36
+ export interface ScopeSummary {
37
+ active: number;
38
+ completed: number;
39
+ draft: number;
40
+ }
41
+ /**
42
+ * Activity item
43
+ */
44
+ export interface ActivityItem {
45
+ message: string;
46
+ timestamp: Date;
47
+ type: 'scope' | 'prd' | 'sync' | 'repo';
48
+ }
49
+ /**
50
+ * Dashboard header info
51
+ */
52
+ export interface HeaderInfo {
53
+ projectName: string;
54
+ version: string;
55
+ lastSync?: Date;
56
+ }
57
+ /**
58
+ * Complete dashboard data
59
+ */
60
+ export interface DashboardData {
61
+ hasProject: boolean;
62
+ header: HeaderInfo;
63
+ repos: RepoInfo[];
64
+ coverage: CoverageInfo;
65
+ scopes: ScopeInfo[];
66
+ scopeSummary: ScopeSummary;
67
+ activity: ActivityItem[];
68
+ }
69
+ /**
70
+ * Load all dashboard data
71
+ */
72
+ export declare function loadDashboardData(): Promise<DashboardData>;
73
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/core/dashboard/data.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,aAAa,GAAG,WAAW,CAAC;IACvD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAoMD;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAsEhE"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Dashboard data loading
3
+ * Loads data from config and sync-cache for dashboard display
4
+ */
5
+ import { existsSync, statSync, readdirSync } from 'fs';
6
+ import { readdir, readFile } from 'fs/promises';
7
+ import path from 'path';
8
+ import { loadConfig } from '../config.js';
9
+ import { findProjectRoot } from '../project.js';
10
+ /**
11
+ * Get last sync time from sync-cache
12
+ */
13
+ async function getLastSyncTime(projectRoot) {
14
+ const syncCachePath = path.join(projectRoot, 'docs/sync-cache');
15
+ if (!existsSync(syncCachePath)) {
16
+ return null;
17
+ }
18
+ try {
19
+ const entries = await readdir(syncCachePath, { withFileTypes: true });
20
+ let latestTime = null;
21
+ for (const entry of entries) {
22
+ const entryPath = path.join(syncCachePath, entry.name);
23
+ const stats = statSync(entryPath);
24
+ const mtime = stats.mtime;
25
+ if (!latestTime || mtime > latestTime) {
26
+ latestTime = mtime;
27
+ }
28
+ }
29
+ return latestTime;
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * Get repository info from config
37
+ */
38
+ async function getRepoInfo(config, projectRoot) {
39
+ const repos = [];
40
+ for (const repo of config.repos) {
41
+ const syncCachePath = path.join(projectRoot, 'docs/sync-cache', repo.alias);
42
+ let lastSync;
43
+ let synced = false;
44
+ if (existsSync(syncCachePath)) {
45
+ const stats = statSync(syncCachePath);
46
+ lastSync = stats.mtime;
47
+ synced = true;
48
+ }
49
+ repos.push({
50
+ alias: repo.alias,
51
+ synced,
52
+ lastSync,
53
+ status: repo.status,
54
+ });
55
+ }
56
+ return repos;
57
+ }
58
+ /**
59
+ * Parse scope file to extract metadata
60
+ */
61
+ async function parseScopeFile(filePath) {
62
+ try {
63
+ const content = await readFile(filePath, 'utf-8');
64
+ // Extract scope ID from filename or content
65
+ const filename = path.basename(filePath, '.md');
66
+ const idMatch = filename.match(/SCOPE-\d+/i) ?? content.match(/SCOPE-\d+/i);
67
+ const id = idMatch ? idMatch[0].toUpperCase() : filename;
68
+ // Extract title from first heading
69
+ const titleMatch = content.match(/^#\s+(?:SCOPE-\d+:?\s*)?(.+)$/m);
70
+ const title = titleMatch?.[1]?.trim() ?? filename;
71
+ return { id, title };
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ /**
78
+ * Get scopes from docs/scopes directories
79
+ */
80
+ async function getScopes(projectRoot) {
81
+ const scopes = [];
82
+ const summary = { active: 0, completed: 0, draft: 0 };
83
+ const scopeDirs = [
84
+ { path: 'docs/scopes/drafts', status: 'draft' },
85
+ { path: 'docs/scopes/sent', status: 'sent' },
86
+ { path: 'docs/scopes/completed', status: 'completed' },
87
+ ];
88
+ for (const dir of scopeDirs) {
89
+ const dirPath = path.join(projectRoot, dir.path);
90
+ if (!existsSync(dirPath))
91
+ continue;
92
+ try {
93
+ const files = readdirSync(dirPath).filter((f) => f.endsWith('.md') && f.startsWith('SCOPE-'));
94
+ for (const file of files) {
95
+ const filePath = path.join(dirPath, file);
96
+ const parsed = await parseScopeFile(filePath);
97
+ if (parsed) {
98
+ scopes.push({
99
+ id: parsed.id,
100
+ title: parsed.title,
101
+ status: dir.status,
102
+ progress: dir.status === 'completed' ? 100 : dir.status === 'sent' ? 50 : 0,
103
+ });
104
+ }
105
+ }
106
+ if (dir.status === 'draft') {
107
+ summary.draft = files.length;
108
+ }
109
+ else if (dir.status === 'sent') {
110
+ summary.active = files.length;
111
+ }
112
+ else if (dir.status === 'completed') {
113
+ summary.completed = files.length;
114
+ }
115
+ }
116
+ catch {
117
+ // Directory read error - skip
118
+ }
119
+ }
120
+ return { scopes, summary };
121
+ }
122
+ /**
123
+ * Get recent activity from file modifications
124
+ */
125
+ async function getRecentActivity(projectRoot) {
126
+ const activity = [];
127
+ const now = Date.now();
128
+ const sevenDaysAgo = now - 7 * 24 * 60 * 60 * 1000;
129
+ // Check for recent scope changes
130
+ const scopeDirs = ['docs/scopes/drafts', 'docs/scopes/sent', 'docs/scopes/completed'];
131
+ for (const dir of scopeDirs) {
132
+ const dirPath = path.join(projectRoot, dir);
133
+ if (!existsSync(dirPath))
134
+ continue;
135
+ try {
136
+ const files = readdirSync(dirPath).filter((f) => f.endsWith('.md'));
137
+ for (const file of files) {
138
+ const filePath = path.join(dirPath, file);
139
+ const stats = statSync(filePath);
140
+ if (stats.mtime.getTime() > sevenDaysAgo) {
141
+ const action = dir.includes('completed')
142
+ ? 'completed'
143
+ : dir.includes('sent')
144
+ ? 'sent'
145
+ : 'created';
146
+ activity.push({
147
+ message: `${file.replace('.md', '')} ${action}`,
148
+ timestamp: stats.mtime,
149
+ type: 'scope',
150
+ });
151
+ }
152
+ }
153
+ }
154
+ catch {
155
+ // Skip on error
156
+ }
157
+ }
158
+ // Check for recent PRD changes
159
+ const prdPath = path.join(projectRoot, 'docs/prd');
160
+ if (existsSync(prdPath)) {
161
+ try {
162
+ const prdStats = statSync(prdPath);
163
+ if (prdStats.mtime.getTime() > sevenDaysAgo) {
164
+ activity.push({
165
+ message: 'PRD updated',
166
+ timestamp: prdStats.mtime,
167
+ type: 'prd',
168
+ });
169
+ }
170
+ }
171
+ catch {
172
+ // Skip on error
173
+ }
174
+ }
175
+ // Sort by timestamp descending and limit to 5
176
+ return activity
177
+ .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())
178
+ .slice(0, 5);
179
+ }
180
+ /**
181
+ * Load all dashboard data
182
+ */
183
+ export async function loadDashboardData() {
184
+ const cwd = process.cwd();
185
+ const projectRoot = findProjectRoot(cwd);
186
+ // No project found
187
+ if (!projectRoot) {
188
+ return {
189
+ hasProject: false,
190
+ header: { projectName: '', version: '0.1.0' },
191
+ repos: [],
192
+ coverage: { percentage: 0, done: 0, total: 0, gaps: 0 },
193
+ scopes: [],
194
+ scopeSummary: { active: 0, completed: 0, draft: 0 },
195
+ activity: [],
196
+ };
197
+ }
198
+ try {
199
+ const config = await loadConfig(projectRoot);
200
+ if (!config) {
201
+ return {
202
+ hasProject: false,
203
+ header: { projectName: '', version: '0.1.0' },
204
+ repos: [],
205
+ coverage: { percentage: 0, done: 0, total: 0, gaps: 0 },
206
+ scopes: [],
207
+ scopeSummary: { active: 0, completed: 0, draft: 0 },
208
+ activity: [],
209
+ };
210
+ }
211
+ // Load all data in parallel
212
+ const [lastSync, repos, { scopes, summary }, activity] = await Promise.all([
213
+ getLastSyncTime(projectRoot),
214
+ getRepoInfo(config, projectRoot),
215
+ getScopes(projectRoot),
216
+ getRecentActivity(projectRoot),
217
+ ]);
218
+ return {
219
+ hasProject: true,
220
+ header: {
221
+ projectName: config.project.name,
222
+ version: '0.1.0',
223
+ lastSync: lastSync ?? undefined,
224
+ },
225
+ repos,
226
+ // Coverage is placeholder until vibe prd is implemented
227
+ coverage: {
228
+ percentage: 0,
229
+ done: 0,
230
+ total: 0,
231
+ gaps: 0,
232
+ },
233
+ scopes,
234
+ scopeSummary: summary,
235
+ activity,
236
+ };
237
+ }
238
+ catch {
239
+ return {
240
+ hasProject: false,
241
+ header: { projectName: '', version: '0.1.0' },
242
+ repos: [],
243
+ coverage: { percentage: 0, done: 0, total: 0, gaps: 0 },
244
+ scopes: [],
245
+ scopeSummary: { active: 0, completed: 0, draft: 0 },
246
+ activity: [],
247
+ };
248
+ }
249
+ }
250
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/core/dashboard/data.ts"],"names":[],"mappings":"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"}