red64-cli 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 (354) hide show
  1. package/README.md +454 -0
  2. package/dist/cli/parseArgs.d.ts +16 -0
  3. package/dist/cli/parseArgs.d.ts.map +1 -0
  4. package/dist/cli/parseArgs.js +172 -0
  5. package/dist/cli/parseArgs.js.map +1 -0
  6. package/dist/cli/validateFlags.d.ts +22 -0
  7. package/dist/cli/validateFlags.d.ts.map +1 -0
  8. package/dist/cli/validateFlags.js +24 -0
  9. package/dist/cli/validateFlags.js.map +1 -0
  10. package/dist/cli.d.ts +7 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +90 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/components/App.d.ts +20 -0
  15. package/dist/components/App.d.ts.map +1 -0
  16. package/dist/components/App.js +35 -0
  17. package/dist/components/App.js.map +1 -0
  18. package/dist/components/CommandRouter.d.ts +21 -0
  19. package/dist/components/CommandRouter.d.ts.map +1 -0
  20. package/dist/components/CommandRouter.js +30 -0
  21. package/dist/components/CommandRouter.js.map +1 -0
  22. package/dist/components/GlobalConfig.d.ts +26 -0
  23. package/dist/components/GlobalConfig.d.ts.map +1 -0
  24. package/dist/components/GlobalConfig.js +30 -0
  25. package/dist/components/GlobalConfig.js.map +1 -0
  26. package/dist/components/index.d.ts +9 -0
  27. package/dist/components/index.d.ts.map +1 -0
  28. package/dist/components/index.js +9 -0
  29. package/dist/components/index.js.map +1 -0
  30. package/dist/components/init/CompleteStep.d.ts +11 -0
  31. package/dist/components/init/CompleteStep.d.ts.map +1 -0
  32. package/dist/components/init/CompleteStep.js +15 -0
  33. package/dist/components/init/CompleteStep.js.map +1 -0
  34. package/dist/components/init/ErrorStep.d.ts +14 -0
  35. package/dist/components/init/ErrorStep.d.ts.map +1 -0
  36. package/dist/components/init/ErrorStep.js +36 -0
  37. package/dist/components/init/ErrorStep.js.map +1 -0
  38. package/dist/components/init/FetchStep.d.ts +15 -0
  39. package/dist/components/init/FetchStep.d.ts.map +1 -0
  40. package/dist/components/init/FetchStep.js +33 -0
  41. package/dist/components/init/FetchStep.js.map +1 -0
  42. package/dist/components/init/SetupStep.d.ts +14 -0
  43. package/dist/components/init/SetupStep.d.ts.map +1 -0
  44. package/dist/components/init/SetupStep.js +78 -0
  45. package/dist/components/init/SetupStep.js.map +1 -0
  46. package/dist/components/init/SteeringStep.d.ts +12 -0
  47. package/dist/components/init/SteeringStep.d.ts.map +1 -0
  48. package/dist/components/init/SteeringStep.js +43 -0
  49. package/dist/components/init/SteeringStep.js.map +1 -0
  50. package/dist/components/init/WelcomeStep.d.ts +12 -0
  51. package/dist/components/init/WelcomeStep.d.ts.map +1 -0
  52. package/dist/components/init/WelcomeStep.js +52 -0
  53. package/dist/components/init/WelcomeStep.js.map +1 -0
  54. package/dist/components/init/index.d.ts +11 -0
  55. package/dist/components/init/index.d.ts.map +1 -0
  56. package/dist/components/init/index.js +10 -0
  57. package/dist/components/init/index.js.map +1 -0
  58. package/dist/components/init/types.d.ts +98 -0
  59. package/dist/components/init/types.d.ts.map +1 -0
  60. package/dist/components/init/types.js +6 -0
  61. package/dist/components/init/types.js.map +1 -0
  62. package/dist/components/screens/AbortScreen.d.ts +14 -0
  63. package/dist/components/screens/AbortScreen.d.ts.map +1 -0
  64. package/dist/components/screens/AbortScreen.js +181 -0
  65. package/dist/components/screens/AbortScreen.js.map +1 -0
  66. package/dist/components/screens/ApprovalScreen.d.ts +24 -0
  67. package/dist/components/screens/ApprovalScreen.d.ts.map +1 -0
  68. package/dist/components/screens/ApprovalScreen.js +82 -0
  69. package/dist/components/screens/ApprovalScreen.js.map +1 -0
  70. package/dist/components/screens/HelpScreen.d.ts +20 -0
  71. package/dist/components/screens/HelpScreen.d.ts.map +1 -0
  72. package/dist/components/screens/HelpScreen.js +70 -0
  73. package/dist/components/screens/HelpScreen.js.map +1 -0
  74. package/dist/components/screens/InitScreen.d.ts +15 -0
  75. package/dist/components/screens/InitScreen.d.ts.map +1 -0
  76. package/dist/components/screens/InitScreen.js +420 -0
  77. package/dist/components/screens/InitScreen.js.map +1 -0
  78. package/dist/components/screens/ListScreen.d.ts +14 -0
  79. package/dist/components/screens/ListScreen.d.ts.map +1 -0
  80. package/dist/components/screens/ListScreen.js +57 -0
  81. package/dist/components/screens/ListScreen.js.map +1 -0
  82. package/dist/components/screens/ProgressScreen.d.ts +26 -0
  83. package/dist/components/screens/ProgressScreen.d.ts.map +1 -0
  84. package/dist/components/screens/ProgressScreen.js +64 -0
  85. package/dist/components/screens/ProgressScreen.js.map +1 -0
  86. package/dist/components/screens/ResumeScreen.d.ts +14 -0
  87. package/dist/components/screens/ResumeScreen.d.ts.map +1 -0
  88. package/dist/components/screens/ResumeScreen.js +108 -0
  89. package/dist/components/screens/ResumeScreen.js.map +1 -0
  90. package/dist/components/screens/ScreenProps.d.ts +12 -0
  91. package/dist/components/screens/ScreenProps.d.ts.map +1 -0
  92. package/dist/components/screens/ScreenProps.js +5 -0
  93. package/dist/components/screens/ScreenProps.js.map +1 -0
  94. package/dist/components/screens/StartScreen.d.ts +26 -0
  95. package/dist/components/screens/StartScreen.d.ts.map +1 -0
  96. package/dist/components/screens/StartScreen.js +1021 -0
  97. package/dist/components/screens/StartScreen.js.map +1 -0
  98. package/dist/components/screens/StatusScreen.d.ts +14 -0
  99. package/dist/components/screens/StatusScreen.d.ts.map +1 -0
  100. package/dist/components/screens/StatusScreen.js +115 -0
  101. package/dist/components/screens/StatusScreen.js.map +1 -0
  102. package/dist/components/screens/index.d.ts +15 -0
  103. package/dist/components/screens/index.d.ts.map +1 -0
  104. package/dist/components/screens/index.js +12 -0
  105. package/dist/components/screens/index.js.map +1 -0
  106. package/dist/components/ui/ErrorBoundary.d.ts +34 -0
  107. package/dist/components/ui/ErrorBoundary.d.ts.map +1 -0
  108. package/dist/components/ui/ErrorBoundary.js +37 -0
  109. package/dist/components/ui/ErrorBoundary.js.map +1 -0
  110. package/dist/components/ui/ErrorDisplay.d.ts +20 -0
  111. package/dist/components/ui/ErrorDisplay.d.ts.map +1 -0
  112. package/dist/components/ui/ErrorDisplay.js +12 -0
  113. package/dist/components/ui/ErrorDisplay.js.map +1 -0
  114. package/dist/components/ui/ErrorRecoveryPrompt.d.ts +30 -0
  115. package/dist/components/ui/ErrorRecoveryPrompt.d.ts.map +1 -0
  116. package/dist/components/ui/ErrorRecoveryPrompt.js +66 -0
  117. package/dist/components/ui/ErrorRecoveryPrompt.js.map +1 -0
  118. package/dist/components/ui/FeatureSidebar.d.ts +27 -0
  119. package/dist/components/ui/FeatureSidebar.d.ts.map +1 -0
  120. package/dist/components/ui/FeatureSidebar.js +166 -0
  121. package/dist/components/ui/FeatureSidebar.js.map +1 -0
  122. package/dist/components/ui/FlowTable.d.ts +21 -0
  123. package/dist/components/ui/FlowTable.d.ts.map +1 -0
  124. package/dist/components/ui/FlowTable.js +105 -0
  125. package/dist/components/ui/FlowTable.js.map +1 -0
  126. package/dist/components/ui/Header.d.ts +20 -0
  127. package/dist/components/ui/Header.d.ts.map +1 -0
  128. package/dist/components/ui/Header.js +11 -0
  129. package/dist/components/ui/Header.js.map +1 -0
  130. package/dist/components/ui/OutputRegion.d.ts +20 -0
  131. package/dist/components/ui/OutputRegion.d.ts.map +1 -0
  132. package/dist/components/ui/OutputRegion.js +14 -0
  133. package/dist/components/ui/OutputRegion.js.map +1 -0
  134. package/dist/components/ui/PhaseProgressView.d.ts +23 -0
  135. package/dist/components/ui/PhaseProgressView.d.ts.map +1 -0
  136. package/dist/components/ui/PhaseProgressView.js +117 -0
  137. package/dist/components/ui/PhaseProgressView.js.map +1 -0
  138. package/dist/components/ui/ProgressBar.d.ts +20 -0
  139. package/dist/components/ui/ProgressBar.d.ts.map +1 -0
  140. package/dist/components/ui/ProgressBar.js +12 -0
  141. package/dist/components/ui/ProgressBar.js.map +1 -0
  142. package/dist/components/ui/SelectMenu.d.ts +27 -0
  143. package/dist/components/ui/SelectMenu.d.ts.map +1 -0
  144. package/dist/components/ui/SelectMenu.js +21 -0
  145. package/dist/components/ui/SelectMenu.js.map +1 -0
  146. package/dist/components/ui/Spinner.d.ts +18 -0
  147. package/dist/components/ui/Spinner.d.ts.map +1 -0
  148. package/dist/components/ui/Spinner.js +10 -0
  149. package/dist/components/ui/Spinner.js.map +1 -0
  150. package/dist/components/ui/StatusLine.d.ts +21 -0
  151. package/dist/components/ui/StatusLine.d.ts.map +1 -0
  152. package/dist/components/ui/StatusLine.js +30 -0
  153. package/dist/components/ui/StatusLine.js.map +1 -0
  154. package/dist/components/ui/index.d.ts +16 -0
  155. package/dist/components/ui/index.d.ts.map +1 -0
  156. package/dist/components/ui/index.js +16 -0
  157. package/dist/components/ui/index.js.map +1 -0
  158. package/dist/services/AgentInvoker.d.ts +20 -0
  159. package/dist/services/AgentInvoker.d.ts.map +1 -0
  160. package/dist/services/AgentInvoker.js +282 -0
  161. package/dist/services/AgentInvoker.js.map +1 -0
  162. package/dist/services/BranchService.d.ts +28 -0
  163. package/dist/services/BranchService.d.ts.map +1 -0
  164. package/dist/services/BranchService.js +114 -0
  165. package/dist/services/BranchService.js.map +1 -0
  166. package/dist/services/CacheService.d.ts +57 -0
  167. package/dist/services/CacheService.d.ts.map +1 -0
  168. package/dist/services/CacheService.js +208 -0
  169. package/dist/services/CacheService.js.map +1 -0
  170. package/dist/services/ClaudeErrorDetector.d.ts +45 -0
  171. package/dist/services/ClaudeErrorDetector.d.ts.map +1 -0
  172. package/dist/services/ClaudeErrorDetector.js +207 -0
  173. package/dist/services/ClaudeErrorDetector.js.map +1 -0
  174. package/dist/services/ClaudeHealthCheck.d.ts +37 -0
  175. package/dist/services/ClaudeHealthCheck.d.ts.map +1 -0
  176. package/dist/services/ClaudeHealthCheck.js +197 -0
  177. package/dist/services/ClaudeHealthCheck.js.map +1 -0
  178. package/dist/services/CommitService.d.ts +36 -0
  179. package/dist/services/CommitService.d.ts.map +1 -0
  180. package/dist/services/CommitService.js +159 -0
  181. package/dist/services/CommitService.js.map +1 -0
  182. package/dist/services/ConfigService.d.ts +49 -0
  183. package/dist/services/ConfigService.d.ts.map +1 -0
  184. package/dist/services/ConfigService.js +57 -0
  185. package/dist/services/ConfigService.js.map +1 -0
  186. package/dist/services/DockerRunner.d.ts +45 -0
  187. package/dist/services/DockerRunner.d.ts.map +1 -0
  188. package/dist/services/DockerRunner.js +170 -0
  189. package/dist/services/DockerRunner.js.map +1 -0
  190. package/dist/services/ExtendedFlowStateMachine.d.ts +31 -0
  191. package/dist/services/ExtendedFlowStateMachine.d.ts.map +1 -0
  192. package/dist/services/ExtendedFlowStateMachine.js +302 -0
  193. package/dist/services/ExtendedFlowStateMachine.js.map +1 -0
  194. package/dist/services/FeatureValidator.d.ts +26 -0
  195. package/dist/services/FeatureValidator.d.ts.map +1 -0
  196. package/dist/services/FeatureValidator.js +48 -0
  197. package/dist/services/FeatureValidator.js.map +1 -0
  198. package/dist/services/FlowStateMachine.d.ts +26 -0
  199. package/dist/services/FlowStateMachine.d.ts.map +1 -0
  200. package/dist/services/FlowStateMachine.js +177 -0
  201. package/dist/services/FlowStateMachine.js.map +1 -0
  202. package/dist/services/GitHubService.d.ts +72 -0
  203. package/dist/services/GitHubService.d.ts.map +1 -0
  204. package/dist/services/GitHubService.js +150 -0
  205. package/dist/services/GitHubService.js.map +1 -0
  206. package/dist/services/GitStatusChecker.d.ts +29 -0
  207. package/dist/services/GitStatusChecker.d.ts.map +1 -0
  208. package/dist/services/GitStatusChecker.js +127 -0
  209. package/dist/services/GitStatusChecker.js.map +1 -0
  210. package/dist/services/PRCreatorService.d.ts +59 -0
  211. package/dist/services/PRCreatorService.d.ts.map +1 -0
  212. package/dist/services/PRCreatorService.js +212 -0
  213. package/dist/services/PRCreatorService.js.map +1 -0
  214. package/dist/services/PRStatusFetcher.d.ts +39 -0
  215. package/dist/services/PRStatusFetcher.d.ts.map +1 -0
  216. package/dist/services/PRStatusFetcher.js +144 -0
  217. package/dist/services/PRStatusFetcher.js.map +1 -0
  218. package/dist/services/PhaseExecutor.d.ts +29 -0
  219. package/dist/services/PhaseExecutor.d.ts.map +1 -0
  220. package/dist/services/PhaseExecutor.js +125 -0
  221. package/dist/services/PhaseExecutor.js.map +1 -0
  222. package/dist/services/SpecInitService.d.ts +33 -0
  223. package/dist/services/SpecInitService.d.ts.map +1 -0
  224. package/dist/services/SpecInitService.js +168 -0
  225. package/dist/services/SpecInitService.js.map +1 -0
  226. package/dist/services/StateStore.d.ts +24 -0
  227. package/dist/services/StateStore.d.ts.map +1 -0
  228. package/dist/services/StateStore.js +171 -0
  229. package/dist/services/StateStore.js.map +1 -0
  230. package/dist/services/TaskParser.d.ts +44 -0
  231. package/dist/services/TaskParser.d.ts.map +1 -0
  232. package/dist/services/TaskParser.js +167 -0
  233. package/dist/services/TaskParser.js.map +1 -0
  234. package/dist/services/TaskRunner.d.ts +52 -0
  235. package/dist/services/TaskRunner.d.ts.map +1 -0
  236. package/dist/services/TaskRunner.js +135 -0
  237. package/dist/services/TaskRunner.js.map +1 -0
  238. package/dist/services/TemplateService.d.ts +73 -0
  239. package/dist/services/TemplateService.d.ts.map +1 -0
  240. package/dist/services/TemplateService.js +263 -0
  241. package/dist/services/TemplateService.js.map +1 -0
  242. package/dist/services/WorktreeService.d.ts +51 -0
  243. package/dist/services/WorktreeService.d.ts.map +1 -0
  244. package/dist/services/WorktreeService.js +204 -0
  245. package/dist/services/WorktreeService.js.map +1 -0
  246. package/dist/services/index.d.ts +25 -0
  247. package/dist/services/index.d.ts.map +1 -0
  248. package/dist/services/index.js +25 -0
  249. package/dist/services/index.js.map +1 -0
  250. package/dist/types/extended-flow.d.ts +167 -0
  251. package/dist/types/extended-flow.d.ts.map +1 -0
  252. package/dist/types/extended-flow.js +103 -0
  253. package/dist/types/extended-flow.js.map +1 -0
  254. package/dist/types/index.d.ts +210 -0
  255. package/dist/types/index.d.ts.map +1 -0
  256. package/dist/types/index.js +28 -0
  257. package/dist/types/index.js.map +1 -0
  258. package/dist/utils/git.d.ts +41 -0
  259. package/dist/utils/git.d.ts.map +1 -0
  260. package/dist/utils/git.js +68 -0
  261. package/dist/utils/git.js.map +1 -0
  262. package/dist/utils/index.d.ts +6 -0
  263. package/dist/utils/index.d.ts.map +1 -0
  264. package/dist/utils/index.js +6 -0
  265. package/dist/utils/index.js.map +1 -0
  266. package/dist/utils/paths.d.ts +30 -0
  267. package/dist/utils/paths.d.ts.map +1 -0
  268. package/dist/utils/paths.js +43 -0
  269. package/dist/utils/paths.js.map +1 -0
  270. package/framework/.red64/settings/rules/design-discovery-full.md +93 -0
  271. package/framework/.red64/settings/rules/design-discovery-light.md +49 -0
  272. package/framework/.red64/settings/rules/design-principles.md +182 -0
  273. package/framework/.red64/settings/rules/design-review.md +110 -0
  274. package/framework/.red64/settings/rules/ears-format.md +49 -0
  275. package/framework/.red64/settings/rules/gap-analysis.md +144 -0
  276. package/framework/.red64/settings/rules/steering-principles.md +90 -0
  277. package/framework/.red64/settings/rules/tasks-generation.md +131 -0
  278. package/framework/.red64/settings/rules/tasks-parallel-analysis.md +34 -0
  279. package/framework/.red64/settings/templates/flow-state.json +48 -0
  280. package/framework/.red64/settings/templates/specs/design.md +276 -0
  281. package/framework/.red64/settings/templates/specs/init.json +24 -0
  282. package/framework/.red64/settings/templates/specs/requirements-init.md +9 -0
  283. package/framework/.red64/settings/templates/specs/requirements.md +26 -0
  284. package/framework/.red64/settings/templates/specs/research.md +61 -0
  285. package/framework/.red64/settings/templates/specs/tasks.md +21 -0
  286. package/framework/.red64/settings/templates/steering/product.md +18 -0
  287. package/framework/.red64/settings/templates/steering/structure.md +41 -0
  288. package/framework/.red64/settings/templates/steering/tech.md +45 -0
  289. package/framework/.red64/settings/templates/steering-custom/api-standards.md +69 -0
  290. package/framework/.red64/settings/templates/steering-custom/authentication.md +67 -0
  291. package/framework/.red64/settings/templates/steering-custom/database.md +46 -0
  292. package/framework/.red64/settings/templates/steering-custom/deployment.md +54 -0
  293. package/framework/.red64/settings/templates/steering-custom/error-handling.md +59 -0
  294. package/framework/.red64/settings/templates/steering-custom/security.md +55 -0
  295. package/framework/.red64/settings/templates/steering-custom/testing.md +47 -0
  296. package/framework/agents/claude/.claude/agents/red64/spec-design.md +174 -0
  297. package/framework/agents/claude/.claude/agents/red64/spec-impl.md +120 -0
  298. package/framework/agents/claude/.claude/agents/red64/spec-requirements.md +102 -0
  299. package/framework/agents/claude/.claude/agents/red64/spec-tasks.md +141 -0
  300. package/framework/agents/claude/.claude/agents/red64/steering-custom.md +147 -0
  301. package/framework/agents/claude/.claude/agents/red64/steering.md +163 -0
  302. package/framework/agents/claude/.claude/agents/red64/validate-design.md +98 -0
  303. package/framework/agents/claude/.claude/agents/red64/validate-gap.md +99 -0
  304. package/framework/agents/claude/.claude/agents/red64/validate-impl.md +146 -0
  305. package/framework/agents/claude/.claude/commands/red64/spec-design.md +64 -0
  306. package/framework/agents/claude/.claude/commands/red64/spec-impl.md +68 -0
  307. package/framework/agents/claude/.claude/commands/red64/spec-init.md +65 -0
  308. package/framework/agents/claude/.claude/commands/red64/spec-quick.md +360 -0
  309. package/framework/agents/claude/.claude/commands/red64/spec-requirements.md +62 -0
  310. package/framework/agents/claude/.claude/commands/red64/spec-status.md +87 -0
  311. package/framework/agents/claude/.claude/commands/red64/spec-tasks.md +75 -0
  312. package/framework/agents/claude/.claude/commands/red64/steering-custom.md +59 -0
  313. package/framework/agents/claude/.claude/commands/red64/steering.md +62 -0
  314. package/framework/agents/claude/.claude/commands/red64/validate-design.md +59 -0
  315. package/framework/agents/claude/.claude/commands/red64/validate-gap.md +53 -0
  316. package/framework/agents/claude/.claude/commands/red64/validate-impl.md +68 -0
  317. package/framework/agents/claude/docs/CLAUDE.md +45 -0
  318. package/framework/agents/codex/.codex/agents/red64/spec-design.md +174 -0
  319. package/framework/agents/codex/.codex/agents/red64/spec-impl.md +120 -0
  320. package/framework/agents/codex/.codex/agents/red64/spec-requirements.md +102 -0
  321. package/framework/agents/codex/.codex/agents/red64/spec-tasks.md +141 -0
  322. package/framework/agents/codex/.codex/agents/red64/steering-custom.md +147 -0
  323. package/framework/agents/codex/.codex/agents/red64/steering.md +163 -0
  324. package/framework/agents/codex/.codex/agents/red64/validate-design.md +98 -0
  325. package/framework/agents/codex/.codex/agents/red64/validate-gap.md +99 -0
  326. package/framework/agents/codex/.codex/agents/red64/validate-impl.md +146 -0
  327. package/framework/agents/codex/.codex/commands/red64/spec-design.md +64 -0
  328. package/framework/agents/codex/.codex/commands/red64/spec-impl.md +68 -0
  329. package/framework/agents/codex/.codex/commands/red64/spec-init.md +65 -0
  330. package/framework/agents/codex/.codex/commands/red64/spec-quick.md +360 -0
  331. package/framework/agents/codex/.codex/commands/red64/spec-requirements.md +62 -0
  332. package/framework/agents/codex/.codex/commands/red64/spec-status.md +87 -0
  333. package/framework/agents/codex/.codex/commands/red64/spec-tasks.md +75 -0
  334. package/framework/agents/codex/.codex/commands/red64/steering-custom.md +59 -0
  335. package/framework/agents/codex/.codex/commands/red64/steering.md +62 -0
  336. package/framework/agents/codex/.codex/commands/red64/validate-design.md +59 -0
  337. package/framework/agents/codex/.codex/commands/red64/validate-gap.md +53 -0
  338. package/framework/agents/codex/.codex/commands/red64/validate-impl.md +68 -0
  339. package/framework/agents/codex/docs/AGENTS.md +68 -0
  340. package/framework/agents/gemini/commands.toml +607 -0
  341. package/framework/agents/gemini/docs/GEMINI.md +45 -0
  342. package/framework/stacks/generic/product.md +27 -0
  343. package/framework/stacks/generic/structure.md +46 -0
  344. package/framework/stacks/generic/tech.md +47 -0
  345. package/framework/stacks/node/product.md +27 -0
  346. package/framework/stacks/node/structure.md +82 -0
  347. package/framework/stacks/node/tech.md +63 -0
  348. package/framework/stacks/python/product.md +27 -0
  349. package/framework/stacks/python/structure.md +78 -0
  350. package/framework/stacks/python/tech.md +64 -0
  351. package/framework/stacks/react/product.md +27 -0
  352. package/framework/stacks/react/structure.md +76 -0
  353. package/framework/stacks/react/tech.md +65 -0
  354. package/package.json +47 -0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Cache service for offline download caching
