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,299 @@
1
+ /**
2
+ * vibe sync - Sync implementation progress from dev repositories
3
+ *
4
+ * Fetches progress from dev repos via GitHub API, detects scope status
5
+ * from folder locations, aggregates multi-repo progress, and auto-completes
6
+ * scopes when all repos show completion.
7
+ */
8
+ import { Command, Option } from 'clipanion';
9
+ import chalk from 'chalk';
10
+ import ora from 'ora';
11
+ import { Octokit } from 'octokit';
12
+ import { loadConfig } from '../../core/config.js';
13
+ import { discoverGitHubToken } from '../../core/github.js';
14
+ import { findProjectRoot } from '../../core/project.js';
15
+ import { performSync, checkStaleness, loadLastSync, loadSyncConfig, isDataStale, getTimeSinceLastSync, } from '../../core/sync/index.js';
16
+ export class SyncCommand extends Command {
17
+ static paths = [['sync']];
18
+ static usage = Command.Usage({
19
+ description: 'Sync implementation progress from dev repositories',
20
+ details: `
21
+ Fetch progress from dev repositories via GitHub API and update local state.
22
+
23
+ This command:
24
+ - Scans vibe/ folders in dev repos for scope and plan status
25
+ - Detects status from folder location (not metadata)
26
+ - Aggregates progress across multiple repositories
27
+ - Auto-moves completed scopes to docs/scopes/completed/
28
+ - Updates PRD requirement statuses
29
+ - Updates coverage.json with fresh data
30
+
31
+ Status detection:
32
+ - vibe/incoming-scopes/ → pending
33
+ - vibe/implementation-plans/active/ → in_progress
34
+ - vibe/implementation-plans/completed/ → completed
35
+ `,
36
+ examples: [
37
+ ['Sync all repos', 'vibe sync'],
38
+ ['Sync specific repo', 'vibe sync backend'],
39
+ ['Verbose output', 'vibe sync --verbose'],
40
+ ['Force sync even if recent', 'vibe sync --force'],
41
+ ['Check if sync needed', 'vibe sync --check'],
42
+ ['Skip auto-move of completed scopes', 'vibe sync --no-auto-move'],
43
+ ],
44
+ });
45
+ // Positional argument: repo alias (optional)
46
+ alias = Option.String({ required: false });
47
+ // Options
48
+ verbose = Option.Boolean('--verbose,-v', false, {
49
+ description: 'Show detailed output during sync',
50
+ });
51
+ force = Option.Boolean('--force,-f', false, {
52
+ description: 'Sync even if data is not stale',
53
+ });
54
+ check = Option.Boolean('--check,-c', false, {
55
+ description: 'Check staleness without syncing',
56
+ });
57
+ noAutoMove = Option.Boolean('--no-auto-move', false, {
58
+ description: 'Skip automatic scope movement to completed/',
59
+ });
60
+ noPrdUpdate = Option.Boolean('--no-prd-update', false, {
61
+ description: 'Skip PRD status updates',
62
+ });
63
+ kbOnly = Option.Boolean('--kb-only', false, {
64
+ description: 'Only sync knowledge base',
65
+ });
66
+ async execute() {
67
+ this.context.stdout.write('\n');
68
+ this.context.stdout.write(chalk.bold.blue(' VIBE SYNC\n'));
69
+ this.context.stdout.write(chalk.gray(' ─'.repeat(25)) + '\n\n');
70
+ try {
71
+ // Find project root
72
+ const projectRoot = findProjectRoot(process.cwd());
73
+ if (!projectRoot) {
74
+ this.context.stderr.write(chalk.red(' Error: Not inside a vibe-fabric project.\n'));
75
+ this.context.stderr.write(chalk.gray(' Run `vibe init` to create a planning hub first.\n\n'));
76
+ return 1;
77
+ }
78
+ // Load config
79
+ const config = await loadConfig(projectRoot);
80
+ if (!config) {
81
+ this.context.stderr.write(chalk.red(' Error: Failed to load configuration.\n\n'));
82
+ return 1;
83
+ }
84
+ // Check if repos are configured
85
+ if (config.repos.length === 0) {
86
+ this.context.stderr.write(chalk.yellow(' No repositories configured.\n\n'));
87
+ this.context.stderr.write(chalk.gray(' Add a repository with: ') +
88
+ chalk.cyan('vibe repo add <url>\n\n'));
89
+ return 1;
90
+ }
91
+ // Handle --check mode
92
+ if (this.check) {
93
+ return this.handleCheckMode(projectRoot, config);
94
+ }
95
+ // Check staleness (unless --force)
96
+ if (!this.force) {
97
+ const syncConfig = loadSyncConfig(config);
98
+ const lastSync = await loadLastSync(projectRoot);
99
+ if (!isDataStale(lastSync, syncConfig)) {
100
+ this.context.stdout.write(chalk.green(' Data is fresh.\n\n'));
101
+ this.context.stdout.write(chalk.gray(` Last sync: ${getTimeSinceLastSync(lastSync)}\n`));
102
+ this.context.stdout.write(chalk.gray(` Threshold: ${syncConfig.stale_threshold_minutes} minutes\n\n`));
103
+ this.context.stdout.write(chalk.gray(' Use ') +
104
+ chalk.cyan('--force') +
105
+ chalk.gray(' to sync anyway.\n\n'));
106
+ return 0;
107
+ }
108
+ }
109
+ // Get GitHub token
110
+ const token = await this.getGitHubToken();
111
+ if (!token) {
112
+ return 1;
113
+ }
114
+ const octokit = new Octokit({ auth: token });
115
+ // Determine repos to sync
116
+ let repos = config.repos;
117
+ if (this.alias) {
118
+ const repo = config.repos.find((r) => r.alias === this.alias);
119
+ if (!repo) {
120
+ this.context.stderr.write(chalk.red(` Error: Repository '${this.alias}' not found.\n\n`));
121
+ this.context.stderr.write(chalk.gray(' Available repos: ') +
122
+ config.repos.map((r) => r.alias).join(', ') +
123
+ '\n\n');
124
+ return 1;
125
+ }
126
+ repos = [repo];
127
+ }
128
+ // Perform sync
129
+ return this.performSyncOperation(octokit, projectRoot, config, repos);
130
+ }
131
+ catch (error) {
132
+ this.context.stderr.write(chalk.red(`\n Error: ${error instanceof Error ? error.message : 'Unknown error'}\n\n`));
133
+ return 1;
134
+ }
135
+ }
136
+ /**
137
+ * Get GitHub token from environment or gh CLI
138
+ */
139
+ async getGitHubToken() {
140
+ const spinner = ora('Checking GitHub authentication...').start();
141
+ const discovered = await discoverGitHubToken();
142
+ if (discovered) {
143
+ spinner.succeed(`Authenticated via ${discovered.source === 'env' ? 'environment variable' : 'GitHub CLI'}`);
144
+ return discovered.token;
145
+ }
146
+ spinner.fail('No GitHub token found');
147
+ this.context.stderr.write(chalk.gray('\n Set GITHUB_TOKEN environment variable or run `gh auth login`.\n'));
148
+ this.context.stderr.write(chalk.gray(' Create a token at: https://github.com/settings/tokens\n'));
149
+ this.context.stderr.write(chalk.gray(' Required scopes: repo\n\n'));
150
+ return null;
151
+ }
152
+ /**
153
+ * Handle --check mode
154
+ */
155
+ async handleCheckMode(projectRoot, config) {
156
+ const status = await checkStaleness(projectRoot, config);
157
+ this.context.stdout.write(chalk.bold(' SYNC STATUS\n'));
158
+ this.context.stdout.write(chalk.gray(' ─'.repeat(25)) + '\n\n');
159
+ this.context.stdout.write(` Last sync: ${status.lastSync ? new Date(status.lastSync).toLocaleString() : 'never'}\n`);
160
+ this.context.stdout.write(chalk.gray(` (${status.timeSinceSync})\n\n`));
161
+ this.context.stdout.write(` Threshold: ${status.threshold} minutes\n\n`);
162
+ if (status.isStale) {
163
+ this.context.stdout.write(chalk.yellow(' Status: STALE\n\n'));
164
+ this.context.stdout.write(chalk.gray(" Run 'vibe sync' to refresh data.\n\n"));
165
+ return 1; // Exit code 1 indicates stale
166
+ }
167
+ else {
168
+ this.context.stdout.write(chalk.green(' Status: FRESH\n\n'));
169
+ return 0;
170
+ }
171
+ }
172
+ /**
173
+ * Perform the sync operation
174
+ */
175
+ async performSyncOperation(octokit, projectRoot, config, repos) {
176
+ const spinner = ora('Syncing repositories...').start();
177
+ try {
178
+ const result = await performSync(octokit, projectRoot, config, repos, {
179
+ verbose: this.verbose,
180
+ force: this.force,
181
+ check: this.check,
182
+ noAutoMove: this.noAutoMove,
183
+ noPrdUpdate: this.noPrdUpdate,
184
+ kbOnly: this.kbOnly,
185
+ });
186
+ spinner.stop();
187
+ // Show results
188
+ this.showResults(result);
189
+ return result.success ? 0 : 1;
190
+ }
191
+ catch (error) {
192
+ spinner.fail('Sync failed');
193
+ throw error;
194
+ }
195
+ }
196
+ /**
197
+ * Display sync results
198
+ */
199
+ showResults(result) {
200
+ const { repoResults, aggregated, statusChanges, prdUpdates, duration } = result;
201
+ const successful = repoResults.filter((r) => r.success);
202
+ const failed = repoResults.filter((r) => !r.success);
203
+ // Header
204
+ if (failed.length === 0) {
205
+ this.context.stdout.write(chalk.green.bold(' SYNC COMPLETE\n'));
206
+ }
207
+ else if (successful.length > 0) {
208
+ this.context.stdout.write(chalk.yellow.bold(' SYNC PARTIALLY COMPLETE\n'));
209
+ }
210
+ else {
211
+ this.context.stdout.write(chalk.red.bold(' SYNC FAILED\n'));
212
+ }
213
+ this.context.stdout.write(chalk.gray(' ─'.repeat(25)) + '\n\n');
214
+ // Repos summary
215
+ this.context.stdout.write(` Repos synced: ${successful.length}/${repoResults.length}\n`);
216
+ for (const repo of repoResults) {
217
+ if (repo.success) {
218
+ this.context.stdout.write(chalk.green(` ├── ${repo.alias} `) +
219
+ chalk.gray(`(${repo.filesScanned} files, ${repo.activePlans.length} active, ${repo.completedPlans.length} completed)\n`));
220
+ if (repo.warnings.length > 0 && this.verbose) {
221
+ for (const warning of repo.warnings) {
222
+ this.context.stdout.write(chalk.yellow(` │ ⚠ ${warning}\n`));
223
+ }
224
+ }
225
+ }
226
+ else {
227
+ this.context.stdout.write(chalk.red(` ├── ${repo.alias} ✗ FAILED\n`));
228
+ this.context.stdout.write(chalk.gray(` │ └── ${repo.error}\n`));
229
+ }
230
+ }
231
+ this.context.stdout.write('\n');
232
+ // Status changes
233
+ if (statusChanges.length > 0) {
234
+ this.context.stdout.write(chalk.bold(' Scope Status Changes:\n'));
235
+ for (const change of statusChanges) {
236
+ const arrow = '→';
237
+ let statusColor = chalk.white;
238
+ if (change.to === 'completed')
239
+ statusColor = chalk.green;
240
+ else if (change.to === 'in_progress')
241
+ statusColor = chalk.cyan;
242
+ else if (change.to === 'blocked')
243
+ statusColor = chalk.red;
244
+ let line = ` ├── ${change.scopeId}: ${change.from} ${arrow} ${statusColor(change.to)}`;
245
+ if (change.completionPercentage !== undefined && change.to === 'in_progress') {
246
+ line += chalk.gray(` (${change.completionPercentage}% complete)`);
247
+ }
248
+ this.context.stdout.write(line + '\n');
249
+ if (change.autoMoved) {
250
+ this.context.stdout.write(chalk.gray(' │ └── Auto-moved to docs/scopes/completed/\n'));
251
+ }
252
+ }
253
+ this.context.stdout.write('\n');
254
+ }
255
+ // PRD updates
256
+ if (prdUpdates.length > 0) {
257
+ this.context.stdout.write(chalk.bold(' PRD Updates:\n'));
258
+ for (const update of prdUpdates) {
259
+ this.context.stdout.write(chalk.gray(` └── ${update.module}: `) +
260
+ chalk.cyan(update.requirement) +
261
+ chalk.gray(` → ${update.status}\n`));
262
+ }
263
+ this.context.stdout.write('\n');
264
+ }
265
+ // Blockers
266
+ if (aggregated.blockers.length > 0) {
267
+ this.context.stdout.write(chalk.yellow.bold(` ⚠ BLOCKERS DETECTED: ${aggregated.blockers.length}\n`));
268
+ for (const blocker of aggregated.blockers) {
269
+ this.context.stdout.write(chalk.yellow(` ├── ${blocker.planId} (${blocker.repo})\n`));
270
+ this.context.stdout.write(chalk.gray(` │ Source: ${blocker.sourceScope}\n`));
271
+ this.context.stdout.write(chalk.gray(` │ Blocked by: ${blocker.blockedBy}\n`));
272
+ }
273
+ this.context.stdout.write('\n');
274
+ }
275
+ // Summary stats
276
+ if (this.verbose) {
277
+ this.context.stdout.write(chalk.bold(' Summary:\n'));
278
+ this.context.stdout.write(chalk.gray(` ├── Completed: ${aggregated.summary.scopes_completed}\n`));
279
+ this.context.stdout.write(chalk.gray(` ├── In Progress: ${aggregated.summary.scopes_in_progress}\n`));
280
+ this.context.stdout.write(chalk.gray(` ├── Pending: ${aggregated.summary.scopes_pending}\n`));
281
+ this.context.stdout.write(chalk.gray(` ├── Active Plans: ${aggregated.summary.active_plans}\n`));
282
+ this.context.stdout.write(chalk.gray(` ├── Completed Plans: ${aggregated.summary.completed_plans}\n`));
283
+ this.context.stdout.write(chalk.gray(` └── KB Entries: ${aggregated.kb_summary.total_entries}\n`));
284
+ this.context.stdout.write('\n');
285
+ }
286
+ // Duration
287
+ const durationSec = (duration / 1000).toFixed(1);
288
+ this.context.stdout.write(chalk.gray(` Duration: ${durationSec}s\n`));
289
+ this.context.stdout.write(chalk.gray(` Last sync: ${aggregated.generated_at}\n\n`));
290
+ // Troubleshooting for failures
291
+ if (failed.length > 0) {
292
+ this.context.stdout.write(chalk.yellow(' Troubleshooting:\n'));
293
+ this.context.stdout.write(chalk.gray(' 1. Check GitHub token has access to all repos\n'));
294
+ this.context.stdout.write(chalk.gray(' 2. Verify repo URLs in vibe-fabric.toml\n'));
295
+ this.context.stdout.write(chalk.gray(' 3. Run: vibe doctor\n\n'));
296
+ }
297
+ }
298
+ }
299
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from 'clipanion';
2
+ export declare class VersionCommand extends Command {
3
+ static paths: string[][];
4
+ static usage: import("clipanion").Usage;
5
+ execute(): Promise<number>;
6
+ }
7
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,qBAAa,cAAe,SAAQ,OAAO;IACzC,OAAgB,KAAK,aAAwC;IAE7D,OAAgB,KAAK,4BAGlB;IAEG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAUjC"}
@@ -0,0 +1,45 @@
1
+ import { Command } from 'clipanion';
2
+ import chalk from 'chalk';
3
+ import { readFile } from 'fs/promises';
4
+ import { fileURLToPath } from 'url';
5
+ import path from 'path';
6
+ export class VersionCommand extends Command {
7
+ static paths = [['version'], ['--version'], ['-v']];
8
+ static usage = Command.Usage({
9
+ description: 'Show vibe-fabric version',
10
+ examples: [['Show version', 'vibe version']],
11
+ });
12
+ async execute() {
13
+ try {
14
+ const version = await getPackageVersion();
15
+ this.context.stdout.write(`${chalk.bold('vibe-fabric')} ${chalk.green(`v${version}`)}\n`);
16
+ return 0;
17
+ }
18
+ catch (error) {
19
+ this.context.stderr.write(chalk.red('Failed to read version\n'));
20
+ return 1;
21
+ }
22
+ }
23
+ }
24
+ /**
25
+ * Get version from package.json
26
+ */
27
+ async function getPackageVersion() {
28
+ const __filename = fileURLToPath(import.meta.url);
29
+ const __dirname = path.dirname(__filename);
30
+ // Navigate up from dist/cli/commands to find package.json
31
+ const packagePath = path.resolve(__dirname, '../../../package.json');
32
+ try {
33
+ const content = await readFile(packagePath, 'utf-8');
34
+ const pkg = JSON.parse(content);
35
+ return pkg.version;
36
+ }
37
+ catch {
38
+ // Fallback: try from project root (during development)
39
+ const devPath = path.resolve(__dirname, '../../../../package.json');
40
+ const content = await readFile(devPath, 'utf-8');
41
+ const pkg = JSON.parse(content);
42
+ return pkg.version;
43
+ }
44
+ }
45
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/cli/commands/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,OAAO,cAAe,SAAQ,OAAO;IACzC,MAAM,CAAU,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7D,MAAM,CAAU,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QACpC,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;KAC7C,CAAC,CAAC;IAEH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;YAC1F,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;;AAGH;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3C,0DAA0D;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAwB,CAAC;QACvD,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAwB,CAAC;QACvD,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ import { Cli, Builtins } from 'clipanion';
3
+ import { InitCommand } from './commands/init.js';
4
+ import { VersionCommand } from './commands/version.js';
5
+ import { HelpCommand } from './commands/help.js';
6
+ import { DoctorCommand } from './commands/doctor.js';
7
+ import { RepoAddCommand } from './commands/repo/add.js';
8
+ import { PrdCommand } from './commands/prd.js';
9
+ import { ScopeCommand } from './commands/scope.js';
10
+ import { SendCommand } from './commands/send.js';
11
+ import { SyncCommand } from './commands/sync.js';
12
+ import { StatusCommand } from './commands/status.js';
13
+ import { CoverageCommand } from './commands/coverage.js';
14
+ import { GapsCommand } from './commands/gaps.js';
15
+ import { ClaudeCommandsCommand } from './commands/claude.js';
16
+ import { runDashboard } from './ui/dashboard.js';
17
+ // Create CLI instance
18
+ const cli = new Cli({
19
+ binaryLabel: 'vibe-fabric',
20
+ binaryName: 'vibe',
21
+ binaryVersion: '0.1.0',
22
+ });
23
+ // Register commands
24
+ cli.register(InitCommand);
25
+ cli.register(VersionCommand);
26
+ cli.register(HelpCommand);
27
+ cli.register(DoctorCommand);
28
+ cli.register(RepoAddCommand);
29
+ cli.register(PrdCommand);
30
+ cli.register(ScopeCommand);
31
+ cli.register(SendCommand);
32
+ cli.register(SyncCommand);
33
+ cli.register(StatusCommand);
34
+ cli.register(CoverageCommand);
35
+ cli.register(GapsCommand);
36
+ cli.register(ClaudeCommandsCommand);
37
+ // Register built-in commands
38
+ cli.register(Builtins.DefinitionsCommand);
39
+ // Run CLI
40
+ const args = process.argv.slice(2);
41
+ // Check for --no-tui flag
42
+ const noTui = args.includes('--no-tui');
43
+ const filteredArgs = args.filter((arg) => arg !== '--no-tui');
44
+ // Default behavior when no arguments:
45
+ // - Open TUI dashboard (unless --no-tui is passed)
46
+ // - With --no-tui, show help
47
+ async function main() {
48
+ if (filteredArgs.length === 0 && !noTui) {
49
+ // Run TUI dashboard
50
+ await runDashboard();
51
+ }
52
+ else if (filteredArgs.length === 0 && noTui) {
53
+ // Show help
54
+ await cli.runExit(['help']);
55
+ }
56
+ else {
57
+ // Run specified command
58
+ await cli.runExit(filteredArgs);
59
+ }
60
+ }
61
+ main().catch((error) => {
62
+ console.error('Error:', error instanceof Error ? error.message : error);
63
+ process.exit(1);
64
+ });
65
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Active scopes component
3
+ * Shows scopes with progress indicators
4
+ */
5
+ import React from 'react';
6
+ import type { ScopeInfo, ScopeSummary } from '../../../core/dashboard/data.js';
7
+ interface ActiveScopesProps {
8
+ scopes: ScopeInfo[];
9
+ summary: ScopeSummary;
10
+ }
11
+ export declare const ActiveScopes: React.FC<ActiveScopesProps>;
12
+ export {};
13
+ //# sourceMappingURL=ActiveScopes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActiveScopes.d.ts","sourceRoot":"","sources":["../../../../src/cli/ui/components/ActiveScopes.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AA8B/E,UAAU,iBAAiB;IACzB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAwCpD,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ /**
4
+ * Progress indicator for scope
5
+ */
6
+ const ScopeProgress = ({ status, progress, }) => {
7
+ if (status === 'draft') {
8
+ return _jsx(Text, { color: "gray", children: "draft" });
9
+ }
10
+ if (status === 'completed') {
11
+ return _jsx(Text, { color: "green", children: "done" });
12
+ }
13
+ const width = 10;
14
+ const filled = Math.round((progress / 100) * width);
15
+ const empty = width - filled;
16
+ return (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: '▓'.repeat(filled) }), _jsx(Text, { color: "gray", children: '░'.repeat(empty) }), _jsxs(Text, { children: [" ", progress, "%"] })] }));
17
+ };
18
+ export const ActiveScopes = ({ scopes, summary }) => {
19
+ // Show only active/sent scopes, limited to 5
20
+ const activeScopes = scopes
21
+ .filter((s) => s.status === 'sent' || s.status === 'draft')
22
+ .slice(0, 5);
23
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsx(Text, { bold: true, children: " Active Scopes " }), activeScopes.length === 0 ? (_jsxs(Box, { flexDirection: "column", paddingY: 1, children: [_jsx(Text, { color: "gray", children: "No active scopes." }), _jsx(Text, { color: "gray", children: " " }), _jsxs(Text, { children: ["Press ", _jsx(Text, { color: "cyan", children: "[S]" }), " to create a new scope."] })] })) : (_jsxs(_Fragment, { children: [activeScopes.map((scope) => (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: scope.id.padEnd(12) }), _jsx(Text, { children: scope.title.slice(0, 25).padEnd(27) }), _jsx(Text, { color: "gray", children: (scope.target ?? '').padEnd(10) }), _jsx(ScopeProgress, { status: scope.status, progress: scope.progress })] }, scope.id))), _jsxs(Text, { color: "gray", children: [summary.active, " active, ", summary.completed, " completed, ", summary.draft, " draft"] })] }))] }));
24
+ };
25
+ //# sourceMappingURL=ActiveScopes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActiveScopes.js","sourceRoot":"","sources":["../../../../src/cli/ui/components/ActiveScopes.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAGhC;;GAEG;AACH,MAAM,aAAa,GAAgE,CAAC,EAClF,MAAM,EACN,QAAQ,GACT,EAAE,EAAE;IACH,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,sBAAa,CAAC;IACzC,CAAC;IAED,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,OAAO,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,qBAAY,CAAC;IACzC,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAE7B,OAAO,CACL,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAQ,EAC9C,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAQ,EAC7C,MAAC,IAAI,oBAAG,QAAQ,SAAS,IACpB,CACR,CAAC;AACJ,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;IAC/E,6CAA6C;IAC7C,MAAM,YAAY,GAAG,MAAM;SACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;SAC1D,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEf,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,aAEX,KAAC,IAAI,IAAC,IAAI,sCAAuB,EAEhC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC3B,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aACrC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kCAAyB,EAC3C,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAS,EAC3B,MAAC,IAAI,yBACG,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,oBAAW,+BAC9B,IACH,CACP,CAAC,CAAC,CAAC,CACF,8BACG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EAC/C,KAAC,IAAI,cAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EAClD,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EAC3D,KAAC,aAAa,IAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAI,KAJzD,KAAK,CAAC,EAAE,CAKZ,CACP,CAAC,EACF,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aACf,OAAO,CAAC,MAAM,eAAW,OAAO,CAAC,SAAS,kBAAc,OAAO,CAAC,KAAK,cACjE,IACN,CACJ,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Empty state component
3
+ * Reusable component for empty/loading states
4
+ */
5
+ import React from 'react';
6
+ interface EmptyStateProps {
7
+ message: string;
8
+ hint?: string;
9
+ shortcut?: {
10
+ key: string;
11
+ action: string;
12
+ };
13
+ }
14
+ export declare const EmptyState: React.FC<EmptyStateProps>;
15
+ interface LoadingStateProps {
16
+ message?: string;
17
+ }
18
+ export declare const LoadingState: React.FC<LoadingStateProps>;
19
+ interface NoProjectStateProps {
20
+ onInit?: () => void;
21
+ }
22
+ export declare const NoProjectState: React.FC<NoProjectStateProps>;
23
+ export {};
24
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../../../src/cli/ui/components/EmptyState.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAYhD,CAAC;AAEF,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CASpD,CAAC;AAEF,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAsBxD,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ export const EmptyState = ({ message, hint, shortcut }) => {
5
+ return (_jsxs(Box, { flexDirection: "column", paddingY: 1, children: [_jsx(Text, { color: "gray", children: message }), hint && _jsx(Text, { color: "gray", children: hint }), shortcut && (_jsxs(Text, { children: ["Press ", _jsxs(Text, { color: "cyan", children: ["[", shortcut.key, "]"] }), " to ", shortcut.action, "."] }))] }));
6
+ };
7
+ export const LoadingState = ({ message = 'Loading...' }) => {
8
+ return (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { children: [" ", message] })] }));
9
+ };
10
+ export const NoProjectState = () => {
11
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", padding: 2, alignItems: "center", children: [_jsx(Text, { bold: true, color: "yellow", children: "No project found" }), _jsx(Text, { children: " " }), _jsx(Text, { color: "gray", children: "No vibe-fabric.toml found in this directory." }), _jsx(Text, { children: " " }), _jsxs(Text, { children: ["Run ", _jsx(Text, { color: "cyan", children: "vibe init" }), " to create a new project."] }), _jsx(Text, { children: " " }), _jsxs(Text, { color: "gray", children: ["Press ", _jsx(Text, { color: "cyan", children: "[I]" }), " to init or ", _jsx(Text, { color: "cyan", children: "[Q]" }), " to quit."] })] }));
12
+ };
13
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../../../../src/cli/ui/components/EmptyState.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,OAAO,MAAM,aAAa,CAAC;AAQlC,MAAM,CAAC,MAAM,UAAU,GAA8B,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;IACnF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aACrC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,OAAO,GAAQ,EAClC,IAAI,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,IAAI,GAAQ,EACxC,QAAQ,IAAI,CACX,MAAC,IAAI,yBACG,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAG,QAAQ,CAAC,GAAG,SAAS,UAAK,QAAQ,CAAC,MAAM,SAC/D,CACR,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EAAE,OAAO,GAAG,YAAY,EAAE,EAAE,EAAE;IACtF,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAChB,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,EACP,MAAC,IAAI,oBAAG,OAAO,IAAQ,IACnB,CACP,CAAC;AACJ,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,cAAc,GAAkC,GAAG,EAAE;IAChE,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,QAAQ,EACpB,OAAO,EAAE,CAAC,EACV,UAAU,EAAC,QAAQ,aAEnB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,iCAAwB,EACjD,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,6DAAoD,EACtE,KAAC,IAAI,oBAAS,EACd,MAAC,IAAI,uBACC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,0BAAiB,iCAClC,EACP,KAAC,IAAI,oBAAS,EACd,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uBACV,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,oBAAW,kBAAY,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,oBAAW,iBACvE,IACH,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Dashboard header component
3
+ * Shows project name, version, and sync status
4
+ */
5
+ import React from 'react';
6
+ import type { HeaderInfo } from '../../../core/dashboard/data.js';
7
+ interface HeaderProps extends HeaderInfo {
8
+ }
9
+ export declare const Header: React.FC<HeaderProps>;
10
+ export {};
11
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../../src/cli/ui/components/Header.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAgClE,UAAU,WAAY,SAAQ,UAAU;CAAG;AAE3C,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAsBxC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ /**
4
+ * Format time difference for display
5
+ */
6
+ function formatSyncAge(lastSync) {
7
+ if (!lastSync) {
8
+ return { text: 'never synced', color: 'yellow' };
9
+ }
10
+ const ageMs = Date.now() - lastSync.getTime();
11
+ const minutes = Math.floor(ageMs / 60000);
12
+ if (minutes < 5) {
13
+ return { text: 'synced just now', color: 'green' };
14
+ }
15
+ if (minutes < 30) {
16
+ return { text: `synced ${minutes}m ago`, color: 'green' };
17
+ }
18
+ if (minutes < 60) {
19
+ return { text: `synced ${minutes}m ago`, color: 'yellow' };
20
+ }
21
+ const hours = Math.floor(minutes / 60);
22
+ if (hours < 24) {
23
+ return { text: `synced ${hours}h ago`, color: 'yellow' };
24
+ }
25
+ const days = Math.floor(hours / 24);
26
+ return { text: `stale (${days}d ago)`, color: 'red' };
27
+ }
28
+ export const Header = ({ projectName, version, lastSync }) => {
29
+ const syncStatus = formatSyncAge(lastSync);
30
+ return (_jsxs(Box, { borderStyle: "round", borderColor: "blue", paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { bold: true, color: "cyan", children: "VIBE-FABRIC" }), _jsx(Text, { color: "gray", children: " " }), _jsx(Text, { children: projectName })] }), _jsxs(Box, { children: [_jsxs(Text, { color: "gray", children: ["v", version] }), _jsx(Text, { color: "gray", children: " " }), _jsx(Text, { color: syncStatus.color, children: syncStatus.text })] })] }));
31
+ };
32
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../../src/cli/ui/components/Header.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAGhC;;GAEG;AACH,SAAS,aAAa,CAAC,QAAe;IACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACnD,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IAE1C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,EAAE,UAAU,OAAO,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5D,CAAC;IACD,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,EAAE,UAAU,OAAO,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,UAAU,KAAK,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,IAAI,EAAE,UAAU,IAAI,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACxD,CAAC;AAID,MAAM,CAAC,MAAM,MAAM,GAA0B,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;IAClF,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,CACL,MAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAE9B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,4BAAmB,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAS,EAC3B,KAAC,IAAI,cAAE,WAAW,GAAQ,IACtB,EACN,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAG,OAAO,IAAQ,EACpC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,mBAAU,EAC5B,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,CAAC,KAAK,YAAG,UAAU,CAAC,IAAI,GAAQ,IACnD,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}