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,565 @@
1
+ /**
2
+ * Core send logic for pushing scopes to dev repositories
3
+ */
4
+ import { readFile, writeFile, rename, mkdir, access } from 'fs/promises';
5
+ import { constants } from 'fs';
6
+ import path from 'path';
7
+ import { validateDependencies, checkSendability } from './dependencies.js';
8
+ /**
9
+ * Parse scope metadata from markdown content
10
+ */
11
+ export function parseScopeMetadata(content) {
12
+ const metadata = {};
13
+ // Parse ID from title
14
+ const titleMatch = content.match(/^#\s+SCOPE-(\d{3}):\s*(.+)$/m);
15
+ if (titleMatch) {
16
+ metadata.id = `SCOPE-${titleMatch[1]}`;
17
+ }
18
+ // Parse metadata table
19
+ const idMatch = content.match(/\*\*ID\*\*\s*\|\s*`?(SCOPE-\d{3})`?/);
20
+ if (idMatch) {
21
+ metadata.id = idMatch[1];
22
+ }
23
+ const statusMatch = content.match(/\*\*Status\*\*\s*\|\s*`?(\w+)`?/);
24
+ if (statusMatch && statusMatch[1]) {
25
+ metadata.status = statusMatch[1].toLowerCase();
26
+ }
27
+ const targetMatch = content.match(/\*\*Target\*\*\s*\|\s*`?(\w+)`?/);
28
+ if (targetMatch && targetMatch[1]) {
29
+ metadata.target = targetMatch[1].toLowerCase();
30
+ }
31
+ const complexityMatch = content.match(/\*\*Complexity\*\*\s*\|\s*`?([SMLX]+)`?/);
32
+ if (complexityMatch && complexityMatch[1]) {
33
+ metadata.complexity = complexityMatch[1];
34
+ }
35
+ const priorityMatch = content.match(/\*\*Priority\*\*\s*\|\s*`?(P\d)`?/);
36
+ if (priorityMatch && priorityMatch[1]) {
37
+ metadata.priority = priorityMatch[1];
38
+ }
39
+ const moduleMatch = content.match(/\*\*Module\*\*\s*\|\s*`?([^|`\n]+)`?/);
40
+ if (moduleMatch && moduleMatch[1]) {
41
+ metadata.module = moduleMatch[1].trim();
42
+ }
43
+ if (!metadata.id || !metadata.status || !metadata.target) {
44
+ return null;
45
+ }
46
+ return metadata;
47
+ }
48
+ /**
49
+ * Parse scope summary from markdown content
50
+ */
51
+ export function parseScopeSummary(content) {
52
+ const summaryMatch = content.match(/## Summary\s*\n\n([^\n#]+)/);
53
+ return summaryMatch && summaryMatch[1] ? summaryMatch[1].trim() : '';
54
+ }
55
+ /**
56
+ * Extract scope title from content
57
+ */
58
+ export function parseScopeTitle(content) {
59
+ const titleMatch = content.match(/^#\s+SCOPE-\d{3}:\s*(.+)$/m);
60
+ return titleMatch && titleMatch[1] ? titleMatch[1].trim() : '';
61
+ }
62
+ /**
63
+ * Parse a scope file
64
+ */
65
+ export async function parseScope(filePath) {
66
+ try {
67
+ const content = await readFile(filePath, 'utf-8');
68
+ const metadata = parseScopeMetadata(content);
69
+ if (!metadata) {
70
+ return null;
71
+ }
72
+ const title = parseScopeTitle(content);
73
+ const summary = parseScopeSummary(content);
74
+ const fileName = path.basename(filePath);
75
+ // Parse tracking metadata if present
76
+ let tracking;
77
+ const trackingMatch = content.match(/## Tracking\s*\n```json\n([\s\S]*?)\n```/);
78
+ if (trackingMatch && trackingMatch[1]) {
79
+ try {
80
+ tracking = JSON.parse(trackingMatch[1]);
81
+ }
82
+ catch {
83
+ // Invalid tracking JSON
84
+ }
85
+ }
86
+ return {
87
+ id: metadata.id,
88
+ title,
89
+ metadata,
90
+ summary,
91
+ content,
92
+ filePath,
93
+ fileName,
94
+ tracking,
95
+ };
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * Find scope in ready directory by ID
103
+ */
104
+ export async function findReadyScope(projectPath, scopeId) {
105
+ const readyPath = path.join(projectPath, 'docs', 'scopes', 'ready');
106
+ try {
107
+ const { readdir } = await import('fs/promises');
108
+ const files = await readdir(readyPath);
109
+ const scopeFile = files.find((f) => f.startsWith(scopeId) && f.endsWith('.md'));
110
+ if (!scopeFile) {
111
+ return null;
112
+ }
113
+ return parseScope(path.join(readyPath, scopeFile));
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ }
119
+ /**
120
+ * Get target repos for a scope based on target field
121
+ */
122
+ export function getTargetRepos(scope, config) {
123
+ const target = scope.metadata.target.toLowerCase();
124
+ if (target === 'both') {
125
+ // Get repos in order specified by repo_order, or alphabetically
126
+ const order = scope.metadata.repo_order || ['backend', 'frontend'];
127
+ const repos = [];
128
+ for (const alias of order) {
129
+ const repo = config.repos.find((r) => r.alias === alias);
130
+ if (repo) {
131
+ repos.push(repo);
132
+ }
133
+ }
134
+ // Add any remaining repos that weren't in the order
135
+ for (const repo of config.repos) {
136
+ if (!repos.find((r) => r.alias === repo.alias)) {
137
+ repos.push(repo);
138
+ }
139
+ }
140
+ return repos;
141
+ }
142
+ // Single target - find repo by alias
143
+ const repo = config.repos.find((r) => r.alias === target);
144
+ return repo ? [repo] : [];
145
+ }
146
+ /**
147
+ * Check the state of a scope in a dev repository
148
+ */
149
+ export async function checkDevRepoState(octokit, owner, repo, branch, scopeId) {
150
+ const result = {
151
+ exists: false,
152
+ processed: false,
153
+ location: null,
154
+ };
155
+ // Check incoming-scopes
156
+ const incomingPath = `vibe/incoming-scopes`;
157
+ try {
158
+ const { data: contents } = await octokit.rest.repos.getContent({
159
+ owner,
160
+ repo,
161
+ path: incomingPath,
162
+ ref: branch,
163
+ });
164
+ if (Array.isArray(contents)) {
165
+ const scopeFile = contents.find((f) => f.name.startsWith(scopeId) && f.name.endsWith('.md'));
166
+ if (scopeFile) {
167
+ result.exists = true;
168
+ result.location = 'incoming';
169
+ }
170
+ }
171
+ }
172
+ catch {
173
+ // Directory doesn't exist or can't be read
174
+ }
175
+ // Check processed folder
176
+ const processedPath = `vibe/incoming-scopes/processed`;
177
+ try {
178
+ const { data: contents } = await octokit.rest.repos.getContent({
179
+ owner,
180
+ repo,
181
+ path: processedPath,
182
+ ref: branch,
183
+ });
184
+ if (Array.isArray(contents)) {
185
+ const scopeFile = contents.find((f) => f.name.startsWith(scopeId) && f.name.endsWith('.md'));
186
+ if (scopeFile) {
187
+ result.exists = true;
188
+ result.processed = true;
189
+ result.location = 'processed';
190
+ }
191
+ }
192
+ }
193
+ catch {
194
+ // Directory doesn't exist
195
+ }
196
+ // Check for implementation plan
197
+ const planPaths = [
198
+ `vibe/implementation-plans/active/${scopeId}-plan.md`,
199
+ `vibe/implementation-plans/completed/${scopeId}-plan.md`,
200
+ ];
201
+ for (const planPath of planPaths) {
202
+ try {
203
+ await octokit.rest.repos.getContent({
204
+ owner,
205
+ repo,
206
+ path: planPath,
207
+ ref: branch,
208
+ });
209
+ result.plan_path = planPath;
210
+ result.plan_status = planPath.includes('/active/') ? 'active' : 'completed';
211
+ break;
212
+ }
213
+ catch {
214
+ // Plan doesn't exist at this path
215
+ }
216
+ }
217
+ return result;
218
+ }
219
+ /**
220
+ * Push scope file to dev repository
221
+ */
222
+ export async function pushScopeToRepo(octokit, owner, repo, branch, scope, tracking) {
223
+ try {
224
+ // Get the current commit SHA
225
+ const { data: ref } = await octokit.rest.git.getRef({
226
+ owner,
227
+ repo,
228
+ ref: `heads/${branch}`,
229
+ });
230
+ const baseSha = ref.object.sha;
231
+ // Prepare scope content with tracking metadata
232
+ let scopeContent = scope.content;
233
+ // Remove existing tracking section if present
234
+ scopeContent = scopeContent.replace(/\n## Tracking\s*\n```json\n[\s\S]*?\n```\n?/, '');
235
+ // Add tracking metadata section
236
+ scopeContent += `\n\n## Tracking\n\n\`\`\`json\n${JSON.stringify(tracking, null, 2)}\n\`\`\`\n`;
237
+ // Create blob for scope file
238
+ const { data: blob } = await octokit.rest.git.createBlob({
239
+ owner,
240
+ repo,
241
+ content: Buffer.from(scopeContent).toString('base64'),
242
+ encoding: 'base64',
243
+ });
244
+ // Create tree with the scope file
245
+ const scopePath = `vibe/incoming-scopes/${scope.fileName}`;
246
+ const { data: newTree } = await octokit.rest.git.createTree({
247
+ owner,
248
+ repo,
249
+ base_tree: baseSha,
250
+ tree: [
251
+ {
252
+ path: scopePath,
253
+ mode: '100644',
254
+ type: 'blob',
255
+ sha: blob.sha,
256
+ },
257
+ ],
258
+ });
259
+ // Create commit
260
+ const isUpdate = tracking.version > 1;
261
+ const commitMessage = isUpdate
262
+ ? `[vibe-fabric] Update ${scope.id} (v${tracking.version})`
263
+ : `[vibe-fabric] Add ${scope.id}: ${scope.title}`;
264
+ const { data: commit } = await octokit.rest.git.createCommit({
265
+ owner,
266
+ repo,
267
+ message: commitMessage,
268
+ tree: newTree.sha,
269
+ parents: [baseSha],
270
+ });
271
+ // Update branch reference
272
+ await octokit.rest.git.updateRef({
273
+ owner,
274
+ repo,
275
+ ref: `heads/${branch}`,
276
+ sha: commit.sha,
277
+ });
278
+ return {
279
+ success: true,
280
+ commit_sha: commit.sha,
281
+ };
282
+ }
283
+ catch (error) {
284
+ return {
285
+ success: false,
286
+ error: error instanceof Error ? error.message : 'Unknown error',
287
+ };
288
+ }
289
+ }
290
+ /**
291
+ * Create GitHub Issue for scope notification
292
+ */
293
+ export async function createGitHubIssue(octokit, owner, repo, scope) {
294
+ try {
295
+ const body = `## New Scope: ${scope.id}
296
+
297
+ **${scope.title}**
298
+
299
+ ### Summary
300
+
301
+ ${scope.summary}
302
+
303
+ ### Metadata
304
+
305
+ | Field | Value |
306
+ |-------|-------|
307
+ | Priority | ${scope.metadata.priority} |
308
+ | Complexity | ${scope.metadata.complexity} |
309
+ | Target | ${scope.metadata.target} |
310
+ ${scope.metadata.module ? `| Module | ${scope.metadata.module} |` : ''}
311
+
312
+ ### Next Steps
313
+
314
+ 1. Review the scope document in \`vibe/incoming-scopes/${scope.fileName}\`
315
+ 2. Create an implementation plan in \`vibe/implementation-plans/active/\`
316
+ 3. Begin implementation
317
+ 4. Move completed plan to \`vibe/implementation-plans/completed/\`
318
+
319
+ ---
320
+ *This issue was created automatically by [vibe-fabric](https://github.com/jneaimi/vibe-fabric)*
321
+ `;
322
+ const labels = ['vibe-scope', `priority:${scope.metadata.priority.toLowerCase()}`];
323
+ const { data: issue } = await octokit.rest.issues.create({
324
+ owner,
325
+ repo,
326
+ title: `[${scope.id}] ${scope.title}`,
327
+ body,
328
+ labels,
329
+ });
330
+ return {
331
+ success: true,
332
+ issue_number: issue.number,
333
+ issue_url: issue.html_url,
334
+ };
335
+ }
336
+ catch (error) {
337
+ return {
338
+ success: false,
339
+ error: error instanceof Error ? error.message : 'Unknown error',
340
+ };
341
+ }
342
+ }
343
+ /**
344
+ * Add comment to existing GitHub Issue
345
+ */
346
+ export async function addIssueComment(octokit, owner, repo, issueNumber, scope, version) {
347
+ try {
348
+ const body = `## Scope Updated (v${version})
349
+
350
+ The scope document has been updated. Please review the changes in \`vibe/incoming-scopes/${scope.fileName}\`.
351
+
352
+ ---
353
+ *Updated by [vibe-fabric](https://github.com/jneaimi/vibe-fabric)*
354
+ `;
355
+ await octokit.rest.issues.createComment({
356
+ owner,
357
+ repo,
358
+ issue_number: issueNumber,
359
+ body,
360
+ });
361
+ return { success: true };
362
+ }
363
+ catch (error) {
364
+ return {
365
+ success: false,
366
+ error: error instanceof Error ? error.message : 'Unknown error',
367
+ };
368
+ }
369
+ }
370
+ /**
371
+ * Move scope from ready to sent
372
+ */
373
+ export async function moveScopeToSent(projectPath, scope) {
374
+ const sentPath = path.join(projectPath, 'docs', 'scopes', 'sent');
375
+ // Ensure sent directory exists
376
+ try {
377
+ await access(sentPath, constants.W_OK);
378
+ }
379
+ catch {
380
+ await mkdir(sentPath, { recursive: true });
381
+ }
382
+ const newPath = path.join(sentPath, scope.fileName);
383
+ await rename(scope.filePath, newPath);
384
+ }
385
+ /**
386
+ * Update scope file with tracking metadata and new status
387
+ */
388
+ export async function updateScopeWithTracking(scope, tracking, _results) {
389
+ let content = scope.content;
390
+ // Update status to 'sent'
391
+ content = content.replace(/(\*\*Status\*\*\s*\|\s*)`?\w+`?/, '$1`sent`');
392
+ // Remove existing tracking section if present
393
+ content = content.replace(/\n## Tracking\s*\n```json\n[\s\S]*?\n```\n?/, '');
394
+ // Add tracking metadata section
395
+ content += `\n\n## Tracking\n\n\`\`\`json\n${JSON.stringify(tracking, null, 2)}\n\`\`\`\n`;
396
+ await writeFile(scope.filePath, content, 'utf-8');
397
+ }
398
+ /**
399
+ * Send a single scope to its target repositories
400
+ */
401
+ export async function sendScope(octokit, projectPath, scope, config, options = {}) {
402
+ const results = [];
403
+ const targetRepos = getTargetRepos(scope, config);
404
+ if (targetRepos.length === 0) {
405
+ return [
406
+ {
407
+ repo: scope.metadata.target,
408
+ alias: scope.metadata.target,
409
+ success: false,
410
+ error: `No repository found with alias '${scope.metadata.target}'`,
411
+ },
412
+ ];
413
+ }
414
+ // Validate dependencies
415
+ const depValidation = await validateDependencies(projectPath, scope);
416
+ if (!depValidation.valid && !options.force) {
417
+ const blockingMsg = depValidation.blocking
418
+ .map((b) => `${b.scopeId} (${b.status})`)
419
+ .join(', ');
420
+ const firstRepo = targetRepos[0];
421
+ return [
422
+ {
423
+ repo: firstRepo?.name || scope.metadata.target,
424
+ alias: firstRepo?.alias || scope.metadata.target,
425
+ success: false,
426
+ error: `Blocking dependencies not completed: ${blockingMsg}`,
427
+ },
428
+ ];
429
+ }
430
+ // Prepare tracking metadata
431
+ const existingVersion = scope.tracking?.version || 0;
432
+ const newVersion = existingVersion + 1;
433
+ const tracking = {
434
+ version: newVersion,
435
+ sent_at: new Date().toISOString(),
436
+ sent_from: projectPath,
437
+ source_path: scope.filePath,
438
+ target_repos: targetRepos.map((r) => r.alias),
439
+ github_issues: scope.tracking?.github_issues || {},
440
+ version_history: [
441
+ ...(scope.tracking?.version_history || []),
442
+ {
443
+ version: newVersion,
444
+ sent_at: new Date().toISOString(),
445
+ },
446
+ ],
447
+ };
448
+ // Send to each target repo
449
+ for (const repo of targetRepos) {
450
+ // Check dev repo state
451
+ const devState = await checkDevRepoState(octokit, repo.owner, repo.name, repo.branch, scope.id);
452
+ // Handle re-send scenarios
453
+ if (devState.processed || devState.plan_status) {
454
+ if (!options.force) {
455
+ results.push({
456
+ repo: repo.name,
457
+ alias: repo.alias,
458
+ success: false,
459
+ skipped: true,
460
+ skip_reason: devState.plan_status
461
+ ? `Scope has ${devState.plan_status} implementation plan`
462
+ : 'Scope already processed',
463
+ });
464
+ continue;
465
+ }
466
+ }
467
+ if (options.dryRun) {
468
+ results.push({
469
+ repo: repo.name,
470
+ alias: repo.alias,
471
+ success: true,
472
+ skipped: true,
473
+ skip_reason: 'Dry run - no changes made',
474
+ });
475
+ continue;
476
+ }
477
+ // Push scope to repo
478
+ const pushResult = await pushScopeToRepo(octokit, repo.owner, repo.name, repo.branch, scope, tracking);
479
+ if (!pushResult.success) {
480
+ results.push({
481
+ repo: repo.name,
482
+ alias: repo.alias,
483
+ success: false,
484
+ error: pushResult.error,
485
+ });
486
+ continue;
487
+ }
488
+ // Handle GitHub Issue
489
+ let issueNumber;
490
+ let issueUrl;
491
+ if (!options.noNotify) {
492
+ const existingIssue = tracking.github_issues[repo.alias];
493
+ if (existingIssue) {
494
+ // Add comment to existing issue
495
+ await addIssueComment(octokit, repo.owner, repo.name, existingIssue, scope, newVersion);
496
+ issueNumber = existingIssue;
497
+ }
498
+ else {
499
+ // Create new issue
500
+ const issueResult = await createGitHubIssue(octokit, repo.owner, repo.name, scope);
501
+ if (issueResult.success) {
502
+ issueNumber = issueResult.issue_number;
503
+ issueUrl = issueResult.issue_url;
504
+ tracking.github_issues[repo.alias] = issueNumber;
505
+ }
506
+ }
507
+ }
508
+ results.push({
509
+ repo: repo.name,
510
+ alias: repo.alias,
511
+ success: true,
512
+ commit_sha: pushResult.commit_sha,
513
+ issue_number: issueNumber,
514
+ issue_url: issueUrl,
515
+ });
516
+ }
517
+ // Update local scope with tracking if any sends succeeded
518
+ const anySuccess = results.some((r) => r.success && !r.skipped);
519
+ if (anySuccess && !options.dryRun) {
520
+ await updateScopeWithTracking(scope, tracking, results);
521
+ await moveScopeToSent(projectPath, scope);
522
+ }
523
+ return results;
524
+ }
525
+ /**
526
+ * Send all sendable scopes (batch mode)
527
+ */
528
+ export async function sendAllScopes(octokit, projectPath, config, options = {}) {
529
+ const result = {
530
+ sent: [],
531
+ skipped: [],
532
+ failed: [],
533
+ };
534
+ // Get sendability status for all ready scopes
535
+ const sendabilityResults = await checkSendability(projectPath);
536
+ for (const { scope, canSend, reasons } of sendabilityResults) {
537
+ if (!canSend && !options.force) {
538
+ result.skipped.push({
539
+ scopeId: scope.id,
540
+ reason: reasons.join(', '),
541
+ });
542
+ continue;
543
+ }
544
+ const sendResults = await sendScope(octokit, projectPath, scope, config, options);
545
+ for (const sendResult of sendResults) {
546
+ if (sendResult.success) {
547
+ result.sent.push(sendResult);
548
+ }
549
+ else if (sendResult.skipped) {
550
+ result.skipped.push({
551
+ scopeId: scope.id,
552
+ reason: sendResult.skip_reason || 'Unknown',
553
+ });
554
+ }
555
+ else {
556
+ result.failed.push({
557
+ scopeId: scope.id,
558
+ error: sendResult.error || 'Unknown error',
559
+ });
560
+ }
561
+ }
562
+ }
563
+ return result;
564
+ }
565
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/core/send.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Core status module - loads and aggregates project status data
3
+ *
4
+ * Reads from cached files only (no network calls) to provide
5
+ * instant project health overview.
6
+ */
7
+ import { Config } from '../types/config.js';
8
+ import { ProjectStatus, RepoStatus, CoverageData, ScopeCounts, GapSummary, GapDetail, FreshnessInfo, HealthLevel, StatusJsonOutput } from '../types/status.js';
9
+ import { LastSyncData, AggregatedProgress } from '../types/sync.js';
10
+ /**
11
+ * Load last sync data from cache
12
+ */
13
+ export declare function loadLastSyncData(projectPath: string): Promise<LastSyncData | null>;
14
+ /**
15
+ * Load aggregated progress data from cache
16
+ */
17
+ export declare function loadAggregatedData(projectPath: string): Promise<AggregatedProgress | null>;
18
+ /**
19
+ * Get human-readable time since last sync
20
+ */
21
+ export declare function getTimeSinceSync(lastSyncTimestamp: string | null): string;
22
+ /**
23
+ * Check if data is stale
24
+ */
25
+ export declare function isStale(lastSyncTimestamp: string | null, thresholdMinutes?: number): boolean;
26
+ /**
27
+ * Get freshness info from last sync data
28
+ */
29
+ export declare function getFreshnessInfo(lastSync: LastSyncData | null, thresholdMinutes?: number): FreshnessInfo;
30
+ /**
31
+ * Build repo status from last sync and config
32
+ */
33
+ export declare function buildRepoStatus(config: Config, lastSync: LastSyncData | null): RepoStatus[];
34
+ /**
35
+ * Count scopes by directory
36
+ */
37
+ export declare function countScopesByDir(projectPath: string): Promise<ScopeCounts>;
38
+ /**
39
+ * Get scope counts from aggregated data (includes in_progress and blocked)
40
+ */
41
+ export declare function getScopeCountsFromAggregated(aggregated: AggregatedProgress | null, fsCounts: ScopeCounts): ScopeCounts;
42
+ /**
43
+ * Parse gaps from PRD modules
44
+ */
45
+ export declare function parseGapsFromPrd(projectPath: string): Promise<{
46
+ summary: GapSummary;
47
+ details: GapDetail[];
48
+ }>;
49
+ /**
50
+ * Calculate PRD coverage from modules
51
+ */
52
+ export declare function calculateCoverage(projectPath: string): Promise<CoverageData>;
53
+ /**
54
+ * Determine health level and reasons
55
+ */
56
+ export declare function evaluateHealth(freshness: FreshnessInfo, repos: RepoStatus[], gaps: GapSummary): {
57
+ health: HealthLevel;
58
+ reasons: string[];
59
+ };
60
+ /**
61
+ * Load complete project status
62
+ */
63
+ export declare function loadProjectStatus(projectPath: string, config: Config): Promise<ProjectStatus>;
64
+ /**
65
+ * Generate progress bar string
66
+ */
67
+ export declare function progressBar(percent: number, width?: number): string;
68
+ /**
69
+ * Convert status to JSON output format
70
+ */
71
+ export declare function toJsonOutput(status: ProjectStatus): StatusJsonOutput;
72
+ /**
73
+ * Get exit code for health level
74
+ */
75
+ export declare function getExitCode(health: HealthLevel): number;
76
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/core/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,aAAa,EACb,WAAW,EACX,gBAAgB,EAEjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAOpE;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAS9B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CASpC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAgBzE;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,gBAAgB,GAAE,MAAgC,GACjD,OAAO,CAQT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,GAAG,IAAI,EAC7B,gBAAgB,GAAE,MAAgC,GACjD,aAAa,CASf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,GAAG,IAAI,GAC5B,UAAU,EAAE,CAmCd;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA4ChF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,kBAAkB,GAAG,IAAI,EACrC,QAAQ,EAAE,WAAW,GACpB,WAAW,CAab;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,SAAS,EAAE,CAAA;CAAE,CAAC,CA6ExD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAsEvB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,UAAU,EAAE,EACnB,IAAI,EAAE,UAAU,GACf;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA+B5C;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CAmCxB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,CAIvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,CA2CpE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEvD"}