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,39 @@
1
+ /**
2
+ * Dependency validation utilities for scope sending
3
+ */
4
+ import { DependencyValidationResult, ParsedScope } from '../types/send.js';
5
+ /**
6
+ * Get the status of a scope by its ID
7
+ * Searches all scope directories to find the scope
8
+ */
9
+ export declare function getScopeStatus(projectPath: string, scopeId: string): Promise<{
10
+ status: string;
11
+ location: string;
12
+ } | null>;
13
+ /**
14
+ * Parse dependencies from scope content
15
+ */
16
+ export declare function parseDependencies(content: string): Array<{
17
+ scope: string;
18
+ reason: string;
19
+ blocking: boolean;
20
+ }>;
21
+ /**
22
+ * Validate dependencies for a scope
23
+ * Returns information about blocking and non-blocking dependencies
24
+ */
25
+ export declare function validateDependencies(projectPath: string, scope: ParsedScope): Promise<DependencyValidationResult>;
26
+ /**
27
+ * Get all scopes in the ready directory
28
+ */
29
+ export declare function getReadyScopes(projectPath: string): Promise<ParsedScope[]>;
30
+ /**
31
+ * Check sendability of all ready scopes
32
+ */
33
+ export declare function checkSendability(projectPath: string): Promise<Array<{
34
+ scope: ParsedScope;
35
+ canSend: boolean;
36
+ reasons: string[];
37
+ dependencyStatus: DependencyValidationResult;
38
+ }>>;
39
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/core/dependencies.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG3E;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA0BtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,GACd,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAiC7D;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,0BAA0B,CAAC,CA2CrC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAsBhF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CACR,KAAK,CAAC;IACJ,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,0BAA0B,CAAC;CAC9C,CAAC,CACH,CA8BA"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Dependency validation utilities for scope sending
3
+ */
4
+ import { readdir } from 'fs/promises';
5
+ import path from 'path';
6
+ import { parseScope } from './send.js';
7
+ /**
8
+ * Get the status of a scope by its ID
9
+ * Searches all scope directories to find the scope
10
+ */
11
+ export async function getScopeStatus(projectPath, scopeId) {
12
+ const scopeDirs = ['drafts', 'ready', 'sent', 'completed'];
13
+ for (const dir of scopeDirs) {
14
+ const dirPath = path.join(projectPath, 'docs', 'scopes', dir);
15
+ try {
16
+ const files = await readdir(dirPath);
17
+ const scopeFile = files.find((f) => f.startsWith(scopeId) && f.endsWith('.md'));
18
+ if (scopeFile) {
19
+ const filePath = path.join(dirPath, scopeFile);
20
+ const scope = await parseScope(filePath);
21
+ if (scope) {
22
+ return {
23
+ status: scope.metadata.status,
24
+ location: dir,
25
+ };
26
+ }
27
+ }
28
+ }
29
+ catch {
30
+ // Directory doesn't exist, continue
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * Parse dependencies from scope content
37
+ */
38
+ export function parseDependencies(content) {
39
+ const dependencies = [];
40
+ // Find the Dependencies section
41
+ const depsMatch = content.match(/## Dependencies\s*\n([\s\S]*?)(?=\n## |\n---|\n$)/);
42
+ if (!depsMatch) {
43
+ return dependencies;
44
+ }
45
+ const depsSection = depsMatch[1];
46
+ if (!depsSection) {
47
+ return dependencies;
48
+ }
49
+ // Parse markdown table rows
50
+ // Format: | SCOPE-XXX | reason | Yes/No |
51
+ const tableRowRegex = /\|\s*(SCOPE-\d{3})\s*\|\s*([^|]+)\|\s*(Yes|No)\s*\|/gi;
52
+ let match;
53
+ while ((match = tableRowRegex.exec(depsSection)) !== null) {
54
+ const scopeId = match[1];
55
+ const reason = match[2];
56
+ const blockingStr = match[3];
57
+ if (scopeId && reason && blockingStr) {
58
+ dependencies.push({
59
+ scope: scopeId,
60
+ reason: reason.trim(),
61
+ blocking: blockingStr.toLowerCase() === 'yes',
62
+ });
63
+ }
64
+ }
65
+ return dependencies;
66
+ }
67
+ /**
68
+ * Validate dependencies for a scope
69
+ * Returns information about blocking and non-blocking dependencies
70
+ */
71
+ export async function validateDependencies(projectPath, scope) {
72
+ const result = {
73
+ valid: true,
74
+ blocking: [],
75
+ nonBlocking: [],
76
+ };
77
+ const dependencies = parseDependencies(scope.content);
78
+ for (const dep of dependencies) {
79
+ const depStatus = await getScopeStatus(projectPath, dep.scope);
80
+ if (dep.blocking) {
81
+ if (!depStatus) {
82
+ // Blocking dependency doesn't exist
83
+ result.valid = false;
84
+ result.blocking.push({
85
+ scopeId: dep.scope,
86
+ reason: dep.reason,
87
+ status: 'not_found',
88
+ required_status: 'completed',
89
+ });
90
+ }
91
+ else if (depStatus.status !== 'completed' && depStatus.location !== 'completed') {
92
+ // Blocking dependency exists but not completed
93
+ result.valid = false;
94
+ result.blocking.push({
95
+ scopeId: dep.scope,
96
+ reason: dep.reason,
97
+ status: depStatus.status,
98
+ required_status: 'completed',
99
+ });
100
+ }
101
+ }
102
+ else {
103
+ // Non-blocking dependency - just record the status
104
+ result.nonBlocking.push({
105
+ scopeId: dep.scope,
106
+ reason: dep.reason,
107
+ status: depStatus?.status || 'not_found',
108
+ });
109
+ }
110
+ }
111
+ return result;
112
+ }
113
+ /**
114
+ * Get all scopes in the ready directory
115
+ */
116
+ export async function getReadyScopes(projectPath) {
117
+ const readyPath = path.join(projectPath, 'docs', 'scopes', 'ready');
118
+ const scopes = [];
119
+ try {
120
+ const files = await readdir(readyPath);
121
+ const scopeFiles = files.filter((f) => f.startsWith('SCOPE-') && f.endsWith('.md'));
122
+ for (const file of scopeFiles) {
123
+ const filePath = path.join(readyPath, file);
124
+ const scope = await parseScope(filePath);
125
+ if (scope) {
126
+ scopes.push(scope);
127
+ }
128
+ }
129
+ }
130
+ catch {
131
+ // Directory doesn't exist
132
+ }
133
+ return scopes;
134
+ }
135
+ /**
136
+ * Check sendability of all ready scopes
137
+ */
138
+ export async function checkSendability(projectPath) {
139
+ const readyScopes = await getReadyScopes(projectPath);
140
+ const results = [];
141
+ for (const scope of readyScopes) {
142
+ const depStatus = await validateDependencies(projectPath, scope);
143
+ const reasons = [];
144
+ let canSend = true;
145
+ if (!depStatus.valid) {
146
+ canSend = false;
147
+ for (const blocking of depStatus.blocking) {
148
+ reasons.push(`Blocked by ${blocking.scopeId} (${blocking.status})`);
149
+ }
150
+ }
151
+ results.push({
152
+ scope,
153
+ canSend,
154
+ reasons,
155
+ dependencyStatus: depStatus,
156
+ });
157
+ }
158
+ return results;
159
+ }
160
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/core/dependencies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Authentication health checks
3
+ * Validates GitHub token and permissions
4
+ */
5
+ import type { HealthCheck } from '../../types/doctor.js';
6
+ /**
7
+ * GitHub token presence check
8
+ */
9
+ export declare const tokenPresentCheck: HealthCheck;
10
+ /**
11
+ * GitHub token validity check
12
+ */
13
+ export declare const tokenValidCheck: HealthCheck;
14
+ /**
15
+ * GitHub token scope check
16
+ */
17
+ export declare const tokenScopeCheck: HealthCheck;
18
+ /**
19
+ * All auth checks
20
+ */
21
+ export declare const authChecks: HealthCheck[];
22
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/core/doctor/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAUtE;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAyB/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAsC7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WA4D7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,WAAW,EAInC,CAAC"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Authentication health checks
3
+ * Validates GitHub token and permissions
4
+ */
5
+ import { Octokit } from 'octokit';
6
+ import { getTokenFromEnv, getTokenFromGhCli } from '../github.js';
7
+ /**
8
+ * Get GitHub token from any available source
9
+ */
10
+ function getGitHubToken() {
11
+ return getTokenFromEnv() || getTokenFromGhCli();
12
+ }
13
+ /**
14
+ * GitHub token presence check
15
+ */
16
+ export const tokenPresentCheck = {
17
+ name: 'GitHub token present',
18
+ category: 'auth',
19
+ critical: true,
20
+ run: async () => {
21
+ const token = getGitHubToken();
22
+ if (token) {
23
+ const source = getTokenFromEnv() ? 'environment variable' : 'GitHub CLI';
24
+ return {
25
+ name: 'GitHub token present',
26
+ category: 'auth',
27
+ status: 'passed',
28
+ details: `Found from ${source}`,
29
+ };
30
+ }
31
+ return {
32
+ name: 'GitHub token present',
33
+ category: 'auth',
34
+ status: 'failed',
35
+ details: 'No token found in GITHUB_TOKEN, GH_TOKEN, or gh CLI',
36
+ fix: 'Set GITHUB_TOKEN environment variable or run `gh auth login`',
37
+ };
38
+ },
39
+ };
40
+ /**
41
+ * GitHub token validity check
42
+ */
43
+ export const tokenValidCheck = {
44
+ name: 'GitHub token valid',
45
+ category: 'auth',
46
+ critical: true,
47
+ run: async () => {
48
+ const token = getGitHubToken();
49
+ if (!token) {
50
+ return {
51
+ name: 'GitHub token valid',
52
+ category: 'auth',
53
+ status: 'failed',
54
+ details: 'No token to validate',
55
+ fix: 'Set GITHUB_TOKEN environment variable',
56
+ };
57
+ }
58
+ try {
59
+ const octokit = new Octokit({ auth: token });
60
+ const { data } = await octokit.rest.users.getAuthenticated();
61
+ return {
62
+ name: 'GitHub token valid',
63
+ category: 'auth',
64
+ status: 'passed',
65
+ details: `Authenticated as ${data.login}`,
66
+ };
67
+ }
68
+ catch (error) {
69
+ const message = error instanceof Error ? error.message : 'Unknown error';
70
+ return {
71
+ name: 'GitHub token valid',
72
+ category: 'auth',
73
+ status: 'failed',
74
+ details: `Authentication failed: ${message}`,
75
+ fix: 'Token is invalid or expired. Create new token at https://github.com/settings/tokens',
76
+ };
77
+ }
78
+ },
79
+ };
80
+ /**
81
+ * GitHub token scope check
82
+ */
83
+ export const tokenScopeCheck = {
84
+ name: 'Token has repo scope',
85
+ category: 'auth',
86
+ critical: false,
87
+ run: async () => {
88
+ const token = getGitHubToken();
89
+ if (!token) {
90
+ return {
91
+ name: 'Token has repo scope',
92
+ category: 'auth',
93
+ status: 'failed',
94
+ details: 'No token to check',
95
+ fix: 'Set GITHUB_TOKEN environment variable',
96
+ };
97
+ }
98
+ try {
99
+ const octokit = new Octokit({ auth: token });
100
+ const response = await octokit.rest.users.getAuthenticated();
101
+ // Check OAuth scopes from response headers
102
+ const scopes = response.headers['x-oauth-scopes']?.split(', ') ?? [];
103
+ // Fine-grained tokens don't have x-oauth-scopes header
104
+ if (scopes.length === 0) {
105
+ return {
106
+ name: 'Token has repo scope',
107
+ category: 'auth',
108
+ status: 'passed',
109
+ details: 'Using fine-grained token (scopes managed per-repo)',
110
+ };
111
+ }
112
+ if (scopes.includes('repo')) {
113
+ return {
114
+ name: 'Token has repo scope',
115
+ category: 'auth',
116
+ status: 'passed',
117
+ details: `Scopes: ${scopes.join(', ')}`,
118
+ };
119
+ }
120
+ return {
121
+ name: 'Token has repo scope',
122
+ category: 'auth',
123
+ status: 'warning',
124
+ details: `Missing "repo" scope. Current: ${scopes.join(', ')}`,
125
+ fix: 'Update token to include "repo" scope at https://github.com/settings/tokens',
126
+ };
127
+ }
128
+ catch {
129
+ return {
130
+ name: 'Token has repo scope',
131
+ category: 'auth',
132
+ status: 'failed',
133
+ details: 'Could not check token scopes',
134
+ fix: 'Ensure token is valid',
135
+ };
136
+ }
137
+ },
138
+ };
139
+ /**
140
+ * All auth checks
141
+ */
142
+ export const authChecks = [
143
+ tokenPresentCheck,
144
+ tokenValidCheck,
145
+ tokenScopeCheck,
146
+ ];
147
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/core/doctor/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Configuration health checks
3
+ * Validates config file existence and schema
4
+ */
5
+ import type { HealthCheck } from '../../types/doctor.js';
6
+ /**
7
+ * Config file existence check
8
+ */
9
+ export declare const configFileCheck: HealthCheck;
10
+ /**
11
+ * Config schema validation check
12
+ */
13
+ export declare const configSchemaCheck: HealthCheck;
14
+ /**
15
+ * Directory structure check
16
+ */
17
+ export declare const directoryStructureCheck: HealthCheck;
18
+ /**
19
+ * .env file check
20
+ */
21
+ export declare const envFileCheck: HealthCheck;
22
+ /**
23
+ * All config checks
24
+ */
25
+ export declare const configChecks: HealthCheck[];
26
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/doctor/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAItE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAyB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAgD/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAmDrC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,WA0B1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,WAAW,EAKrC,CAAC"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Configuration health checks
3
+ * Validates config file existence and schema
4
+ */
5
+ import { existsSync } from 'fs';
6
+ import path from 'path';
7
+ import { loadConfig } from '../config.js';
8
+ import { findProjectRoot } from '../project.js';
9
+ /**
10
+ * Config file existence check
11
+ */
12
+ export const configFileCheck = {
13
+ name: 'Config file exists',
14
+ category: 'config',
15
+ critical: true,
16
+ run: async () => {
17
+ const cwd = process.cwd();
18
+ const projectRoot = findProjectRoot(cwd);
19
+ if (projectRoot && existsSync(path.join(projectRoot, 'vibe-fabric.toml'))) {
20
+ return {
21
+ name: 'Config file exists',
22
+ category: 'config',
23
+ status: 'passed',
24
+ details: 'vibe-fabric.toml found',
25
+ };
26
+ }
27
+ return {
28
+ name: 'Config file exists',
29
+ category: 'config',
30
+ status: 'failed',
31
+ details: 'vibe-fabric.toml not found',
32
+ fix: 'Run `vibe init` to create a new project',
33
+ };
34
+ },
35
+ };
36
+ /**
37
+ * Config schema validation check
38
+ */
39
+ export const configSchemaCheck = {
40
+ name: 'Config schema valid',
41
+ category: 'config',
42
+ critical: true,
43
+ run: async () => {
44
+ const cwd = process.cwd();
45
+ const projectRoot = findProjectRoot(cwd);
46
+ if (!projectRoot) {
47
+ return {
48
+ name: 'Config schema valid',
49
+ category: 'config',
50
+ status: 'failed',
51
+ details: 'No project found',
52
+ fix: 'Run `vibe init` to create a new project',
53
+ };
54
+ }
55
+ try {
56
+ const config = await loadConfig(projectRoot);
57
+ if (config) {
58
+ return {
59
+ name: 'Config schema valid',
60
+ category: 'config',
61
+ status: 'passed',
62
+ details: `Project: ${config.project.name}`,
63
+ };
64
+ }
65
+ return {
66
+ name: 'Config schema valid',
67
+ category: 'config',
68
+ status: 'failed',
69
+ details: 'Config file is empty or invalid',
70
+ fix: 'Check vibe-fabric.toml for syntax errors',
71
+ };
72
+ }
73
+ catch (error) {
74
+ const message = error instanceof Error ? error.message : 'Unknown error';
75
+ return {
76
+ name: 'Config schema valid',
77
+ category: 'config',
78
+ status: 'failed',
79
+ details: message,
80
+ fix: 'Fix the configuration errors shown above',
81
+ };
82
+ }
83
+ },
84
+ };
85
+ /**
86
+ * Directory structure check
87
+ */
88
+ export const directoryStructureCheck = {
89
+ name: 'Directory structure valid',
90
+ category: 'config',
91
+ critical: false,
92
+ run: async () => {
93
+ const cwd = process.cwd();
94
+ const projectRoot = findProjectRoot(cwd);
95
+ if (!projectRoot) {
96
+ return {
97
+ name: 'Directory structure valid',
98
+ category: 'config',
99
+ status: 'failed',
100
+ details: 'No project found',
101
+ fix: 'Run `vibe init` to create a new project',
102
+ };
103
+ }
104
+ const requiredDirs = [
105
+ 'docs/prd',
106
+ 'docs/scopes/drafts',
107
+ 'docs/scopes/sent',
108
+ 'docs/scopes/completed',
109
+ '.claude',
110
+ ];
111
+ const missingDirs = [];
112
+ for (const dir of requiredDirs) {
113
+ if (!existsSync(path.join(projectRoot, dir))) {
114
+ missingDirs.push(dir);
115
+ }
116
+ }
117
+ if (missingDirs.length === 0) {
118
+ return {
119
+ name: 'Directory structure valid',
120
+ category: 'config',
121
+ status: 'passed',
122
+ details: 'All required directories present',
123
+ };
124
+ }
125
+ return {
126
+ name: 'Directory structure valid',
127
+ category: 'config',
128
+ status: 'warning',
129
+ details: `Missing: ${missingDirs.join(', ')}`,
130
+ fix: 'Run `vibe init` to recreate missing directories',
131
+ fixable: true,
132
+ };
133
+ },
134
+ };
135
+ /**
136
+ * .env file check
137
+ */
138
+ export const envFileCheck = {
139
+ name: '.env file exists',
140
+ category: 'config',
141
+ critical: false,
142
+ run: async () => {
143
+ const cwd = process.cwd();
144
+ const projectRoot = findProjectRoot(cwd);
145
+ const envPath = projectRoot ? path.join(projectRoot, '.env') : path.join(cwd, '.env');
146
+ if (existsSync(envPath)) {
147
+ return {
148
+ name: '.env file exists',
149
+ category: 'config',
150
+ status: 'passed',
151
+ details: '.env found',
152
+ };
153
+ }
154
+ return {
155
+ name: '.env file exists',
156
+ category: 'config',
157
+ status: 'warning',
158
+ details: 'Not found (optional, can use environment variables)',
159
+ fix: 'Create .env with GITHUB_TOKEN=your_token',
160
+ };
161
+ },
162
+ };
163
+ /**
164
+ * All config checks
165
+ */
166
+ export const configChecks = [
167
+ configFileCheck,
168
+ configSchemaCheck,
169
+ directoryStructureCheck,
170
+ envFileCheck,
171
+ ];
172
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/doctor/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Environment health checks
3
+ * Checks Node.js version, UV, and Claude Code installation
4
+ */
5
+ import type { HealthCheck } from '../../types/doctor.js';
6
+ /**
7
+ * Node.js version check
8
+ */
9
+ export declare const nodeVersionCheck: HealthCheck;
10
+ /**
11
+ * UV installation check
12
+ */
13
+ export declare const uvInstalledCheck: HealthCheck;
14
+ /**
15
+ * Claude Code installation check (critical)
16
+ */
17
+ export declare const claudeCodeCheck: HealthCheck;
18
+ /**
19
+ * GitHub CLI check (optional, helpful for auth)
20
+ */
21
+ export declare const ghCliCheck: HealthCheck;
22
+ /**
23
+ * All environment checks
24
+ */
25
+ export declare const environmentChecks: HealthCheck[];
26
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/core/doctor/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,uBAAuB,CAAC;AA4BtE;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAyB9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAwB9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAwB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,WAwBxB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,EAK1C,CAAC"}