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,374 @@
1
+ /**
2
+ * vibe coverage - Detailed PRD coverage analysis
3
+ *
4
+ * Displays detailed coverage of PRD requirements including
5
+ * per-requirement breakdowns, module filtering, and status grouping.
6
+ */
7
+ import { Command, Option } from 'clipanion';
8
+ import chalk from 'chalk';
9
+ import Table from 'cli-table3';
10
+ import { loadConfig } from '../../core/config.js';
11
+ import { findProjectRoot } from '../../core/project.js';
12
+ import { calculateExtendedCoverage, getModuleNames, toCoverageJsonOutput, } from '../../core/coverage.js';
13
+ import { progressBar } from '../../core/status.js';
14
+ /**
15
+ * Get status display text and color
16
+ */
17
+ function getStatusDisplay(percentage) {
18
+ if (percentage === 100) {
19
+ return { text: '\u2713 Done', color: chalk.green };
20
+ }
21
+ else if (percentage >= 25) {
22
+ return { text: 'In Progress', color: chalk.yellow };
23
+ }
24
+ else if (percentage > 0) {
25
+ return { text: 'Started', color: chalk.cyan };
26
+ }
27
+ return { text: 'Not Started', color: chalk.gray };
28
+ }
29
+ /**
30
+ * Get color for percentage value
31
+ */
32
+ function getPercentageColor(percentage) {
33
+ if (percentage >= 75)
34
+ return chalk.green;
35
+ if (percentage >= 50)
36
+ return chalk.yellow;
37
+ return chalk.red;
38
+ }
39
+ export class CoverageCommand extends Command {
40
+ static paths = [['coverage']];
41
+ static usage = Command.Usage({
42
+ description: 'Show detailed PRD coverage analysis',
43
+ details: `
44
+ Display detailed coverage of PRD requirements showing which requirements
45
+ have been implemented, which are in progress, and which are missing.
46
+
47
+ By default shows an overall coverage report with module breakdown.
48
+ Use flags to get different views of the coverage data.
49
+
50
+ Uses cached data only for instant results. Run 'vibe sync' first to update.
51
+ `,
52
+ examples: [
53
+ ['Show overall coverage', 'vibe coverage'],
54
+ ['Group by module (detailed)', 'vibe coverage --by-module'],
55
+ ['Group by status', 'vibe coverage --by-status'],
56
+ ['Show single module', 'vibe coverage --module reporting'],
57
+ ['JSON output', 'vibe coverage --json'],
58
+ ],
59
+ });
60
+ // Options
61
+ byModule = Option.Boolean('--by-module,-m', false, {
62
+ description: 'Show detailed breakdown by PRD module',
63
+ });
64
+ byStatus = Option.Boolean('--by-status,-s', false, {
65
+ description: 'Group requirements by implementation status',
66
+ });
67
+ module = Option.String('--module', {
68
+ description: 'Show detailed view of a single module',
69
+ });
70
+ json = Option.Boolean('--json', false, {
71
+ description: 'Output as JSON for machine parsing',
72
+ });
73
+ async execute() {
74
+ try {
75
+ // Find project root
76
+ const projectRoot = findProjectRoot(process.cwd());
77
+ if (!projectRoot) {
78
+ if (this.json) {
79
+ this.context.stdout.write(JSON.stringify({ error: 'Not inside a vibe-fabric project' }, null, 2) + '\n');
80
+ }
81
+ else {
82
+ this.context.stderr.write(chalk.red(' Error: Not inside a vibe-fabric project.\n'));
83
+ this.context.stderr.write(chalk.gray(' Run `vibe init` to create a planning hub first.\n\n'));
84
+ }
85
+ return 1;
86
+ }
87
+ // Load config
88
+ const config = await loadConfig(projectRoot);
89
+ if (!config) {
90
+ if (this.json) {
91
+ this.context.stdout.write(JSON.stringify({ error: 'Failed to load configuration' }, null, 2) + '\n');
92
+ }
93
+ else {
94
+ this.context.stderr.write(chalk.red(' Error: Failed to load configuration.\n\n'));
95
+ }
96
+ return 1;
97
+ }
98
+ // Calculate extended coverage
99
+ const data = await calculateExtendedCoverage(projectRoot);
100
+ // Handle no modules found
101
+ if (data.modules.length === 0) {
102
+ if (this.json) {
103
+ this.context.stdout.write(JSON.stringify({ error: 'No PRD modules found' }, null, 2) + '\n');
104
+ }
105
+ else {
106
+ this.context.stderr.write(chalk.yellow(' No PRD modules found.\n'));
107
+ this.context.stderr.write(chalk.gray(' Create PRD modules in docs/prd/modules/ first.\n\n'));
108
+ }
109
+ return 0;
110
+ }
111
+ // JSON output mode
112
+ if (this.json) {
113
+ return this.outputJson(data);
114
+ }
115
+ // Module detail view
116
+ if (this.module) {
117
+ return this.outputModuleDetail(data, projectRoot);
118
+ }
119
+ // By status view
120
+ if (this.byStatus) {
121
+ return this.outputByStatus(data);
122
+ }
123
+ // By module view (detailed)
124
+ if (this.byModule) {
125
+ return this.outputByModule(data);
126
+ }
127
+ // Standard summary view
128
+ return this.outputSummary(data);
129
+ }
130
+ catch (error) {
131
+ if (this.json) {
132
+ this.context.stdout.write(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }, null, 2) + '\n');
133
+ }
134
+ else {
135
+ this.context.stderr.write(chalk.red(`\n Error: ${error instanceof Error ? error.message : 'Unknown error'}\n\n`));
136
+ }
137
+ return 1;
138
+ }
139
+ }
140
+ /**
141
+ * Output JSON format
142
+ */
143
+ outputJson(data) {
144
+ const output = toCoverageJsonOutput(data);
145
+ this.context.stdout.write(JSON.stringify(output, null, 2) + '\n');
146
+ return 0;
147
+ }
148
+ /**
149
+ * Output summary view (default)
150
+ */
151
+ outputSummary(data) {
152
+ this.context.stdout.write('\n');
153
+ // Header
154
+ this.context.stdout.write(chalk.bold.blue(' PRD Coverage Report\n'));
155
+ this.context.stdout.write(chalk.gray(' ' + '\u2550'.repeat(60)) + '\n\n');
156
+ // Overall coverage with progress bar
157
+ const pctColor = getPercentageColor(data.coveragePercentage);
158
+ const bar = progressBar(data.coveragePercentage);
159
+ this.context.stdout.write(` ${chalk.bold('Overall:')} ${pctColor(`${data.coveragePercentage}%`)} ` +
160
+ `(${data.implementedRequirements}/${data.totalRequirements} requirements)\n`);
161
+ this.context.stdout.write(` ${chalk.gray(bar)}\n\n`);
162
+ // By Module table
163
+ this.context.stdout.write(chalk.bold(' By Module:\n'));
164
+ const table = new Table({
165
+ head: ['Module', 'Total', 'Covered', '%', 'Status'].map((h) => chalk.gray(h)),
166
+ style: { head: [], border: [] },
167
+ chars: {
168
+ top: '\u2500',
169
+ 'top-mid': '\u252C',
170
+ 'top-left': '\u250C',
171
+ 'top-right': '\u2510',
172
+ bottom: '\u2500',
173
+ 'bottom-mid': '\u2534',
174
+ 'bottom-left': '\u2514',
175
+ 'bottom-right': '\u2518',
176
+ left: '\u2502',
177
+ 'left-mid': '\u251C',
178
+ mid: '\u2500',
179
+ 'mid-mid': '\u253C',
180
+ right: '\u2502',
181
+ 'right-mid': '\u2524',
182
+ middle: '\u2502',
183
+ },
184
+ });
185
+ // Sort modules by coverage (lowest first to highlight problem areas)
186
+ const sortedModules = [...data.modules].sort((a, b) => a.percentage - b.percentage);
187
+ for (const mod of sortedModules) {
188
+ const { text: statusText, color: statusColor } = getStatusDisplay(mod.percentage);
189
+ const pct = mod.percentage;
190
+ const pctDisplay = getPercentageColor(pct)(`${pct}%`);
191
+ table.push([
192
+ mod.name,
193
+ mod.total.toString(),
194
+ mod.implemented.toString(),
195
+ pctDisplay,
196
+ statusColor(statusText),
197
+ ]);
198
+ }
199
+ this.context.stdout.write(' ' + table.toString().split('\n').join('\n ') + '\n\n');
200
+ // Legend
201
+ this.context.stdout.write(chalk.gray(' Legend:\n'));
202
+ this.context.stdout.write(chalk.green(' \u2713 Done') + chalk.gray(' = 100% covered\n'));
203
+ this.context.stdout.write(chalk.yellow(' In Progress') + chalk.gray(' = 25-99% covered\n'));
204
+ this.context.stdout.write(chalk.cyan(' Started') + chalk.gray(' = 1-24% covered\n'));
205
+ this.context.stdout.write(chalk.gray(' Not Started = 0% covered\n'));
206
+ this.context.stdout.write('\n');
207
+ return 0;
208
+ }
209
+ /**
210
+ * Output by-module view (detailed breakdown)
211
+ */
212
+ outputByModule(data) {
213
+ this.context.stdout.write('\n');
214
+ // Header
215
+ this.context.stdout.write(chalk.bold.blue(' PRD Coverage by Module\n'));
216
+ this.context.stdout.write(chalk.gray(' ' + '\u2550'.repeat(60)) + '\n\n');
217
+ // Overall summary
218
+ const pctColor = getPercentageColor(data.coveragePercentage);
219
+ this.context.stdout.write(` ${chalk.bold('Overall:')} ${pctColor(`${data.coveragePercentage}%`)} ` +
220
+ `(${data.implementedRequirements}/${data.totalRequirements})\n\n`);
221
+ // Sort modules by coverage (lowest first)
222
+ const sortedModules = [...data.modules].sort((a, b) => a.percentage - b.percentage);
223
+ for (const mod of sortedModules) {
224
+ const { text: statusText, color: statusColor } = getStatusDisplay(mod.percentage);
225
+ const bar = progressBar(mod.percentage, 15);
226
+ const pct = getPercentageColor(mod.percentage)(`${mod.percentage}%`);
227
+ this.context.stdout.write(` ${chalk.bold(mod.name)} ${pct} ${chalk.gray(bar)} ${statusColor(statusText)}\n`);
228
+ this.context.stdout.write(chalk.gray(` Total: ${mod.total} | Implemented: ${mod.implemented} | `) +
229
+ chalk.gray(`In Progress: ${mod.inProgress} | Not Started: ${mod.notStarted}\n`));
230
+ this.context.stdout.write('\n');
231
+ }
232
+ return 0;
233
+ }
234
+ /**
235
+ * Output by-status view
236
+ */
237
+ outputByStatus(data) {
238
+ this.context.stdout.write('\n');
239
+ // Header
240
+ this.context.stdout.write(chalk.bold.blue(' PRD Coverage by Status\n'));
241
+ this.context.stdout.write(chalk.gray(' ' + '\u2550'.repeat(60)) + '\n\n');
242
+ // Implemented
243
+ this.context.stdout.write(chalk.green(`\u2713 IMPLEMENTED (${data.byStatus.implemented.length} requirements)\n`));
244
+ for (const req of data.byStatus.implemented) {
245
+ const scopeInfo = req.scopeId ? chalk.gray(` [${req.scopeId}]`) : '';
246
+ this.context.stdout.write(chalk.gray('\u251C\u2500\u2500 ') + `${req.id}: ${req.title}${scopeInfo}\n`);
247
+ }
248
+ if (data.byStatus.implemented.length === 0) {
249
+ this.context.stdout.write(chalk.gray(' (none)\n'));
250
+ }
251
+ this.context.stdout.write('\n');
252
+ // In Progress
253
+ this.context.stdout.write(chalk.yellow(`\u25B6 IN PROGRESS (${data.byStatus.inProgress.length} requirements)\n`));
254
+ for (const req of data.byStatus.inProgress) {
255
+ const scopeInfo = req.scopeId ? chalk.cyan(` [${req.scopeId}]`) : '';
256
+ this.context.stdout.write(chalk.gray('\u251C\u2500\u2500 ') + `${req.id}: ${req.title}${scopeInfo}\n`);
257
+ }
258
+ if (data.byStatus.inProgress.length === 0) {
259
+ this.context.stdout.write(chalk.gray(' (none)\n'));
260
+ }
261
+ this.context.stdout.write('\n');
262
+ // Not Started
263
+ this.context.stdout.write(chalk.gray(`\u25CB NOT STARTED (${data.byStatus.notStarted.length} requirements)\n`));
264
+ for (const req of data.byStatus.notStarted) {
265
+ this.context.stdout.write(chalk.gray('\u251C\u2500\u2500 ') + chalk.gray(`${req.id}: ${req.title}\n`));
266
+ }
267
+ if (data.byStatus.notStarted.length === 0) {
268
+ this.context.stdout.write(chalk.gray(' (none)\n'));
269
+ }
270
+ this.context.stdout.write('\n');
271
+ return 0;
272
+ }
273
+ /**
274
+ * Output single module detail view
275
+ */
276
+ async outputModuleDetail(data, projectRoot) {
277
+ const moduleName = this.module;
278
+ // Find the module
279
+ const mod = data.modules.find((m) => m.name.toLowerCase() === moduleName.toLowerCase());
280
+ if (!mod) {
281
+ const availableModules = await getModuleNames(projectRoot);
282
+ this.context.stderr.write(chalk.red(` Error: Module "${moduleName}" not found.\n\n`));
283
+ this.context.stderr.write(chalk.gray(' Available modules:\n'));
284
+ for (const name of availableModules) {
285
+ this.context.stderr.write(chalk.gray(` - ${name}\n`));
286
+ }
287
+ this.context.stderr.write('\n');
288
+ return 1;
289
+ }
290
+ this.context.stdout.write('\n');
291
+ // Header
292
+ this.context.stdout.write(chalk.bold.blue(` ${mod.name} Module Coverage\n`));
293
+ this.context.stdout.write(chalk.gray(' ' + '\u2550'.repeat(60)) + '\n\n');
294
+ // Coverage summary
295
+ const pctColor = getPercentageColor(mod.percentage);
296
+ const bar = progressBar(mod.percentage);
297
+ this.context.stdout.write(` ${chalk.bold('Coverage:')} ${pctColor(`${mod.percentage}%`)} ` +
298
+ `(${mod.implemented}/${mod.total} requirements)\n`);
299
+ this.context.stdout.write(` ${chalk.gray(bar)}\n\n`);
300
+ // Requirements table
301
+ this.context.stdout.write(chalk.bold(' Requirements:\n'));
302
+ const table = new Table({
303
+ head: ['ID', 'Title', 'Status', 'Scope'].map((h) => chalk.gray(h)),
304
+ style: { head: [], border: [] },
305
+ colWidths: [16, 35, 14, 12],
306
+ wordWrap: true,
307
+ chars: {
308
+ top: '\u2500',
309
+ 'top-mid': '\u252C',
310
+ 'top-left': '\u250C',
311
+ 'top-right': '\u2510',
312
+ bottom: '\u2500',
313
+ 'bottom-mid': '\u2534',
314
+ 'bottom-left': '\u2514',
315
+ 'bottom-right': '\u2518',
316
+ left: '\u2502',
317
+ 'left-mid': '\u251C',
318
+ mid: '\u2500',
319
+ 'mid-mid': '\u253C',
320
+ right: '\u2502',
321
+ 'right-mid': '\u2524',
322
+ middle: '\u2502',
323
+ },
324
+ });
325
+ // Sort requirements: implemented first, then in_progress, then not_started
326
+ const sortedReqs = [...mod.requirements].sort((a, b) => {
327
+ const order = { implemented: 0, in_progress: 1, not_started: 2 };
328
+ return order[a.status] - order[b.status];
329
+ });
330
+ for (const req of sortedReqs) {
331
+ let statusDisplay;
332
+ switch (req.status) {
333
+ case 'implemented':
334
+ statusDisplay = chalk.green('\u2713 Done');
335
+ break;
336
+ case 'in_progress':
337
+ statusDisplay = chalk.yellow('In Progress');
338
+ break;
339
+ default:
340
+ statusDisplay = chalk.gray('Not Started');
341
+ }
342
+ table.push([
343
+ req.id,
344
+ req.title,
345
+ statusDisplay,
346
+ req.scopeId ?? chalk.gray('-'),
347
+ ]);
348
+ }
349
+ this.context.stdout.write(' ' + table.toString().split('\n').join('\n ') + '\n\n');
350
+ // Related scopes
351
+ const relatedScopes = data.scopes.filter((s) => s.requirements.some((r) => mod.requirements.some((mr) => mr.id === r)));
352
+ if (relatedScopes.length > 0) {
353
+ this.context.stdout.write(chalk.bold(' Related Scopes:\n'));
354
+ for (const scope of relatedScopes) {
355
+ let statusColor;
356
+ switch (scope.status) {
357
+ case 'completed':
358
+ statusColor = chalk.green;
359
+ break;
360
+ case 'sent':
361
+ case 'ready':
362
+ statusColor = chalk.yellow;
363
+ break;
364
+ default:
365
+ statusColor = chalk.gray;
366
+ }
367
+ this.context.stdout.write(` ${scope.id}: ${scope.title} (${statusColor(scope.status)})\n`);
368
+ }
369
+ this.context.stdout.write('\n');
370
+ }
371
+ return 0;
372
+ }
373
+ }
374
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/cli/commands/coverage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;GAEG;AACH,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACrD,CAAC;SAAM,IAAI,UAAU,IAAI,EAAE,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACtD,CAAC;SAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,IAAI,UAAU,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IACzC,IAAI,UAAU,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IAC1C,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,eAAgB,SAAQ,OAAO;IAC1C,MAAM,CAAU,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvC,MAAM,CAAU,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QACpC,WAAW,EAAE,qCAAqC;QAClD,OAAO,EAAE;;;;;;;;KAQR;QACD,QAAQ,EAAE;YACR,CAAC,uBAAuB,EAAE,eAAe,CAAC;YAC1C,CAAC,4BAA4B,EAAE,2BAA2B,CAAC;YAC3D,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;YAChD,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;YAC1D,CAAC,aAAa,EAAE,sBAAsB,CAAC;SACxC;KACF,CAAC,CAAC;IAEH,UAAU;IACV,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,EAAE;QACjD,WAAW,EAAE,uCAAuC;KACrD,CAAC,CAAC;IAEH,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,EAAE;QACjD,WAAW,EAAE,6CAA6C;KAC3D,CAAC,CAAC;IAEH,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE;QACjC,WAAW,EAAE,uCAAuC;KACrD,CAAC,CAAC;IAEH,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE;QACrC,WAAW,EAAE,oCAAoC;KAClD,CAAC,CAAC;IAEH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,oBAAoB;YACpB,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAC9E,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAC1D,CAAC;oBACF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CACpE,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YAED,cAAc;YACd,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAC1E,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CACxD,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YAED,8BAA8B;YAC9B,MAAM,IAAI,GAAG,MAAM,yBAAyB,CAAC,WAAW,CAAC,CAAC;YAE1D,0BAA0B;YAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAClE,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAC1C,CAAC;oBACF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CACnE,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YAED,mBAAmB;YACnB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAED,qBAAqB;YACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACpD,CAAC;YAED,iBAAiB;YACjB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;YAED,4BAA4B;YAC5B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;YAED,wBAAwB;YACxB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAI,CAAC,SAAS,CACZ,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EACnE,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,GAAG,CACP,cAAc,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,MAAM,CAC7E,CACF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,IAA0B;QAC3C,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAClE,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,IAA0B;QAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,SAAS;QACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAE3E,qCAAqC;QACrC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAEjD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG;YACzE,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,iBAAiB,kBAAkB,CAC7E,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEtD,kBAAkB;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAExD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5D,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CACd;YACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC/B,KAAK,EAAE;gBACL,GAAG,EAAE,QAAQ;gBACb,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,QAAQ;gBACrB,MAAM,EAAE,QAAQ;gBAChB,YAAY,EAAE,QAAQ;gBACtB,aAAa,EAAE,QAAQ;gBACvB,cAAc,EAAE,QAAQ;gBACxB,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,QAAQ;gBACpB,GAAG,EAAE,QAAQ;gBACb,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,QAAQ;gBACrB,MAAM,EAAE,QAAQ;aACjB;SACF,CAAC,CAAC;QAEH,qEAAqE;QACrE,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CACtC,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClF,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC;YAC3B,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YAEtD,KAAK,CAAC,IAAI,CAAC;gBACT,GAAG,CAAC,IAAI;gBACR,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACpB,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE;gBAC1B,UAAU;gBACV,WAAW,CAAC,UAAU,CAAC;aACxB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;QAErF,SAAS;QACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAA0B;QAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,SAAS;QACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAE3E,kBAAkB;QAClB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG;YACzE,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,iBAAiB,OAAO,CAClE,CAAC;QAEF,0CAA0C;QAC1C,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CACtC,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClF,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;YAErE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CACnF,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,KAAK,mBAAmB,GAAG,CAAC,WAAW,KAAK,CAAC;gBAC1E,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,UAAU,mBAAmB,GAAG,CAAC,UAAU,IAAI,CAAC,CAChF,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAA0B;QAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,SAAS;QACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAE3E,cAAc;QACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,kBAAkB,CAAC,CACvF,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,KAAK,GAAG,SAAS,IAAI,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,cAAc;QACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,MAAM,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,kBAAkB,CAAC,CACvF,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,KAAK,GAAG,SAAS,IAAI,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,cAAc;QACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,kBAAkB,CAAC,CACrF,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAC9B,IAA0B,EAC1B,WAAmB;QAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAO,CAAC;QAEhC,kBAAkB;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CACzD,CAAC;QAEF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,gBAAgB,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;YAC3D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,CAAC,GAAG,CAAC,oBAAoB,UAAU,kBAAkB,CAAC,CAC5D,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAChE,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,SAAS;QACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAE3E,mBAAmB;QACnB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAExC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,GAAG;YACjE,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,kBAAkB,CACnD,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEtD,qBAAqB;QACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAE3D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC/B,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAC3B,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE;gBACL,GAAG,EAAE,QAAQ;gBACb,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,QAAQ;gBACrB,MAAM,EAAE,QAAQ;gBAChB,YAAY,EAAE,QAAQ;gBACtB,aAAa,EAAE,QAAQ;gBACvB,cAAc,EAAE,QAAQ;gBACxB,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,QAAQ;gBACpB,GAAG,EAAE,QAAQ;gBACb,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,QAAQ;gBACrB,MAAM,EAAE,QAAQ;aACjB;SACF,CAAC,CAAC;QAEH,2EAA2E;QAC3E,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrD,MAAM,KAAK,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,aAAqB,CAAC;YAC1B,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnB,KAAK,aAAa;oBAChB,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBAC3C,MAAM;gBACR,KAAK,aAAa;oBAChB,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;oBAC5C,MAAM;gBACR;oBACE,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9C,CAAC;YAED,KAAK,CAAC,IAAI,CAAC;gBACT,GAAG,CAAC,EAAE;gBACN,GAAG,CAAC,KAAK;gBACT,aAAa;gBACb,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;QAErF,iBAAiB;QACjB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACxB,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAC3C,CACF,CAAC;QAEF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC7D,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAClC,IAAI,WAAyB,CAAC;gBAC9B,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;oBACrB,KAAK,WAAW;wBACd,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC;wBAC1B,MAAM;oBACR,KAAK,MAAM,CAAC;oBACZ,KAAK,OAAO;wBACV,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;wBAC3B,MAAM;oBACR;wBACE,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;gBAC7B,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,OAAO,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CACnE,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * vibe doctor - Health check command
3
+ * Validates environment, configuration, authentication, and repositories
4
+ */
5
+ import { Command } from 'clipanion';
6
+ export declare class DoctorCommand extends Command {
7
+ static paths: string[][];
8
+ static usage: import("clipanion").Usage;
9
+ verbose: boolean;
10
+ fix: boolean;
11
+ json: boolean;
12
+ execute(): Promise<number>;
13
+ /**
14
+ * Execute in JSON mode (for CI)
15
+ */
16
+ private executeJson;
17
+ /**
18
+ * Execute in interactive mode with progress
19
+ */
20
+ private executeInteractive;
21
+ /**
22
+ * Print summary line
23
+ */
24
+ private printSummary;
25
+ /**
26
+ * Handle automatic fixes
27
+ */
28
+ private handleFixes;
29
+ }
30
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AA4C5C,qBAAa,aAAc,SAAQ,OAAO;IACxC,OAAgB,KAAK,aAAgB;IAErC,OAAgB,KAAK,4BAkBlB;IAEH,OAAO,UAEJ;IAEH,GAAG,UAEA;IAEH,IAAI,UAED;IAEG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAUhC;;OAEG;YACW,WAAW;IAsBzB;;OAEG;YACW,kBAAkB;IAuDhC;;OAEG;IACH,OAAO,CAAC,YAAY;IA0BpB;;OAEG;YACW,WAAW;CAqC1B"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * vibe doctor - Health check command
3
+ * Validates environment, configuration, authentication, and repositories
4
+ */
5
+ import { Command, Option } from 'clipanion';
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import { confirm } from '@inquirer/prompts';
9
+ import { runChecksWithProgress, getCategoryDisplayName, getFixableChecks, toJsonOutput, } from '../../core/doctor/index.js';
10
+ /**
11
+ * Get status symbol for check result
12
+ */
13
+ function getStatusSymbol(status) {
14
+ switch (status) {
15
+ case 'passed':
16
+ return chalk.green('✓');
17
+ case 'failed':
18
+ return chalk.red('✗');
19
+ case 'warning':
20
+ return chalk.yellow('⚠');
21
+ }
22
+ }
23
+ /**
24
+ * Format check result for display
25
+ */
26
+ function formatCheckResult(result, verbose) {
27
+ const symbol = getStatusSymbol(result.status);
28
+ const name = result.name;
29
+ const details = result.details ? chalk.gray(` (${result.details})`) : '';
30
+ let output = ` ${symbol} ${name}${details}`;
31
+ if (verbose && result.fix && result.status !== 'passed') {
32
+ output += `\n ${chalk.cyan('→')} ${chalk.gray(result.fix)}`;
33
+ }
34
+ return output;
35
+ }
36
+ export class DoctorCommand extends Command {
37
+ static paths = [['doctor']];
38
+ static usage = Command.Usage({
39
+ description: 'Run health checks on the planning hub',
40
+ details: `
41
+ Diagnoses common issues with your vibe-fabric setup:
42
+ - Environment: Node.js, UV, Claude Code
43
+ - Configuration: Config files, schema validation
44
+ - Authentication: GitHub token, permissions
45
+ - Repositories: Accessibility, vibe/ structure
46
+ - Sync: Data freshness
47
+
48
+ Use --fix to attempt automatic fixes for fixable issues.
49
+ `,
50
+ examples: [
51
+ ['Run all checks', 'vibe doctor'],
52
+ ['Verbose output with fix suggestions', 'vibe doctor --verbose'],
53
+ ['JSON output for CI', 'vibe doctor --json'],
54
+ ['Attempt automatic fixes', 'vibe doctor --fix'],
55
+ ],
56
+ });
57
+ verbose = Option.Boolean('--verbose,-v', false, {
58
+ description: 'Show detailed output with fix suggestions',
59
+ });
60
+ fix = Option.Boolean('--fix', false, {
61
+ description: 'Attempt to fix issues automatically',
62
+ });
63
+ json = Option.Boolean('--json', false, {
64
+ description: 'Output results as JSON',
65
+ });
66
+ async execute() {
67
+ // JSON mode - quiet, structured output
68
+ if (this.json) {
69
+ return this.executeJson();
70
+ }
71
+ // Interactive mode with progress
72
+ return this.executeInteractive();
73
+ }
74
+ /**
75
+ * Execute in JSON mode (for CI)
76
+ */
77
+ async executeJson() {
78
+ const results = [];
79
+ await runChecksWithProgress(() => { }, (result) => results.push(result), () => { });
80
+ const summary = {
81
+ passed: results.filter((r) => r.status === 'passed').length,
82
+ failed: results.filter((r) => r.status === 'failed').length,
83
+ warnings: results.filter((r) => r.status === 'warning').length,
84
+ checks: results,
85
+ };
86
+ const jsonOutput = toJsonOutput(summary);
87
+ this.context.stdout.write(JSON.stringify(jsonOutput, null, 2) + '\n');
88
+ return summary.failed > 0 ? 1 : 0;
89
+ }
90
+ /**
91
+ * Execute in interactive mode with progress
92
+ */
93
+ async executeInteractive() {
94
+ this.context.stdout.write('\n');
95
+ this.context.stdout.write(chalk.bold.blue(' VIBE-FABRIC DOCTOR') + '\n');
96
+ this.context.stdout.write(chalk.gray(' ─'.repeat(25)) + '\n\n');
97
+ let currentSpinner = null;
98
+ const categoryResults = new Map();
99
+ const summary = await runChecksWithProgress(
100
+ // On category start
101
+ (category, name) => {
102
+ currentSpinner = ora(`Checking ${name.toLowerCase()}...`).start();
103
+ categoryResults.set(category, []);
104
+ },
105
+ // On check complete
106
+ (result) => {
107
+ const results = categoryResults.get(result.category) ?? [];
108
+ results.push(result);
109
+ categoryResults.set(result.category, results);
110
+ },
111
+ // On category complete
112
+ (category, results) => {
113
+ currentSpinner?.stop();
114
+ // Print category header
115
+ const displayName = getCategoryDisplayName(category);
116
+ this.context.stdout.write(chalk.bold(` ${displayName}\n`));
117
+ // Print results
118
+ for (const result of results) {
119
+ this.context.stdout.write(formatCheckResult(result, this.verbose) + '\n');
120
+ // In verbose mode, show fix for failures/warnings
121
+ if (!this.verbose && result.fix && result.status !== 'passed') {
122
+ this.context.stdout.write(` ${chalk.cyan('→')} ${chalk.gray(result.fix)}\n`);
123
+ }
124
+ }
125
+ this.context.stdout.write('\n');
126
+ });
127
+ // Print summary
128
+ this.printSummary(summary);
129
+ // Handle fixes if requested
130
+ if (this.fix && summary.failed > 0 || summary.warnings > 0) {
131
+ await this.handleFixes(summary);
132
+ }
133
+ return summary.failed > 0 ? 1 : 0;
134
+ }
135
+ /**
136
+ * Print summary line
137
+ */
138
+ printSummary(summary) {
139
+ this.context.stdout.write(chalk.gray(' ─'.repeat(25)) + '\n');
140
+ const parts = [];
141
+ if (summary.passed > 0) {
142
+ parts.push(chalk.green(`${summary.passed} passed`));
143
+ }
144
+ if (summary.failed > 0) {
145
+ parts.push(chalk.red(`${summary.failed} failed`));
146
+ }
147
+ if (summary.warnings > 0) {
148
+ parts.push(chalk.yellow(`${summary.warnings} warning${summary.warnings === 1 ? '' : 's'}`));
149
+ }
150
+ this.context.stdout.write(` Results: ${parts.join(', ')}\n\n`);
151
+ if (summary.failed > 0) {
152
+ this.context.stdout.write(chalk.gray(' Run ') +
153
+ chalk.cyan('vibe doctor --fix') +
154
+ chalk.gray(' to attempt automatic fixes.\n\n'));
155
+ }
156
+ }
157
+ /**
158
+ * Handle automatic fixes
159
+ */
160
+ async handleFixes(summary) {
161
+ const fixable = getFixableChecks(summary.checks);
162
+ if (fixable.length === 0) {
163
+ this.context.stdout.write(chalk.gray(' No automatically fixable issues found.\n\n'));
164
+ return;
165
+ }
166
+ this.context.stdout.write(chalk.bold(` Found ${fixable.length} fixable issue${fixable.length === 1 ? '' : 's'}:\n\n`));
167
+ for (let i = 0; i < fixable.length; i++) {
168
+ const check = fixable[i];
169
+ if (!check)
170
+ continue;
171
+ this.context.stdout.write(` ${i + 1}. ${check.name}\n` +
172
+ ` ${chalk.cyan('→')} ${check.fix}\n\n`);
173
+ }
174
+ const proceed = await confirm({
175
+ message: 'Apply fixes?',
176
+ default: false,
177
+ });
178
+ if (!proceed) {
179
+ this.context.stdout.write(chalk.yellow('\n Fixes skipped.\n\n'));
180
+ return;
181
+ }
182
+ // Note: Actual fix implementation would go here
183
+ // For now, we just show what fixes would be applied
184
+ this.context.stdout.write(chalk.yellow('\n Auto-fix not yet implemented. Please run the suggested commands manually.\n\n'));
185
+ }
186
+ }
187
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}