3
+ * Requirements: 6.5, 6.6
4
+ */
5
+ /**
6
+ * Cache entry metadata
7
+ */
8
+ export interface CacheEntry {
9
+ readonly repo: string;
10
+ readonly version: string;
11
+ readonly path: string;
12
+ readonly cachedAt: string;
13
+ readonly size: number;
14
+ }
15
+ /**
16
+ * Cache service configuration
17
+ */
18
+ export interface CacheServiceConfig {
19
+ readonly cacheDir?: string;
20
+ }
21
+ /**
22
+ * Cache service interface
23
+ * Requirements: 6.5-6.8
24
+ */
25
+ export interface CacheService {
26
+ /**
27
+ * Get cache directory path (platform-specific)
28
+ */
29
+ getCacheDir(): string;
30
+ /**
31
+ * Check if valid cache entry exists for version
32
+ */
33
+ has(repo: string, version: string): Promise<boolean>;
34
+ /**
35
+ * Get cached tarball path
36
+ * @throws CacheError if entry does not exist
37
+ */
38
+ get(repo: string, version: string): Promise<CacheEntry>;
39
+ /**
40
+ * Store tarball in cache
41
+ */
42
+ set(repo: string, version: string, tarballPath: string): Promise<CacheEntry>;
43
+ /**
44
+ * Clear cache entries older than maxAge
45
+ */
46
+ prune(maxAgeMs: number): Promise<number>;
47
+ /**
48
+ * Clear all cache entries
49
+ */
50
+ clear(): Promise<void>;
51
+ }
52
+ /**
53
+ * Create cache service
54
+ * Task 1.1, 1.2: Cache service factory with platform detection and entry management
55
+ */
56
+ export declare function createCacheService(config?: CacheServiceConfig): CacheService;
57
+ //# sourceMappingURL=CacheService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheService.d.ts","sourceRoot":"","sources":["../../src/services/CacheService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AASD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,WAAW,IAAI,MAAM,CAAC;IAEtB;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErD;;;OAGG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAExD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE7E;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAsGD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,kBAAuB,GAAG,YAAY,CAiIhF"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Cache service for offline download caching
3
+ * Requirements: 6.5, 6.6
4
+ */
5
+ import { mkdir, readFile, writeFile, rm, access, copyFile, stat } from 'node:fs/promises';
6
+ import { homedir, tmpdir } from 'node:os';
7
+ import { join } from 'node:path';
8
+ /**
9
+ * Get platform-specific cache directory
10
+ * Task 1.1: Platform-specific cache directory resolution
11
+ */
12
+ function getPlatformCacheDir() {
13
+ const currentPlatform = process.platform;
14
+ try {
15
+ const home = homedir();
16
+ switch (currentPlatform) {
17
+ case 'darwin':
18
+ // macOS: ~/Library/Caches/red64
19
+ return join(home, 'Library', 'Caches', 'red64');
20
+ case 'linux':
21
+ // Linux: $XDG_CACHE_HOME/red64 or ~/.cache/red64
22
+ const xdgCacheHome = process.env.XDG_CACHE_HOME;
23
+ if (xdgCacheHome) {
24
+ return join(xdgCacheHome, 'red64');
25
+ }
26
+ return join(home, '.cache', 'red64');
27
+ case 'win32':
28
+ // Windows: %LOCALAPPDATA%/red64
29
+ const localAppData = process.env.LOCALAPPDATA;
30
+ if (localAppData) {
31
+ return join(localAppData, 'red64');
32
+ }
33
+ return join(home, 'AppData', 'Local', 'red64');
34
+ default:
35
+ // Unknown platform: use home-based cache
36
+ return join(home, '.cache', 'red64');
37
+ }
38
+ }
39
+ catch {
40
+ // Fallback to temp directory when home cannot be determined
41
+ return join(tmpdir(), 'red64-cache');
42
+ }
43
+ }
44
+ /**
45
+ * Get cache metadata file path
46
+ */
47
+ function getCacheMetaPath(cacheDir) {
48
+ return join(cacheDir, 'cache.json');
49
+ }
50
+ /**
51
+ * Generate tarball filename from repo and version
52
+ */
53
+ function getTarballFilename(repo, version) {
54
+ // Convert owner/repo to owner-repo for filename
55
+ const safeRepo = repo.replace('/', '-');
56
+ return `${safeRepo}-${version}.tar.gz`;
57
+ }
58
+ /**
59
+ * Load cache metadata
60
+ */
61
+ async function loadMetadata(cacheDir) {
62
+ const metaPath = getCacheMetaPath(cacheDir);
63
+ try {
64
+ const content = await readFile(metaPath, 'utf-8');
65
+ return JSON.parse(content);
66
+ }
67
+ catch {
68
+ return { entries: [] };
69
+ }
70
+ }
71
+ /**
72
+ * Save cache metadata
73
+ */
74
+ async function saveMetadata(cacheDir, metadata) {
75
+ const metaPath = getCacheMetaPath(cacheDir);
76
+ await mkdir(cacheDir, { recursive: true });
77
+ await writeFile(metaPath, JSON.stringify(metadata, null, 2), 'utf-8');
78
+ }
79
+ /**
80
+ * Find entry in metadata
81
+ */
82
+ function findEntry(metadata, repo, version) {
83
+ return metadata.entries.find(entry => entry.repo === repo && entry.version === version);
84
+ }
85
+ /**
86
+ * Check if file exists
87
+ */
88
+ async function fileExists(path) {
89
+ try {
90
+ await access(path);
91
+ return true;
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ /**
98
+ * Create cache service
99
+ * Task 1.1, 1.2: Cache service factory with platform detection and entry management
100
+ */
101
+ export function createCacheService(config = {}) {
102
+ const cacheDir = config.cacheDir ?? getPlatformCacheDir();
103
+ return {
104
+ getCacheDir() {
105
+ return cacheDir;
106
+ },
107
+ async has(repo, version) {
108
+ const metadata = await loadMetadata(cacheDir);
109
+ const entry = findEntry(metadata, repo, version);
110
+ if (!entry) {
111
+ return false;
112
+ }
113
+ // Verify the file actually exists
114
+ return fileExists(entry.path);
115
+ },
116
+ async get(repo, version) {
117
+ const metadata = await loadMetadata(cacheDir);
118
+ const entry = findEntry(metadata, repo, version);
119
+ if (!entry) {
120
+ throw new Error('Cache entry not found');
121
+ }
122
+ // Verify the file exists
123
+ const exists = await fileExists(entry.path);
124
+ if (!exists) {
125
+ throw new Error('Cache entry not found');
126
+ }
127
+ return entry;
128
+ },
129
+ async set(repo, version, tarballPath) {
130
+ // Ensure cache directory exists
131
+ await mkdir(cacheDir, { recursive: true });
132
+ // Get file stats
133
+ const stats = await stat(tarballPath);
134
+ const size = stats.size;
135
+ // Determine destination path
136
+ const filename = getTarballFilename(repo, version);
137
+ const destPath = join(cacheDir, filename);
138
+ // Copy tarball to cache directory (if not already there)
139
+ if (tarballPath !== destPath) {
140
+ await copyFile(tarballPath, destPath);
141
+ }
142
+ // Create entry
143
+ const entry = {
144
+ repo,
145
+ version,
146
+ path: destPath,
147
+ cachedAt: new Date().toISOString(),
148
+ size
149
+ };
150
+ // Update metadata
151
+ const metadata = await loadMetadata(cacheDir);
152
+ const existingIndex = metadata.entries.findIndex(e => e.repo === repo && e.version === version);
153
+ if (existingIndex >= 0) {
154
+ // Update existing entry
155
+ metadata.entries[existingIndex] = entry;
156
+ }
157
+ else {
158
+ // Add new entry
159
+ metadata.entries.push(entry);
160
+ }
161
+ await saveMetadata(cacheDir, metadata);
162
+ return entry;
163
+ },
164
+ async prune(maxAgeMs) {
165
+ const metadata = await loadMetadata(cacheDir);
166
+ const now = Date.now();
167
+ const cutoff = now - maxAgeMs;
168
+ let removedCount = 0;
169
+ const remainingEntries = [];
170
+ for (const entry of metadata.entries) {
171
+ const cachedTime = new Date(entry.cachedAt).getTime();
172
+ if (cachedTime < cutoff) {
173
+ // Remove old entry
174
+ try {
175
+ await rm(entry.path, { force: true });
176
+ }
177
+ catch {
178
+ // Ignore removal errors
179
+ }
180
+ removedCount++;
181
+ }
182
+ else {
183
+ remainingEntries.push(entry);
184
+ }
185
+ }
186
+ // Update metadata with remaining entries
187
+ metadata.entries = remainingEntries;
188
+ await saveMetadata(cacheDir, metadata);
189
+ return removedCount;
190
+ },
191
+ async clear() {
192
+ const metadata = await loadMetadata(cacheDir);
193
+ // Remove all cached files
194
+ for (const entry of metadata.entries) {
195
+ try {
196
+ await rm(entry.path, { force: true });
197
+ }
198
+ catch {
199
+ // Ignore removal errors
200
+ }
201
+ }
202
+ // Reset metadata
203
+ metadata.entries = [];
204
+ await saveMetadata(cacheDir, metadata);
205
+ }
206
+ };
207
+ }
208
+ //# sourceMappingURL=CacheService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheService.js","sourceRoot":"","sources":["../../src/services/CacheService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Claude CLI Error Detection Service
3
+ * Parses stdout/stderr from Claude CLI to identify specific error conditions
4
+ */
5
+ /**
6
+ * Error codes for Claude CLI-specific failures
7
+ */
8
+ export type ClaudeErrorCode = 'CREDIT_EXHAUSTED' | 'RATE_LIMITED' | 'AUTH_FAILED' | 'MODEL_UNAVAILABLE' | 'CONTEXT_EXCEEDED' | 'NETWORK_ERROR' | 'PERMISSION_DENIED' | 'UNKNOWN';
9
+ /**
10
+ * Parsed Claude error with actionable information
11
+ */
12
+ export interface ClaudeError {
13
+ readonly code: ClaudeErrorCode;
14
+ readonly message: string;
15
+ readonly recoverable: boolean;
16
+ readonly suggestion: string;
17
+ readonly retryAfterMs?: number;
18
+ }
19
+ /**
20
+ * Claude Error Detector Service
21
+ */
22
+ export interface ClaudeErrorDetectorService {
23
+ /**
24
+ * Parse stdout and stderr to detect Claude-specific errors
25
+ * @returns ClaudeError if a known error pattern is detected, null otherwise
26
+ */
27
+ detect(stdout: string, stderr: string): ClaudeError | null;
28
+ /**
29
+ * Check if error is fatal (non-recoverable)
30
+ */
31
+ isFatal(error: ClaudeError): boolean;
32
+ /**
33
+ * Check if error warrants automatic retry
34
+ */
35
+ shouldRetry(error: ClaudeError): boolean;
36
+ /**
37
+ * Get user-friendly error message
38
+ */
39
+ formatErrorMessage(error: ClaudeError): string;
40
+ }
41
+ /**
42
+ * Create Claude error detector service
43
+ */
44
+ export declare function createClaudeErrorDetector(): ClaudeErrorDetectorService;
45
+ //# sourceMappingURL=ClaudeErrorDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeErrorDetector.d.ts","sourceRoot":"","sources":["../../src/services/ClaudeErrorDetector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,kBAAkB,GAClB,cAAc,GACd,aAAa,GACb,mBAAmB,GACnB,kBAAkB,GAClB,eAAe,GACf,mBAAmB,GACnB,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAoKD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;IAE3D;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAErC;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAEzC;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC;CAChD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,0BAA0B,CA0CtE"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Claude CLI Error Detection Service
3
+ * Parses stdout/stderr from Claude CLI to identify specific error conditions
4
+ */
5
+ /**
6
+ * Error detection patterns
7
+ * Order matters: more specific patterns should come first
8
+ */
9
+ const ERROR_PATTERNS = [
10
+ // Credit/billing errors
11
+ {
12
+ pattern: /credit balance is too low/i,
13
+ code: 'CREDIT_EXHAUSTED',
14
+ recoverable: false,
15
+ suggestion: 'Add credits at console.anthropic.com/settings/billing'
16
+ },
17
+ {
18
+ pattern: /insufficient credits/i,
19
+ code: 'CREDIT_EXHAUSTED',
20
+ recoverable: false,
21
+ suggestion: 'Add credits at console.anthropic.com/settings/billing'
22
+ },
23
+ {
24
+ pattern: /billing.*(?:issue|error|problem)/i,
25
+ code: 'CREDIT_EXHAUSTED',
26
+ recoverable: false,
27
+ suggestion: 'Check your billing status at console.anthropic.com/settings/billing'
28
+ },
29
+ // Rate limiting
30
+ {
31
+ pattern: /rate limit exceeded/i,
32
+ code: 'RATE_LIMITED',
33
+ recoverable: true,
34
+ suggestion: 'Wait a moment and retry, or reduce concurrent requests'
35
+ },
36
+ {
37
+ pattern: /too many requests/i,
38
+ code: 'RATE_LIMITED',
39
+ recoverable: true,
40
+ suggestion: 'Wait a moment and retry'
41
+ },
42
+ {
43
+ pattern: /retry.after.*?(\d+)/i,
44
+ code: 'RATE_LIMITED',
45
+ recoverable: true,
46
+ suggestion: 'Waiting for rate limit to reset...',
47
+ extractRetryAfter: (match) => {
48
+ const seconds = parseInt(match[1], 10);
49
+ return isNaN(seconds) ? undefined : seconds * 1000;
50
+ }
51
+ },
52
+ // Authentication errors
53
+ {
54
+ pattern: /invalid.*api.?key/i,
55
+ code: 'AUTH_FAILED',
56
+ recoverable: false,
57
+ suggestion: 'Check your ANTHROPIC_API_KEY environment variable or Claude config'
58
+ },
59
+ {
60
+ pattern: /authentication.*(?:failed|error|invalid)/i,
61
+ code: 'AUTH_FAILED',
62
+ recoverable: false,
63
+ suggestion: 'Verify your API key is correct and active'
64
+ },
65
+ {
66
+ pattern: /unauthorized/i,
67
+ code: 'AUTH_FAILED',
68
+ recoverable: false,
69
+ suggestion: 'Your API key may be invalid or revoked'
70
+ },
71
+ {
72
+ pattern: /api.?key.*(?:missing|not found|required)/i,
73
+ code: 'AUTH_FAILED',
74
+ recoverable: false,
75
+ suggestion: 'Set ANTHROPIC_API_KEY environment variable or configure Claude CLI'
76
+ },
77
+ // Model availability
78
+ {
79
+ pattern: /model.*(?:not available|unavailable|overloaded)/i,
80
+ code: 'MODEL_UNAVAILABLE',
81
+ recoverable: true,
82
+ suggestion: 'The model is temporarily unavailable. Try again in a few minutes.'
83
+ },
84
+ {
85
+ pattern: /service.*(?:unavailable|overloaded)/i,
86
+ code: 'MODEL_UNAVAILABLE',
87
+ recoverable: true,
88
+ suggestion: 'Anthropic API is temporarily overloaded. Try again shortly.'
89
+ },
90
+ {
91
+ pattern: /503|504|502/,
92
+ code: 'MODEL_UNAVAILABLE',
93
+ recoverable: true,
94
+ suggestion: 'Service temporarily unavailable. Will retry automatically.'
95
+ },
96
+ // Context length
97
+ {
98
+ pattern: /context.*(?:length|limit).*exceeded/i,
99
+ code: 'CONTEXT_EXCEEDED',
100
+ recoverable: false,
101
+ suggestion: 'Reduce prompt size or split into smaller tasks'
102
+ },
103
+ {
104
+ pattern: /maximum.*tokens.*exceeded/i,
105
+ code: 'CONTEXT_EXCEEDED',
106
+ recoverable: false,
107
+ suggestion: 'The request is too large. Try breaking it into smaller parts.'
108
+ },
109
+ {
110
+ pattern: /prompt.*too.*(?:long|large)/i,
111
+ code: 'CONTEXT_EXCEEDED',
112
+ recoverable: false,
113
+ suggestion: 'Reduce the size of your prompt or context'
114
+ },
115
+ // Network errors
116
+ {
117
+ pattern: /network.*(?:error|failed|unavailable)/i,
118
+ code: 'NETWORK_ERROR',
119
+ recoverable: true,
120
+ suggestion: 'Check your internet connection and try again'
121
+ },
122
+ {
123
+ pattern: /connection.*(?:refused|reset|timed out)/i,
124
+ code: 'NETWORK_ERROR',
125
+ recoverable: true,
126
+ suggestion: 'Network connection failed. Check your connection and retry.'
127
+ },
128
+ {
129
+ pattern: /ECONNREFUSED|ENOTFOUND|ETIMEDOUT|ECONNRESET/i,
130
+ code: 'NETWORK_ERROR',
131
+ recoverable: true,
132
+ suggestion: 'Network error. Verify internet connectivity.'
133
+ },
134
+ {
135
+ pattern: /fetch.*failed/i,
136
+ code: 'NETWORK_ERROR',
137
+ recoverable: true,
138
+ suggestion: 'Network request failed. Check your connection.'
139
+ },
140
+ // Permission/safety
141
+ {
142
+ pattern: /(?:content|request).*(?:blocked|refused|rejected)/i,
143
+ code: 'PERMISSION_DENIED',
144
+ recoverable: false,
145
+ suggestion: 'The request was blocked by safety filters'
146
+ },
147
+ {
148
+ pattern: /safety.*(?:filter|check)/i,
149
+ code: 'PERMISSION_DENIED',
150
+ recoverable: false,
151
+ suggestion: 'Content was flagged by safety systems'
152
+ }
153
+ ];
154
+ /**
155
+ * Create Claude error detector service
156
+ */
157
+ export function createClaudeErrorDetector() {
158
+ return {
159
+ detect(stdout, stderr) {
160
+ // Combine stdout and stderr for pattern matching
161
+ // Claude CLI sometimes outputs errors to stdout
162
+ const combined = `${stdout}\n${stderr}`;
163
+ for (const errorDef of ERROR_PATTERNS) {
164
+ const match = combined.match(errorDef.pattern);
165
+ if (match) {
166
+ // Extract the matched text for the error message
167
+ const matchedText = match[0];
168
+ const retryAfterMs = errorDef.extractRetryAfter?.(match);
169
+ return {
170
+ code: errorDef.code,
171
+ message: matchedText,
172
+ recoverable: errorDef.recoverable,
173
+ suggestion: errorDef.suggestion,
174
+ retryAfterMs
175
+ };
176
+ }
177
+ }
178
+ return null;
179
+ },
180
+ isFatal(error) {
181
+ return !error.recoverable;
182
+ },
183
+ shouldRetry(error) {
184
+ // Recoverable errors can be retried
185
+ // Rate limits should wait for retryAfterMs first
186
+ return error.recoverable;
187
+ },
188
+ formatErrorMessage(error) {
189
+ const codeLabel = ERROR_CODE_LABELS[error.code] ?? error.code;
190
+ return `${codeLabel}: ${error.suggestion}`;
191
+ }
192
+ };
193
+ }
194
+ /**
195
+ * Human-readable labels for error codes
196
+ */
197
+ const ERROR_CODE_LABELS = {
198
+ CREDIT_EXHAUSTED: 'Insufficient Credits',
199
+ RATE_LIMITED: 'Rate Limited',
200
+ AUTH_FAILED: 'Authentication Failed',
201
+ MODEL_UNAVAILABLE: 'Service Unavailable',
202
+ CONTEXT_EXCEEDED: 'Context Too Large',
203
+ NETWORK_ERROR: 'Network Error',
204
+ PERMISSION_DENIED: 'Request Blocked',
205
+ UNKNOWN: 'Unknown Error'
206
+ };
207
+ //# sourceMappingURL=ClaudeErrorDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeErrorDetector.js","sourceRoot":"","sources":["../../src/services/ClaudeErrorDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Claude API Health Check Service
3
+ * Verifies API connectivity and account status before starting flows
4
+ */
5
+ import { type ClaudeError } from './ClaudeErrorDetector.js';
6
+ /**
7
+ * Health check result
8
+ */
9
+ export interface HealthCheckResult {
10
+ readonly healthy: boolean;
11
+ readonly error?: ClaudeError;
12
+ readonly message: string;
13
+ readonly durationMs: number;
14
+ }
15
+ /**
16
+ * Health check options
17
+ */
18
+ export interface HealthCheckOptions {
19
+ readonly tier?: string;
20
+ readonly sandbox?: boolean;
21
+ readonly timeoutMs?: number;
22
+ }
23
+ /**
24
+ * Claude Health Check Service Interface
25
+ */
26
+ export interface ClaudeHealthCheckService {
27
+ /**
28
+ * Run a quick health check to verify API is ready
29
+ * Sends a minimal prompt to Claude CLI and checks for errors
30
+ */
31
+ check(options?: HealthCheckOptions): Promise<HealthCheckResult>;
32
+ }
33
+ /**
34
+ * Create Claude health check service
35
+ */
36
+ export declare function createClaudeHealthCheck(): ClaudeHealthCheckService;
37
+ //# sourceMappingURL=ClaudeHealthCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeHealthCheck.d.ts","sourceRoot":"","sources":["../../src/services/ClaudeHealthCheck.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAqDD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,wBAAwB,CA4JlE"}