agent-nuvira 1.14.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 (379) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +891 -0
  3. package/dist/agent-sdk/src/agent.d.ts +118 -0
  4. package/dist/agent-sdk/src/agent.d.ts.map +1 -0
  5. package/dist/agent-sdk/src/agent.js +88 -0
  6. package/dist/agent-sdk/src/agent.js.map +1 -0
  7. package/dist/agent-sdk/src/index.d.ts +33 -0
  8. package/dist/agent-sdk/src/index.d.ts.map +1 -0
  9. package/dist/agent-sdk/src/index.js +32 -0
  10. package/dist/agent-sdk/src/index.js.map +1 -0
  11. package/dist/agent-sdk/src/register.d.ts +70 -0
  12. package/dist/agent-sdk/src/register.d.ts.map +1 -0
  13. package/dist/agent-sdk/src/register.js +181 -0
  14. package/dist/agent-sdk/src/register.js.map +1 -0
  15. package/dist/agent-sdk/src/scaffold.d.ts +50 -0
  16. package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
  17. package/dist/agent-sdk/src/scaffold.js +291 -0
  18. package/dist/agent-sdk/src/scaffold.js.map +1 -0
  19. package/dist/agent-sdk/src/testing.d.ts +187 -0
  20. package/dist/agent-sdk/src/testing.d.ts.map +1 -0
  21. package/dist/agent-sdk/src/testing.js +243 -0
  22. package/dist/agent-sdk/src/testing.js.map +1 -0
  23. package/dist/agent-sdk/src/types.d.ts +202 -0
  24. package/dist/agent-sdk/src/types.d.ts.map +1 -0
  25. package/dist/agent-sdk/src/types.js +11 -0
  26. package/dist/agent-sdk/src/types.js.map +1 -0
  27. package/dist/agents/agent.d.ts +132 -0
  28. package/dist/agents/agent.d.ts.map +1 -0
  29. package/dist/agents/agent.js +19 -0
  30. package/dist/agents/agent.js.map +1 -0
  31. package/dist/agents/agents/context-gatherer.d.ts +42 -0
  32. package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
  33. package/dist/agents/agents/context-gatherer.js +366 -0
  34. package/dist/agents/agents/context-gatherer.js.map +1 -0
  35. package/dist/agents/agents/debugger.d.ts +58 -0
  36. package/dist/agents/agents/debugger.d.ts.map +1 -0
  37. package/dist/agents/agents/debugger.js +257 -0
  38. package/dist/agents/agents/debugger.js.map +1 -0
  39. package/dist/agents/agents/git-agent.d.ts +34 -0
  40. package/dist/agents/agents/git-agent.d.ts.map +1 -0
  41. package/dist/agents/agents/git-agent.js +200 -0
  42. package/dist/agents/agents/git-agent.js.map +1 -0
  43. package/dist/agents/agents/github-release-agent.d.ts +65 -0
  44. package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
  45. package/dist/agents/agents/github-release-agent.js +439 -0
  46. package/dist/agents/agents/github-release-agent.js.map +1 -0
  47. package/dist/agents/agents/package-agent.d.ts +33 -0
  48. package/dist/agents/agents/package-agent.d.ts.map +1 -0
  49. package/dist/agents/agents/package-agent.js +233 -0
  50. package/dist/agents/agents/package-agent.js.map +1 -0
  51. package/dist/agents/agents/planner.d.ts +26 -0
  52. package/dist/agents/agents/planner.d.ts.map +1 -0
  53. package/dist/agents/agents/planner.js +222 -0
  54. package/dist/agents/agents/planner.js.map +1 -0
  55. package/dist/agents/agents/reviewer.d.ts +34 -0
  56. package/dist/agents/agents/reviewer.d.ts.map +1 -0
  57. package/dist/agents/agents/reviewer.js +159 -0
  58. package/dist/agents/agents/reviewer.js.map +1 -0
  59. package/dist/agents/agents/runner.d.ts +73 -0
  60. package/dist/agents/agents/runner.d.ts.map +1 -0
  61. package/dist/agents/agents/runner.js +299 -0
  62. package/dist/agents/agents/runner.js.map +1 -0
  63. package/dist/agents/agents/security-agent.d.ts +33 -0
  64. package/dist/agents/agents/security-agent.d.ts.map +1 -0
  65. package/dist/agents/agents/security-agent.js +184 -0
  66. package/dist/agents/agents/security-agent.js.map +1 -0
  67. package/dist/agents/agents/tester.d.ts +96 -0
  68. package/dist/agents/agents/tester.d.ts.map +1 -0
  69. package/dist/agents/agents/tester.js +410 -0
  70. package/dist/agents/agents/tester.js.map +1 -0
  71. package/dist/agents/agents/writer.d.ts +51 -0
  72. package/dist/agents/agents/writer.d.ts.map +1 -0
  73. package/dist/agents/agents/writer.js +384 -0
  74. package/dist/agents/agents/writer.js.map +1 -0
  75. package/dist/agents/context-vault.d.ts +49 -0
  76. package/dist/agents/context-vault.d.ts.map +1 -0
  77. package/dist/agents/context-vault.js +134 -0
  78. package/dist/agents/context-vault.js.map +1 -0
  79. package/dist/agents/orchestrator.d.ts +97 -0
  80. package/dist/agents/orchestrator.d.ts.map +1 -0
  81. package/dist/agents/orchestrator.js +696 -0
  82. package/dist/agents/orchestrator.js.map +1 -0
  83. package/dist/agents/utils/file-tree.d.ts +28 -0
  84. package/dist/agents/utils/file-tree.d.ts.map +1 -0
  85. package/dist/agents/utils/file-tree.js +93 -0
  86. package/dist/agents/utils/file-tree.js.map +1 -0
  87. package/dist/cli/agent.d.ts +25 -0
  88. package/dist/cli/agent.d.ts.map +1 -0
  89. package/dist/cli/agent.js +374 -0
  90. package/dist/cli/agent.js.map +1 -0
  91. package/dist/cli/benchmark.d.ts +24 -0
  92. package/dist/cli/benchmark.d.ts.map +1 -0
  93. package/dist/cli/benchmark.js +235 -0
  94. package/dist/cli/benchmark.js.map +1 -0
  95. package/dist/cli/cache.d.ts +12 -0
  96. package/dist/cli/cache.d.ts.map +1 -0
  97. package/dist/cli/cache.js +58 -0
  98. package/dist/cli/cache.js.map +1 -0
  99. package/dist/cli/chat.d.ts +37 -0
  100. package/dist/cli/chat.d.ts.map +1 -0
  101. package/dist/cli/chat.js +393 -0
  102. package/dist/cli/chat.js.map +1 -0
  103. package/dist/cli/commands.d.ts +24 -0
  104. package/dist/cli/commands.d.ts.map +1 -0
  105. package/dist/cli/commands.js +18 -0
  106. package/dist/cli/commands.js.map +1 -0
  107. package/dist/cli/config.d.ts +19 -0
  108. package/dist/cli/config.d.ts.map +1 -0
  109. package/dist/cli/config.js +162 -0
  110. package/dist/cli/config.js.map +1 -0
  111. package/dist/cli/dashboard.d.ts +34 -0
  112. package/dist/cli/dashboard.d.ts.map +1 -0
  113. package/dist/cli/dashboard.js +126 -0
  114. package/dist/cli/dashboard.js.map +1 -0
  115. package/dist/cli/doctor.d.ts +68 -0
  116. package/dist/cli/doctor.d.ts.map +1 -0
  117. package/dist/cli/doctor.js +585 -0
  118. package/dist/cli/doctor.js.map +1 -0
  119. package/dist/cli/edit.d.ts +11 -0
  120. package/dist/cli/edit.d.ts.map +1 -0
  121. package/dist/cli/edit.js +86 -0
  122. package/dist/cli/edit.js.map +1 -0
  123. package/dist/cli/execute.d.ts +25 -0
  124. package/dist/cli/execute.d.ts.map +1 -0
  125. package/dist/cli/execute.js +186 -0
  126. package/dist/cli/execute.js.map +1 -0
  127. package/dist/cli/federation.d.ts +31 -0
  128. package/dist/cli/federation.d.ts.map +1 -0
  129. package/dist/cli/federation.js +387 -0
  130. package/dist/cli/federation.js.map +1 -0
  131. package/dist/cli/history.d.ts +22 -0
  132. package/dist/cli/history.d.ts.map +1 -0
  133. package/dist/cli/history.js +140 -0
  134. package/dist/cli/history.js.map +1 -0
  135. package/dist/cli/init.d.ts +49 -0
  136. package/dist/cli/init.d.ts.map +1 -0
  137. package/dist/cli/init.js +423 -0
  138. package/dist/cli/init.js.map +1 -0
  139. package/dist/cli/learn.d.ts +31 -0
  140. package/dist/cli/learn.d.ts.map +1 -0
  141. package/dist/cli/learn.js +320 -0
  142. package/dist/cli/learn.js.map +1 -0
  143. package/dist/cli/memory.d.ts +38 -0
  144. package/dist/cli/memory.d.ts.map +1 -0
  145. package/dist/cli/memory.js +295 -0
  146. package/dist/cli/memory.js.map +1 -0
  147. package/dist/cli/model-picker.d.ts +18 -0
  148. package/dist/cli/model-picker.d.ts.map +1 -0
  149. package/dist/cli/model-picker.js +225 -0
  150. package/dist/cli/model-picker.js.map +1 -0
  151. package/dist/cli/models.d.ts +11 -0
  152. package/dist/cli/models.d.ts.map +1 -0
  153. package/dist/cli/models.js +132 -0
  154. package/dist/cli/models.js.map +1 -0
  155. package/dist/cli/plan.d.ts +11 -0
  156. package/dist/cli/plan.d.ts.map +1 -0
  157. package/dist/cli/plan.js +94 -0
  158. package/dist/cli/plan.js.map +1 -0
  159. package/dist/cli/plugins.d.ts +15 -0
  160. package/dist/cli/plugins.d.ts.map +1 -0
  161. package/dist/cli/plugins.js +123 -0
  162. package/dist/cli/plugins.js.map +1 -0
  163. package/dist/cli/router.d.ts +20 -0
  164. package/dist/cli/router.d.ts.map +1 -0
  165. package/dist/cli/router.js +142 -0
  166. package/dist/cli/router.js.map +1 -0
  167. package/dist/cli/run.d.ts +22 -0
  168. package/dist/cli/run.d.ts.map +1 -0
  169. package/dist/cli/run.js +110 -0
  170. package/dist/cli/run.js.map +1 -0
  171. package/dist/cli/sandbox.d.ts +27 -0
  172. package/dist/cli/sandbox.d.ts.map +1 -0
  173. package/dist/cli/sandbox.js +264 -0
  174. package/dist/cli/sandbox.js.map +1 -0
  175. package/dist/cli/sdk.d.ts +27 -0
  176. package/dist/cli/sdk.d.ts.map +1 -0
  177. package/dist/cli/sdk.js +204 -0
  178. package/dist/cli/sdk.js.map +1 -0
  179. package/dist/cli/stats.d.ts +18 -0
  180. package/dist/cli/stats.d.ts.map +1 -0
  181. package/dist/cli/stats.js +78 -0
  182. package/dist/cli/stats.js.map +1 -0
  183. package/dist/cli/team.d.ts +42 -0
  184. package/dist/cli/team.d.ts.map +1 -0
  185. package/dist/cli/team.js +473 -0
  186. package/dist/cli/team.js.map +1 -0
  187. package/dist/cli/workflow.d.ts +27 -0
  188. package/dist/cli/workflow.d.ts.map +1 -0
  189. package/dist/cli/workflow.js +347 -0
  190. package/dist/cli/workflow.js.map +1 -0
  191. package/dist/config/manager.d.ts +37 -0
  192. package/dist/config/manager.d.ts.map +1 -0
  193. package/dist/config/manager.js +147 -0
  194. package/dist/config/manager.js.map +1 -0
  195. package/dist/config/types.d.ts +53 -0
  196. package/dist/config/types.d.ts.map +1 -0
  197. package/dist/config/types.js +2 -0
  198. package/dist/config/types.js.map +1 -0
  199. package/dist/context/cache.d.ts +27 -0
  200. package/dist/context/cache.d.ts.map +1 -0
  201. package/dist/context/cache.js +116 -0
  202. package/dist/context/cache.js.map +1 -0
  203. package/dist/context/history.d.ts +87 -0
  204. package/dist/context/history.d.ts.map +1 -0
  205. package/dist/context/history.js +249 -0
  206. package/dist/context/history.js.map +1 -0
  207. package/dist/context/parser.d.ts +61 -0
  208. package/dist/context/parser.d.ts.map +1 -0
  209. package/dist/context/parser.js +194 -0
  210. package/dist/context/parser.js.map +1 -0
  211. package/dist/federation/client.d.ts +49 -0
  212. package/dist/federation/client.d.ts.map +1 -0
  213. package/dist/federation/client.js +239 -0
  214. package/dist/federation/client.js.map +1 -0
  215. package/dist/federation/protocol.d.ts +155 -0
  216. package/dist/federation/protocol.d.ts.map +1 -0
  217. package/dist/federation/protocol.js +57 -0
  218. package/dist/federation/protocol.js.map +1 -0
  219. package/dist/federation/server.d.ts +25 -0
  220. package/dist/federation/server.d.ts.map +1 -0
  221. package/dist/federation/server.js +401 -0
  222. package/dist/federation/server.js.map +1 -0
  223. package/dist/index.d.ts +67 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +93 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/inference/factory.d.ts +20 -0
  228. package/dist/inference/factory.d.ts.map +1 -0
  229. package/dist/inference/factory.js +46 -0
  230. package/dist/inference/factory.js.map +1 -0
  231. package/dist/inference/gemini-adapter.d.ts +17 -0
  232. package/dist/inference/gemini-adapter.d.ts.map +1 -0
  233. package/dist/inference/gemini-adapter.js +176 -0
  234. package/dist/inference/gemini-adapter.js.map +1 -0
  235. package/dist/inference/groq-adapter.d.ts +17 -0
  236. package/dist/inference/groq-adapter.d.ts.map +1 -0
  237. package/dist/inference/groq-adapter.js +103 -0
  238. package/dist/inference/groq-adapter.js.map +1 -0
  239. package/dist/inference/interface.d.ts +49 -0
  240. package/dist/inference/interface.d.ts.map +1 -0
  241. package/dist/inference/interface.js +2 -0
  242. package/dist/inference/interface.js.map +1 -0
  243. package/dist/inference/local-adapter.d.ts +35 -0
  244. package/dist/inference/local-adapter.d.ts.map +1 -0
  245. package/dist/inference/local-adapter.js +311 -0
  246. package/dist/inference/local-adapter.js.map +1 -0
  247. package/dist/inference/model-catalog.d.ts +53 -0
  248. package/dist/inference/model-catalog.d.ts.map +1 -0
  249. package/dist/inference/model-catalog.js +306 -0
  250. package/dist/inference/model-catalog.js.map +1 -0
  251. package/dist/inference/nim-adapter.d.ts +17 -0
  252. package/dist/inference/nim-adapter.d.ts.map +1 -0
  253. package/dist/inference/nim-adapter.js +103 -0
  254. package/dist/inference/nim-adapter.js.map +1 -0
  255. package/dist/inference/openrouter-adapter.d.ts +17 -0
  256. package/dist/inference/openrouter-adapter.d.ts.map +1 -0
  257. package/dist/inference/openrouter-adapter.js +105 -0
  258. package/dist/inference/openrouter-adapter.js.map +1 -0
  259. package/dist/inference/sse.d.ts +20 -0
  260. package/dist/inference/sse.d.ts.map +1 -0
  261. package/dist/inference/sse.js +91 -0
  262. package/dist/inference/sse.js.map +1 -0
  263. package/dist/learning/agent-stats.d.ts +109 -0
  264. package/dist/learning/agent-stats.d.ts.map +1 -0
  265. package/dist/learning/agent-stats.js +240 -0
  266. package/dist/learning/agent-stats.js.map +1 -0
  267. package/dist/learning/benchmark.d.ts +161 -0
  268. package/dist/learning/benchmark.d.ts.map +1 -0
  269. package/dist/learning/benchmark.js +589 -0
  270. package/dist/learning/benchmark.js.map +1 -0
  271. package/dist/learning/cost-tracker.d.ts +101 -0
  272. package/dist/learning/cost-tracker.d.ts.map +1 -0
  273. package/dist/learning/cost-tracker.js +224 -0
  274. package/dist/learning/cost-tracker.js.map +1 -0
  275. package/dist/learning/feedback.d.ts +88 -0
  276. package/dist/learning/feedback.d.ts.map +1 -0
  277. package/dist/learning/feedback.js +169 -0
  278. package/dist/learning/feedback.js.map +1 -0
  279. package/dist/learning/hybrid-router.d.ts +201 -0
  280. package/dist/learning/hybrid-router.d.ts.map +1 -0
  281. package/dist/learning/hybrid-router.js +450 -0
  282. package/dist/learning/hybrid-router.js.map +1 -0
  283. package/dist/learning/model-compare.d.ts +76 -0
  284. package/dist/learning/model-compare.d.ts.map +1 -0
  285. package/dist/learning/model-compare.js +252 -0
  286. package/dist/learning/model-compare.js.map +1 -0
  287. package/dist/learning/model-router.d.ts +68 -0
  288. package/dist/learning/model-router.d.ts.map +1 -0
  289. package/dist/learning/model-router.js +140 -0
  290. package/dist/learning/model-router.js.map +1 -0
  291. package/dist/learning/pattern-extractor.d.ts +99 -0
  292. package/dist/learning/pattern-extractor.d.ts.map +1 -0
  293. package/dist/learning/pattern-extractor.js +310 -0
  294. package/dist/learning/pattern-extractor.js.map +1 -0
  295. package/dist/learning/scorer.d.ts +51 -0
  296. package/dist/learning/scorer.d.ts.map +1 -0
  297. package/dist/learning/scorer.js +64 -0
  298. package/dist/learning/scorer.js.map +1 -0
  299. package/dist/learning/self-improver.d.ts +48 -0
  300. package/dist/learning/self-improver.d.ts.map +1 -0
  301. package/dist/learning/self-improver.js +161 -0
  302. package/dist/learning/self-improver.js.map +1 -0
  303. package/dist/memory/embedder.d.ts +65 -0
  304. package/dist/memory/embedder.d.ts.map +1 -0
  305. package/dist/memory/embedder.js +424 -0
  306. package/dist/memory/embedder.js.map +1 -0
  307. package/dist/memory/memory-integration.d.ts +56 -0
  308. package/dist/memory/memory-integration.d.ts.map +1 -0
  309. package/dist/memory/memory-integration.js +95 -0
  310. package/dist/memory/memory-integration.js.map +1 -0
  311. package/dist/memory/trajectory-store.d.ts +149 -0
  312. package/dist/memory/trajectory-store.d.ts.map +1 -0
  313. package/dist/memory/trajectory-store.js +476 -0
  314. package/dist/memory/trajectory-store.js.map +1 -0
  315. package/dist/memory/vector-store.d.ts +78 -0
  316. package/dist/memory/vector-store.d.ts.map +1 -0
  317. package/dist/memory/vector-store.js +186 -0
  318. package/dist/memory/vector-store.js.map +1 -0
  319. package/dist/plugins/agent-plugin.d.ts +73 -0
  320. package/dist/plugins/agent-plugin.d.ts.map +1 -0
  321. package/dist/plugins/agent-plugin.js +199 -0
  322. package/dist/plugins/agent-plugin.js.map +1 -0
  323. package/dist/plugins/registry.d.ts +61 -0
  324. package/dist/plugins/registry.d.ts.map +1 -0
  325. package/dist/plugins/registry.js +67 -0
  326. package/dist/plugins/registry.js.map +1 -0
  327. package/dist/sandbox/images.d.ts +31 -0
  328. package/dist/sandbox/images.d.ts.map +1 -0
  329. package/dist/sandbox/images.js +129 -0
  330. package/dist/sandbox/images.js.map +1 -0
  331. package/dist/sandbox/manager.d.ts +134 -0
  332. package/dist/sandbox/manager.d.ts.map +1 -0
  333. package/dist/sandbox/manager.js +470 -0
  334. package/dist/sandbox/manager.js.map +1 -0
  335. package/dist/sandbox/types.d.ts +113 -0
  336. package/dist/sandbox/types.d.ts.map +1 -0
  337. package/dist/sandbox/types.js +107 -0
  338. package/dist/sandbox/types.js.map +1 -0
  339. package/dist/security/scanner.d.ts +53 -0
  340. package/dist/security/scanner.d.ts.map +1 -0
  341. package/dist/security/scanner.js +271 -0
  342. package/dist/security/scanner.js.map +1 -0
  343. package/dist/team/config.d.ts +50 -0
  344. package/dist/team/config.d.ts.map +1 -0
  345. package/dist/team/config.js +108 -0
  346. package/dist/team/config.js.map +1 -0
  347. package/dist/team/memory.d.ts +63 -0
  348. package/dist/team/memory.d.ts.map +1 -0
  349. package/dist/team/memory.js +282 -0
  350. package/dist/team/memory.js.map +1 -0
  351. package/dist/team/review.d.ts +123 -0
  352. package/dist/team/review.d.ts.map +1 -0
  353. package/dist/team/review.js +293 -0
  354. package/dist/team/review.js.map +1 -0
  355. package/dist/utils/env.d.ts +19 -0
  356. package/dist/utils/env.d.ts.map +1 -0
  357. package/dist/utils/env.js +250 -0
  358. package/dist/utils/env.js.map +1 -0
  359. package/dist/utils/logger.d.ts +11 -0
  360. package/dist/utils/logger.d.ts.map +1 -0
  361. package/dist/utils/logger.js +45 -0
  362. package/dist/utils/logger.js.map +1 -0
  363. package/dist/web-dashboard/server.d.ts +59 -0
  364. package/dist/web-dashboard/server.d.ts.map +1 -0
  365. package/dist/web-dashboard/server.js +418 -0
  366. package/dist/web-dashboard/server.js.map +1 -0
  367. package/dist/workflow/registry.d.ts +127 -0
  368. package/dist/workflow/registry.d.ts.map +1 -0
  369. package/dist/workflow/registry.js +482 -0
  370. package/dist/workflow/registry.js.map +1 -0
  371. package/dist/workflow/templates.d.ts +93 -0
  372. package/dist/workflow/templates.d.ts.map +1 -0
  373. package/dist/workflow/templates.js +481 -0
  374. package/dist/workflow/templates.js.map +1 -0
  375. package/package.json +78 -0
  376. package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
  377. package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
  378. package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
  379. package/src/web-dashboard/public/index.html +13 -0
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Federation command — Connect to and manage remote agent instances.
3
+ *
4
+ * Usage:
5
+ * buff federation status — Show connection status and info
6
+ * buff federation start — Start the federation server
7
+ * buff federation start --port 8374 — Start on a specific port
8
+ * buff federation start --daemon — Run in background (detached)
9
+ * buff federation connect <host> — Connect to a remote server
10
+ * buff federation connect <host> --port 8374
11
+ * buff federation connect <host> --secret mykey
12
+ * buff federation disconnect — Disconnect from remote server
13
+ * buff federation run <goal> — Run a task on the remote server
14
+ * buff federation run <goal> --agent writer
15
+ * buff federation health — Check remote server health
16
+ */
17
+ import { Command } from 'commander';
18
+ import { homedir, hostname } from 'node:os';
19
+ import { existsSync, writeFileSync, readFileSync, mkdirSync } from 'node:fs';
20
+ import { join } from 'node:path';
21
+ import inquirer from 'inquirer';
22
+ import { BaseCommand } from './commands.js';
23
+ import { logger } from '../utils/logger.js';
24
+ import { startFederationServer } from '../federation/server.js';
25
+ import { FederationClient } from '../federation/client.js';
26
+ import { DEFAULT_FEDERATION_CONFIG, DEFAULT_FEDERATION_PORT, } from '../federation/protocol.js';
27
+ // ─── Constants ──────────────────────────────────────────────────────────────
28
+ const FEDERATION_CONFIG_PATH = join(homedir(), '.buff', 'federation.json');
29
+ // ─── Helpers ────────────────────────────────────────────────────────────────
30
+ function loadConfig() {
31
+ try {
32
+ if (existsSync(FEDERATION_CONFIG_PATH)) {
33
+ const raw = readFileSync(FEDERATION_CONFIG_PATH, 'utf-8');
34
+ return { ...DEFAULT_FEDERATION_CONFIG, ...JSON.parse(raw) };
35
+ }
36
+ }
37
+ catch {
38
+ // Fall through to default
39
+ }
40
+ return { ...DEFAULT_FEDERATION_CONFIG };
41
+ }
42
+ function saveConfig(config) {
43
+ try {
44
+ const dir = join(homedir(), '.buff');
45
+ if (!existsSync(dir))
46
+ mkdirSync(dir, { recursive: true });
47
+ writeFileSync(FEDERATION_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');
48
+ }
49
+ catch {
50
+ // Non-critical
51
+ }
52
+ }
53
+ // ─── FederationCommand ──────────────────────────────────────────────────────
54
+ export class FederationCommand extends BaseCommand {
55
+ client = null;
56
+ create() {
57
+ const command = new Command('federation')
58
+ .description('Connect to and manage remote agent instances');
59
+ // ── status ────────────────────────────────────────────────────────────
60
+ command
61
+ .command('status')
62
+ .description('Show federation connection status and configuration')
63
+ .action(async () => {
64
+ await this.showStatus();
65
+ });
66
+ // ── start ─────────────────────────────────────────────────────────────
67
+ command
68
+ .command('start')
69
+ .description('Start the federation server (listens for incoming connections)')
70
+ .option('-p, --port <port>', 'Port to listen on', parseInt, DEFAULT_FEDERATION_PORT)
71
+ .option('-s, --secret <secret>', 'Pre-shared authentication key')
72
+ .option('--host <host>', 'Host to bind to', DEFAULT_FEDERATION_CONFIG.host)
73
+ .option('--daemon', 'Run in background (detached process)', false)
74
+ .action(async (options) => {
75
+ await this.startServer(options || {});
76
+ });
77
+ // ── connect ───────────────────────────────────────────────────────────
78
+ command
79
+ .command('connect')
80
+ .description('Connect to a remote federation server')
81
+ .argument('<host>', 'Remote server hostname or IP address')
82
+ .option('-p, --port <port>', 'Remote server port', parseInt, DEFAULT_FEDERATION_PORT)
83
+ .option('-s, --secret <secret>', 'Pre-shared authentication key')
84
+ .action(async (host, options) => {
85
+ await this.connectToServer(host, options || {});
86
+ });
87
+ // ── disconnect ────────────────────────────────────────────────────────
88
+ command
89
+ .command('disconnect')
90
+ .description('Disconnect from the remote federation server')
91
+ .action(async () => {
92
+ await this.disconnectFromServer();
93
+ });
94
+ // ── run ───────────────────────────────────────────────────────────────
95
+ command
96
+ .command('run')
97
+ .description('Run a task on the remote federation server')
98
+ .argument('<goal>', 'The task goal to execute remotely')
99
+ .option('-a, --agent <agent>', 'Agent type to run', 'writer')
100
+ .option('-p, --provider <provider>', 'Provider override')
101
+ .option('-m, --model <model>', 'Model override')
102
+ .option('--timeout <ms>', 'Task timeout in ms', parseInt)
103
+ .option('--no-stream', 'Disable progress streaming')
104
+ .action(async (goal, options) => {
105
+ await this.runRemoteTask(goal, options || {});
106
+ });
107
+ // ── health ────────────────────────────────────────────────────────────
108
+ command
109
+ .command('health')
110
+ .description('Check the health of the remote federation server')
111
+ .action(async () => {
112
+ await this.checkHealth();
113
+ });
114
+ // ── config ────────────────────────────────────────────────────────────
115
+ command
116
+ .command('config')
117
+ .description('Show or update federation configuration')
118
+ .option('--show', 'Show current config', true)
119
+ .option('--set-secret <secret>', 'Set federation secret')
120
+ .option('--set-port <port>', 'Set federation port', parseInt)
121
+ .action(async (options) => {
122
+ await this.manageConfig(options || {});
123
+ });
124
+ return command;
125
+ }
126
+ // ── Action Handlers ──────────────────────────────────────────────────────
127
+ async showStatus() {
128
+ const config = loadConfig();
129
+ logger.highlight('═'.repeat(60));
130
+ logger.highlight(' 🌐 Federation Status');
131
+ logger.highlight('═'.repeat(60));
132
+ console.log(`\n Mode: ${config.enabled ? '✅ Enabled' : '⏸️ Disabled'}`);
133
+ console.log(` Node ID: ${config.nodeId}`);
134
+ if (config.secret) {
135
+ console.log(` Secret: ${'•'.repeat(Math.min(config.secret.length, 12))}`);
136
+ }
137
+ else {
138
+ console.log(' Secret: ⚠️ Not set');
139
+ }
140
+ console.log(`\n 📡 Server:`);
141
+ console.log(` Host: ${config.host}`);
142
+ console.log(` Port: ${config.port}`);
143
+ console.log(`\n 🎯 Capabilities:`);
144
+ for (const cap of config.capabilities) {
145
+ console.log(` • ${cap}`);
146
+ }
147
+ console.log(`\n ⚙️ Settings:`);
148
+ console.log(` Max concurrent tasks: ${config.maxConcurrentTasks}`);
149
+ console.log(` Task timeout: ${(config.taskTimeoutMs / 1000 / 60).toFixed(0)} min`);
150
+ if (this.client) {
151
+ console.log(`\n 🔗 Remote Connection:`);
152
+ console.log(` Status: ${this.client.isConnected() ? '✅ Connected' : '❌ Disconnected'}`);
153
+ if (this.client.getServerId()) {
154
+ console.log(` Remote server: ${this.client.getServerId()}`);
155
+ }
156
+ }
157
+ console.log('');
158
+ }
159
+ async startServer(options) {
160
+ const config = loadConfig();
161
+ const port = options.port || config.port;
162
+ const secret = options.secret || config.secret || process.env.FEDERATION_SECRET || '';
163
+ const host = options.host || config.host;
164
+ if (!secret) {
165
+ logger.error('Federation secret is required.');
166
+ logger.info('Set it with: buff federation config --set-secret <your-secret>');
167
+ logger.info('Or via: export FEDERATION_SECRET=your-secret');
168
+ return;
169
+ }
170
+ logger.info(`Starting federation server on ${host}:${port}...`);
171
+ const updatedConfig = {
172
+ ...config,
173
+ enabled: true,
174
+ port,
175
+ secret,
176
+ host,
177
+ };
178
+ saveConfig(updatedConfig);
179
+ try {
180
+ const server = await startFederationServer({
181
+ port,
182
+ secret,
183
+ host,
184
+ nodeId: hostname(),
185
+ capabilities: config.capabilities,
186
+ });
187
+ logger.success(`Federation server running on ${host}:${port}`);
188
+ logger.info(' Press Ctrl+C to stop the server.');
189
+ process.on('SIGINT', () => {
190
+ logger.info('\nShutting down federation server...');
191
+ server.close(() => {
192
+ logger.success('Federation server stopped.');
193
+ process.exit(0);
194
+ });
195
+ });
196
+ process.on('SIGTERM', () => {
197
+ server.close(() => process.exit(0));
198
+ });
199
+ await new Promise(() => { });
200
+ }
201
+ catch (err) {
202
+ logger.error(`Failed to start federation server: ${err instanceof Error ? err.message : String(err)}`);
203
+ }
204
+ }
205
+ async connectToServer(host, options) {
206
+ const config = loadConfig();
207
+ let secret = options.secret || config.secret || process.env.FEDERATION_SECRET || '';
208
+ if (!secret) {
209
+ const answer = await inquirer.prompt([
210
+ {
211
+ type: 'password',
212
+ name: 'secret',
213
+ message: 'Enter federation secret:',
214
+ validate: (input) => input.length > 0 || 'Secret is required',
215
+ },
216
+ ]);
217
+ secret = answer.secret;
218
+ }
219
+ logger.info(`Connecting to ${host}:${options.port || config.port}...`);
220
+ this.client = new FederationClient({
221
+ host,
222
+ port: options.port || config.port,
223
+ secret,
224
+ nodeId: hostname(),
225
+ });
226
+ this.client.on('connected', () => {
227
+ logger.success('Connected to federation server.');
228
+ });
229
+ this.client.on('error', (err) => {
230
+ logger.error(`Federation error: ${err.message}`);
231
+ });
232
+ this.client.on('task-progress', (event) => {
233
+ if (event.progress !== undefined) {
234
+ logger.info(` Progress: ${event.progress}% — ${event.message || ''}`);
235
+ }
236
+ });
237
+ try {
238
+ const handshake = await this.client.connect();
239
+ logger.success(`Connected to server: ${handshake.serverId}`);
240
+ console.log(` Session expires: ${new Date(handshake.expiresAt).toLocaleString()}`);
241
+ console.log(` Server capabilities: ${handshake.capabilities.join(', ')}`);
242
+ saveConfig({
243
+ ...config,
244
+ enabled: true,
245
+ host,
246
+ port: options.port || config.port,
247
+ secret,
248
+ });
249
+ }
250
+ catch (err) {
251
+ logger.error(`Failed to connect: ${err instanceof Error ? err.message : String(err)}`);
252
+ this.client = null;
253
+ }
254
+ }
255
+ async disconnectFromServer() {
256
+ if (this.client) {
257
+ this.client.disconnect();
258
+ this.client = null;
259
+ logger.success('Disconnected from federation server.');
260
+ }
261
+ else {
262
+ logger.info('Not currently connected to any federation server.');
263
+ }
264
+ }
265
+ async runRemoteTask(goal, options) {
266
+ if (!this.client || !this.client.isConnected()) {
267
+ logger.error('Not connected to a federation server.');
268
+ logger.info('Connect first: buff federation connect <host>');
269
+ return;
270
+ }
271
+ const agentType = options.agent || 'writer';
272
+ logger.info(`Delegating task to remote server: ${agentType}: ${goal.slice(0, 80)}...`);
273
+ console.log('');
274
+ try {
275
+ const result = await this.client.delegateTask(goal, agentType, {
276
+ provider: options.provider,
277
+ model: options.model,
278
+ timeoutMs: options.timeout,
279
+ streamProgress: options.stream !== false,
280
+ });
281
+ console.log('');
282
+ if (result.success) {
283
+ logger.success('Task completed successfully on remote server.');
284
+ }
285
+ else {
286
+ logger.error('Task failed on remote server.');
287
+ }
288
+ console.log(` Summary: ${result.summary}`);
289
+ if (result.details) {
290
+ console.log(` Details: ${result.details.slice(0, 500)}`);
291
+ }
292
+ if (result.error) {
293
+ console.log(` Error: ${result.error}`);
294
+ }
295
+ console.log(` Duration: ${(result.durationMs / 1000).toFixed(1)}s`);
296
+ if (result.costUsd) {
297
+ console.log(` Cost: $${result.costUsd.toFixed(6)}`);
298
+ }
299
+ console.log('');
300
+ }
301
+ catch (err) {
302
+ logger.error(`Remote task failed: ${err instanceof Error ? err.message : String(err)}`);
303
+ }
304
+ }
305
+ async checkHealth() {
306
+ if (this.client && this.client.isConnected()) {
307
+ try {
308
+ const healthData = await this.client.getHealth();
309
+ this.renderHealth(healthData);
310
+ return;
311
+ }
312
+ catch {
313
+ // Fall through to unauthenticated health check
314
+ }
315
+ }
316
+ // Try unauthenticated health check
317
+ const config = loadConfig();
318
+ try {
319
+ const response = await fetch(`http://${config.host}:${config.port}/federation/health`);
320
+ const data = await response.json();
321
+ // Unwrap envelope if present
322
+ const healthData = (data?.type === 'response' ? data.payload : data);
323
+ this.renderHealth({
324
+ status: (healthData.status || 'unknown'),
325
+ uptime: healthData.uptime || 0,
326
+ activeTasks: healthData.activeTasks || 0,
327
+ completedTasks: healthData.completedTasks || 0,
328
+ failedTasks: healthData.failedTasks || 0,
329
+ version: healthData.version || 'unknown',
330
+ loadAverage: healthData.loadAverage,
331
+ });
332
+ }
333
+ catch {
334
+ logger.error('Could not connect to federation server.');
335
+ logger.info('Is the server running? Start it with: buff federation start');
336
+ }
337
+ }
338
+ renderHealth(health) {
339
+ const statusEmoji = health.status === 'ok' ? '✅' : health.status === 'degraded' ? '⚠️' : '❌';
340
+ const uptimeMinutes = Math.floor(health.uptime / 1000 / 60);
341
+ logger.highlight('═'.repeat(60));
342
+ logger.highlight(` 🌐 Federation Server Health — ${statusEmoji} ${health.status}`);
343
+ logger.highlight('═'.repeat(60));
344
+ console.log(`\n Status: ${health.status}`);
345
+ console.log(` Uptime: ${uptimeMinutes} minutes`);
346
+ console.log(` Version: ${health.version}`);
347
+ console.log(` Active tasks: ${health.activeTasks}`);
348
+ console.log(` Completed: ${health.completedTasks}`);
349
+ console.log(` Failed: ${health.failedTasks}`);
350
+ if (health.loadAverage) {
351
+ console.log(` Load: ${health.loadAverage.map((l) => l.toFixed(2)).join(', ')}`);
352
+ }
353
+ console.log('');
354
+ }
355
+ async manageConfig(options) {
356
+ const config = loadConfig();
357
+ if (options.setSecret) {
358
+ config.secret = options.setSecret;
359
+ saveConfig(config);
360
+ logger.success('Federation secret updated.');
361
+ }
362
+ if (options.setPort) {
363
+ config.port = options.setPort;
364
+ saveConfig(config);
365
+ logger.success(`Federation port updated to ${options.setPort}.`);
366
+ }
367
+ if (options.show || (!options.setSecret && !options.setPort)) {
368
+ logger.highlight('═'.repeat(60));
369
+ logger.highlight(' ⚙️ Federation Configuration');
370
+ logger.highlight('═'.repeat(60));
371
+ console.log(`\n Enabled: ${config.enabled}`);
372
+ console.log(` Host: ${config.host}`);
373
+ console.log(` Port: ${config.port}`);
374
+ console.log(` Secret: ${config.secret ? '•'.repeat(Math.min(config.secret.length, 12)) : '⚠️ Not set'}`);
375
+ console.log(` Node ID: ${config.nodeId}`);
376
+ console.log(` Max tasks: ${config.maxConcurrentTasks}`);
377
+ console.log(` Task timeout: ${(config.taskTimeoutMs / 1000 / 60).toFixed(0)} min`);
378
+ console.log(` Capabilities: ${config.capabilities.join(', ')}`);
379
+ console.log('');
380
+ console.log(' Set a value:');
381
+ console.log(' buff federation config --set-secret <your-secret>');
382
+ console.log(' buff federation config --set-port <port>');
383
+ console.log('');
384
+ }
385
+ }
386
+ }
387
+ //# sourceMappingURL=federation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/cli/federation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * History command — Browse and search conversation history.
3
+ *
4
+ * Usage:
5
+ * buff history — Show recent conversations
6
+ * buff history list — Show all saved conversations
7
+ * buff history search <q> — Search conversations by keyword
8
+ * buff history show <id> — Show a specific conversation
9
+ * buff history clear — Clear all history
10
+ * buff history prune — Remove conversations older than 30 days
11
+ */
12
+ import { Command } from 'commander';
13
+ import { BaseCommand } from './commands.js';
14
+ export declare class HistoryCommand extends BaseCommand {
15
+ create(): Command;
16
+ private listHistory;
17
+ private searchHistory;
18
+ private showSession;
19
+ private clearHistory;
20
+ private pruneHistory;
21
+ }
22
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/cli/history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,qBAAa,cAAe,SAAQ,WAAW;IAC7C,MAAM,IAAI,OAAO;IAyDjB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,WAAW;IAwCnB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,YAAY;CAKrB"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * History command — Browse and search conversation history.
3
+ *
4
+ * Usage:
5
+ * buff history — Show recent conversations
6
+ * buff history list — Show all saved conversations
7
+ * buff history search <q> — Search conversations by keyword
8
+ * buff history show <id> — Show a specific conversation
9
+ * buff history clear — Clear all history
10
+ * buff history prune — Remove conversations older than 30 days
11
+ */
12
+ import { Command } from 'commander';
13
+ import { BaseCommand } from './commands.js';
14
+ import { getChatHistory } from '../context/history.js';
15
+ import { logger } from '../utils/logger.js';
16
+ export class HistoryCommand extends BaseCommand {
17
+ create() {
18
+ const command = new Command('history')
19
+ .description('Browse and search conversation history');
20
+ // ── list ─────────────────────────────────────────────────────────────
21
+ command
22
+ .command('list')
23
+ .description('Show all saved conversations')
24
+ .option('-l, --limit <number>', 'Maximum results to show', parseInt, 20)
25
+ .action((options) => {
26
+ this.listHistory(options?.limit || 20);
27
+ });
28
+ // ── search ───────────────────────────────────────────────────────────
29
+ command
30
+ .command('search')
31
+ .description('Search conversations by keyword')
32
+ .argument('<query>', 'Search keyword or phrase')
33
+ .option('-l, --limit <number>', 'Maximum results', parseInt, 10)
34
+ .action((query, options) => {
35
+ this.searchHistory(query, options?.limit || 10);
36
+ });
37
+ // ── show ─────────────────────────────────────────────────────────────
38
+ command
39
+ .command('show')
40
+ .description('Show a specific conversation')
41
+ .argument('<id>', 'Session ID (e.g., session-1712345678-abc123)')
42
+ .action((id) => {
43
+ this.showSession(id);
44
+ });
45
+ // ── clear ────────────────────────────────────────────────────────────
46
+ command
47
+ .command('clear')
48
+ .description('Clear all conversation history')
49
+ .action(() => {
50
+ this.clearHistory();
51
+ });
52
+ // ── prune ────────────────────────────────────────────────────────────
53
+ command
54
+ .command('prune')
55
+ .description('Remove conversations older than the retention period')
56
+ .option('-d, --days <number>', 'Retention period in days', parseInt, 30)
57
+ .action((options) => {
58
+ this.pruneHistory(options?.days || 30);
59
+ });
60
+ // Default: show recent conversations
61
+ command.action(() => {
62
+ this.listHistory(15);
63
+ });
64
+ return command;
65
+ }
66
+ listHistory(limit) {
67
+ const history = getChatHistory();
68
+ const sessions = history.getAllSessions(limit);
69
+ if (sessions.length === 0) {
70
+ logger.info('No conversation history found.');
71
+ return;
72
+ }
73
+ logger.highlight(`${'═'.repeat(60)}`);
74
+ logger.highlight(` 📝 Conversation History (${history.count()} total)`);
75
+ logger.highlight(`${'═'.repeat(60)}`);
76
+ console.log('');
77
+ for (const session of sessions) {
78
+ console.log(history.formatSessionSummary(session));
79
+ }
80
+ console.log(`\n Show a conversation: buff history show <session-id>`);
81
+ console.log('');
82
+ }
83
+ searchHistory(query, limit) {
84
+ const history = getChatHistory();
85
+ const results = history.search(query, limit);
86
+ if (results.length === 0) {
87
+ logger.info(`No conversations found matching "${query}".`);
88
+ return;
89
+ }
90
+ logger.highlight(`${'═'.repeat(60)}`);
91
+ logger.highlight(` 🔍 Search Results: "${query}" (${results.length} found)`);
92
+ logger.highlight(`${'═'.repeat(60)}`);
93
+ console.log('');
94
+ for (const session of results) {
95
+ console.log(history.formatSessionSummary(session));
96
+ }
97
+ console.log('');
98
+ }
99
+ showSession(id) {
100
+ const history = getChatHistory();
101
+ // Support partial ID matching
102
+ const sessions = history.getAllSessions(100);
103
+ const match = sessions.find((s) => s.id === id || s.id.startsWith(id) || s.id.includes(id));
104
+ if (!match) {
105
+ logger.error(`Session not found: ${id}`);
106
+ logger.info('Use `buff history list` to see available sessions.');
107
+ return;
108
+ }
109
+ const date = new Date(match.startedAt).toLocaleString();
110
+ const tags = match.tags.length > 0 ? ` [${match.tags.join(', ')}]` : '';
111
+ logger.highlight(`${'═'.repeat(60)}`);
112
+ logger.highlight(` 💬 Conversation: ${match.summary.slice(0, 50)}`);
113
+ logger.highlight(`${'═'.repeat(60)}`);
114
+ console.log(` Provider: ${match.provider} | Model: ${match.model} | Date: ${date}${tags}`);
115
+ console.log(` ${match.messages.length} messages`);
116
+ console.log('');
117
+ // Show messages (truncate long outputs)
118
+ for (const msg of match.messages) {
119
+ const prefix = msg.role === 'user' ? '👤 You:' : '🤖 AI:';
120
+ const content = msg.content.length > 500
121
+ ? msg.content.slice(0, 500) + '...\n (truncated, use buff history show <id> to see full)'
122
+ : msg.content;
123
+ console.log(` ${prefix}`);
124
+ console.log(` ${content}`);
125
+ console.log('');
126
+ }
127
+ logger.highlight(`${'═'.repeat(60)}`);
128
+ console.log('');
129
+ }
130
+ clearHistory() {
131
+ getChatHistory().clear();
132
+ logger.success('Conversation history cleared.');
133
+ }
134
+ pruneHistory(days) {
135
+ const history = getChatHistory();
136
+ const removed = history.prune(days);
137
+ logger.success(`Removed ${removed} old conversation(s) older than ${days} days.`);
138
+ }
139
+ }
140
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/cli/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Init command — Scaffold new projects from templates.
3
+ *
4
+ * Usage:
5
+ * buff init — Interactive prompt for project name and template
6
+ * buff init my-app — Create project 'my-app' with interactive template picker
7
+ * buff init my-app --template node-cli — Create from a specific template
8
+ * buff init my-app --list — List available templates
9
+ * buff init my-app --template custom --template-dir ~/my-templates
10
+ *
11
+ * Templates are stored in ~/.buff/templates/ and can be custom.
12
+ * Built-in templates ship with the CLI.
13
+ */
14
+ import { Command } from 'commander';
15
+ import { BaseCommand } from './commands.js';
16
+ export interface InitTemplate {
17
+ /** Template identifier */
18
+ id: string;
19
+ /** Human-readable name */
20
+ name: string;
21
+ /** Short description */
22
+ description: string;
23
+ /** Files to create (key = path, value = content or generator function) */
24
+ files: Record<string, string | ((projectName: string) => string)>;
25
+ /** Dependencies to add (npm packages, etc.) */
26
+ dependencies?: string[];
27
+ /** Dev dependencies */
28
+ devDependencies?: string[];
29
+ /** Post-creation instructions */
30
+ postInstall?: string[];
31
+ }
32
+ export declare class InitCommand extends BaseCommand {
33
+ create(): Command;
34
+ private execute;
35
+ private listTemplates;
36
+ /**
37
+ * Get all available templates (built-in + custom from ~/.buff/templates/).
38
+ */
39
+ private getAllTemplates;
40
+ /**
41
+ * Find a template by ID (searches built-in first, then custom).
42
+ */
43
+ private findTemplate;
44
+ /**
45
+ * Print the project structure recursively.
46
+ */
47
+ private printStructure;
48
+ }
49
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAM5C,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;IAClE,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,uBAAuB;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAoLD,qBAAa,WAAY,SAAQ,WAAW;IAC1C,MAAM,IAAI,OAAO;YAsBH,OAAO;IAiKrB,OAAO,CAAC,aAAa;IAuBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,cAAc;CAavB"}