@hasna/connectors 0.9.2 → 0.9.3

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 (454) hide show
  1. package/bin/index.js +176 -1
  2. package/bin/mcp.js +176 -1
  3. package/bin/serve.js +175 -0
  4. package/connectors/connect-embedai/.env.example +11 -0
  5. package/connectors/connect-embedai/CLAUDE.md +272 -0
  6. package/connectors/connect-embedai/README.md +193 -0
  7. package/connectors/connect-embedai/package.json +52 -0
  8. package/connectors/connect-embedai/scripts/release.ts +179 -0
  9. package/connectors/connect-embedai/src/api/client.ts +213 -0
  10. package/connectors/connect-embedai/src/api/example.ts +48 -0
  11. package/connectors/connect-embedai/src/api/index.ts +51 -0
  12. package/connectors/connect-embedai/src/cli/index.ts +254 -0
  13. package/connectors/connect-embedai/src/index.ts +103 -0
  14. package/connectors/connect-embedai/src/types/index.ts +237 -0
  15. package/connectors/connect-embedai/src/utils/auth.ts +274 -0
  16. package/connectors/connect-embedai/src/utils/bulk.ts +212 -0
  17. package/connectors/connect-embedai/src/utils/config.ts +326 -0
  18. package/connectors/connect-embedai/src/utils/output.ts +175 -0
  19. package/connectors/connect-embedai/src/utils/settings.ts +114 -0
  20. package/connectors/connect-embedai/src/utils/storage.ts +198 -0
  21. package/connectors/connect-embedai/tsconfig.json +16 -0
  22. package/connectors/connect-emelia/.env.example +11 -0
  23. package/connectors/connect-emelia/CLAUDE.md +272 -0
  24. package/connectors/connect-emelia/README.md +193 -0
  25. package/connectors/connect-emelia/package.json +52 -0
  26. package/connectors/connect-emelia/scripts/release.ts +179 -0
  27. package/connectors/connect-emelia/src/api/client.ts +213 -0
  28. package/connectors/connect-emelia/src/api/example.ts +48 -0
  29. package/connectors/connect-emelia/src/api/index.ts +51 -0
  30. package/connectors/connect-emelia/src/cli/index.ts +254 -0
  31. package/connectors/connect-emelia/src/index.ts +103 -0
  32. package/connectors/connect-emelia/src/types/index.ts +237 -0
  33. package/connectors/connect-emelia/src/utils/auth.ts +274 -0
  34. package/connectors/connect-emelia/src/utils/bulk.ts +212 -0
  35. package/connectors/connect-emelia/src/utils/config.ts +326 -0
  36. package/connectors/connect-emelia/src/utils/output.ts +175 -0
  37. package/connectors/connect-emelia/src/utils/settings.ts +114 -0
  38. package/connectors/connect-emelia/src/utils/storage.ts +198 -0
  39. package/connectors/connect-emelia/tsconfig.json +16 -0
  40. package/connectors/connect-empsing/.env.example +11 -0
  41. package/connectors/connect-empsing/CLAUDE.md +272 -0
  42. package/connectors/connect-empsing/README.md +193 -0
  43. package/connectors/connect-empsing/package.json +50 -0
  44. package/connectors/connect-empsing/scripts/release.ts +179 -0
  45. package/connectors/connect-empsing/src/api/client.ts +213 -0
  46. package/connectors/connect-empsing/src/api/example.ts +48 -0
  47. package/connectors/connect-empsing/src/api/index.ts +51 -0
  48. package/connectors/connect-empsing/src/cli/index.ts +254 -0
  49. package/connectors/connect-empsing/src/index.ts +103 -0
  50. package/connectors/connect-empsing/src/types/index.ts +237 -0
  51. package/connectors/connect-empsing/src/utils/auth.ts +274 -0
  52. package/connectors/connect-empsing/src/utils/bulk.ts +212 -0
  53. package/connectors/connect-empsing/src/utils/config.ts +326 -0
  54. package/connectors/connect-empsing/src/utils/output.ts +175 -0
  55. package/connectors/connect-empsing/src/utils/settings.ts +114 -0
  56. package/connectors/connect-empsing/src/utils/storage.ts +198 -0
  57. package/connectors/connect-empsing/tsconfig.json +16 -0
  58. package/connectors/connect-engati/.env.example +11 -0
  59. package/connectors/connect-engati/CLAUDE.md +272 -0
  60. package/connectors/connect-engati/README.md +193 -0
  61. package/connectors/connect-engati/package.json +52 -0
  62. package/connectors/connect-engati/scripts/release.ts +179 -0
  63. package/connectors/connect-engati/src/api/client.ts +213 -0
  64. package/connectors/connect-engati/src/api/example.ts +48 -0
  65. package/connectors/connect-engati/src/api/index.ts +51 -0
  66. package/connectors/connect-engati/src/cli/index.ts +254 -0
  67. package/connectors/connect-engati/src/index.ts +103 -0
  68. package/connectors/connect-engati/src/types/index.ts +237 -0
  69. package/connectors/connect-engati/src/utils/auth.ts +274 -0
  70. package/connectors/connect-engati/src/utils/bulk.ts +212 -0
  71. package/connectors/connect-engati/src/utils/config.ts +326 -0
  72. package/connectors/connect-engati/src/utils/output.ts +175 -0
  73. package/connectors/connect-engati/src/utils/settings.ts +114 -0
  74. package/connectors/connect-engati/src/utils/storage.ts +198 -0
  75. package/connectors/connect-engati/tsconfig.json +16 -0
  76. package/connectors/connect-enormail/.env.example +11 -0
  77. package/connectors/connect-enormail/CLAUDE.md +272 -0
  78. package/connectors/connect-enormail/README.md +193 -0
  79. package/connectors/connect-enormail/package.json +52 -0
  80. package/connectors/connect-enormail/scripts/release.ts +179 -0
  81. package/connectors/connect-enormail/src/api/client.ts +213 -0
  82. package/connectors/connect-enormail/src/api/example.ts +48 -0
  83. package/connectors/connect-enormail/src/api/index.ts +51 -0
  84. package/connectors/connect-enormail/src/cli/index.ts +254 -0
  85. package/connectors/connect-enormail/src/index.ts +103 -0
  86. package/connectors/connect-enormail/src/types/index.ts +237 -0
  87. package/connectors/connect-enormail/src/utils/auth.ts +274 -0
  88. package/connectors/connect-enormail/src/utils/bulk.ts +212 -0
  89. package/connectors/connect-enormail/src/utils/config.ts +326 -0
  90. package/connectors/connect-enormail/src/utils/output.ts +175 -0
  91. package/connectors/connect-enormail/src/utils/settings.ts +114 -0
  92. package/connectors/connect-enormail/src/utils/storage.ts +198 -0
  93. package/connectors/connect-enormail/tsconfig.json +16 -0
  94. package/connectors/connect-enterpret/.env.example +11 -0
  95. package/connectors/connect-enterpret/CLAUDE.md +272 -0
  96. package/connectors/connect-enterpret/README.md +193 -0
  97. package/connectors/connect-enterpret/package.json +52 -0
  98. package/connectors/connect-enterpret/scripts/release.ts +179 -0
  99. package/connectors/connect-enterpret/src/api/client.ts +213 -0
  100. package/connectors/connect-enterpret/src/api/example.ts +48 -0
  101. package/connectors/connect-enterpret/src/api/index.ts +51 -0
  102. package/connectors/connect-enterpret/src/cli/index.ts +254 -0
  103. package/connectors/connect-enterpret/src/index.ts +103 -0
  104. package/connectors/connect-enterpret/src/types/index.ts +237 -0
  105. package/connectors/connect-enterpret/src/utils/auth.ts +274 -0
  106. package/connectors/connect-enterpret/src/utils/bulk.ts +212 -0
  107. package/connectors/connect-enterpret/src/utils/config.ts +326 -0
  108. package/connectors/connect-enterpret/src/utils/output.ts +175 -0
  109. package/connectors/connect-enterpret/src/utils/settings.ts +114 -0
  110. package/connectors/connect-enterpret/src/utils/storage.ts +198 -0
  111. package/connectors/connect-enterpret/tsconfig.json +16 -0
  112. package/connectors/connect-envoy/.env.example +11 -0
  113. package/connectors/connect-envoy/CLAUDE.md +272 -0
  114. package/connectors/connect-envoy/README.md +193 -0
  115. package/connectors/connect-envoy/package.json +52 -0
  116. package/connectors/connect-envoy/scripts/release.ts +179 -0
  117. package/connectors/connect-envoy/src/api/client.ts +213 -0
  118. package/connectors/connect-envoy/src/api/example.ts +48 -0
  119. package/connectors/connect-envoy/src/api/index.ts +51 -0
  120. package/connectors/connect-envoy/src/cli/index.ts +254 -0
  121. package/connectors/connect-envoy/src/index.ts +103 -0
  122. package/connectors/connect-envoy/src/types/index.ts +237 -0
  123. package/connectors/connect-envoy/src/utils/auth.ts +274 -0
  124. package/connectors/connect-envoy/src/utils/bulk.ts +212 -0
  125. package/connectors/connect-envoy/src/utils/config.ts +326 -0
  126. package/connectors/connect-envoy/src/utils/output.ts +175 -0
  127. package/connectors/connect-envoy/src/utils/settings.ts +114 -0
  128. package/connectors/connect-envoy/src/utils/storage.ts +198 -0
  129. package/connectors/connect-envoy/tsconfig.json +16 -0
  130. package/connectors/connect-epo/.env.example +8 -0
  131. package/connectors/connect-epo/CLAUDE.md +225 -0
  132. package/connectors/connect-epo/README.md +259 -0
  133. package/connectors/connect-epo/package.json +52 -0
  134. package/connectors/connect-epo/src/api/classification.ts +226 -0
  135. package/connectors/connect-epo/src/api/client.ts +233 -0
  136. package/connectors/connect-epo/src/api/family.ts +210 -0
  137. package/connectors/connect-epo/src/api/index.ts +97 -0
  138. package/connectors/connect-epo/src/api/legal.ts +163 -0
  139. package/connectors/connect-epo/src/api/publications.ts +383 -0
  140. package/connectors/connect-epo/src/api/register.ts +434 -0
  141. package/connectors/connect-epo/src/cli/index.ts +708 -0
  142. package/connectors/connect-epo/src/index.ts +25 -0
  143. package/connectors/connect-epo/src/types/index.ts +372 -0
  144. package/connectors/connect-epo/src/utils/config.ts +251 -0
  145. package/connectors/connect-epo/src/utils/output.ts +119 -0
  146. package/connectors/connect-epo/tsconfig.json +16 -0
  147. package/connectors/connect-erpnext/.env.example +11 -0
  148. package/connectors/connect-erpnext/CLAUDE.md +272 -0
  149. package/connectors/connect-erpnext/README.md +193 -0
  150. package/connectors/connect-erpnext/package.json +52 -0
  151. package/connectors/connect-erpnext/scripts/release.ts +179 -0
  152. package/connectors/connect-erpnext/src/api/client.ts +213 -0
  153. package/connectors/connect-erpnext/src/api/example.ts +48 -0
  154. package/connectors/connect-erpnext/src/api/index.ts +51 -0
  155. package/connectors/connect-erpnext/src/cli/index.ts +254 -0
  156. package/connectors/connect-erpnext/src/index.ts +103 -0
  157. package/connectors/connect-erpnext/src/types/index.ts +237 -0
  158. package/connectors/connect-erpnext/src/utils/auth.ts +274 -0
  159. package/connectors/connect-erpnext/src/utils/bulk.ts +212 -0
  160. package/connectors/connect-erpnext/src/utils/config.ts +326 -0
  161. package/connectors/connect-erpnext/src/utils/output.ts +175 -0
  162. package/connectors/connect-erpnext/src/utils/settings.ts +114 -0
  163. package/connectors/connect-erpnext/src/utils/storage.ts +198 -0
  164. package/connectors/connect-erpnext/tsconfig.json +16 -0
  165. package/connectors/connect-esendex/.env.example +11 -0
  166. package/connectors/connect-esendex/CLAUDE.md +272 -0
  167. package/connectors/connect-esendex/README.md +193 -0
  168. package/connectors/connect-esendex/package.json +52 -0
  169. package/connectors/connect-esendex/scripts/release.ts +179 -0
  170. package/connectors/connect-esendex/src/api/client.ts +213 -0
  171. package/connectors/connect-esendex/src/api/example.ts +48 -0
  172. package/connectors/connect-esendex/src/api/index.ts +51 -0
  173. package/connectors/connect-esendex/src/cli/index.ts +254 -0
  174. package/connectors/connect-esendex/src/index.ts +103 -0
  175. package/connectors/connect-esendex/src/types/index.ts +237 -0
  176. package/connectors/connect-esendex/src/utils/auth.ts +274 -0
  177. package/connectors/connect-esendex/src/utils/bulk.ts +212 -0
  178. package/connectors/connect-esendex/src/utils/config.ts +326 -0
  179. package/connectors/connect-esendex/src/utils/output.ts +175 -0
  180. package/connectors/connect-esendex/src/utils/settings.ts +114 -0
  181. package/connectors/connect-esendex/src/utils/storage.ts +198 -0
  182. package/connectors/connect-esendex/tsconfig.json +16 -0
  183. package/connectors/connect-evervault/.env.example +11 -0
  184. package/connectors/connect-evervault/CLAUDE.md +272 -0
  185. package/connectors/connect-evervault/README.md +193 -0
  186. package/connectors/connect-evervault/package.json +51 -0
  187. package/connectors/connect-evervault/scripts/release.ts +179 -0
  188. package/connectors/connect-evervault/src/api/client.ts +213 -0
  189. package/connectors/connect-evervault/src/api/example.ts +48 -0
  190. package/connectors/connect-evervault/src/api/index.ts +51 -0
  191. package/connectors/connect-evervault/src/cli/index.ts +254 -0
  192. package/connectors/connect-evervault/src/index.ts +103 -0
  193. package/connectors/connect-evervault/src/types/index.ts +237 -0
  194. package/connectors/connect-evervault/src/utils/auth.ts +274 -0
  195. package/connectors/connect-evervault/src/utils/bulk.ts +212 -0
  196. package/connectors/connect-evervault/src/utils/config.ts +326 -0
  197. package/connectors/connect-evervault/src/utils/output.ts +175 -0
  198. package/connectors/connect-evervault/src/utils/settings.ts +114 -0
  199. package/connectors/connect-evervault/src/utils/storage.ts +198 -0
  200. package/connectors/connect-evervault/tsconfig.json +16 -0
  201. package/connectors/connect-evolphinzoom/.env.example +11 -0
  202. package/connectors/connect-evolphinzoom/CLAUDE.md +272 -0
  203. package/connectors/connect-evolphinzoom/README.md +193 -0
  204. package/connectors/connect-evolphinzoom/package.json +51 -0
  205. package/connectors/connect-evolphinzoom/scripts/release.ts +179 -0
  206. package/connectors/connect-evolphinzoom/src/api/client.ts +213 -0
  207. package/connectors/connect-evolphinzoom/src/api/example.ts +48 -0
  208. package/connectors/connect-evolphinzoom/src/api/index.ts +51 -0
  209. package/connectors/connect-evolphinzoom/src/cli/index.ts +254 -0
  210. package/connectors/connect-evolphinzoom/src/index.ts +103 -0
  211. package/connectors/connect-evolphinzoom/src/types/index.ts +237 -0
  212. package/connectors/connect-evolphinzoom/src/utils/auth.ts +274 -0
  213. package/connectors/connect-evolphinzoom/src/utils/bulk.ts +212 -0
  214. package/connectors/connect-evolphinzoom/src/utils/config.ts +326 -0
  215. package/connectors/connect-evolphinzoom/src/utils/output.ts +175 -0
  216. package/connectors/connect-evolphinzoom/src/utils/settings.ts +114 -0
  217. package/connectors/connect-evolphinzoom/src/utils/storage.ts +198 -0
  218. package/connectors/connect-evolphinzoom/tsconfig.json +16 -0
  219. package/connectors/connect-f5bigip/.env.example +11 -0
  220. package/connectors/connect-f5bigip/CLAUDE.md +272 -0
  221. package/connectors/connect-f5bigip/README.md +193 -0
  222. package/connectors/connect-f5bigip/package.json +51 -0
  223. package/connectors/connect-f5bigip/scripts/release.ts +179 -0
  224. package/connectors/connect-f5bigip/src/api/client.ts +213 -0
  225. package/connectors/connect-f5bigip/src/api/example.ts +48 -0
  226. package/connectors/connect-f5bigip/src/api/index.ts +51 -0
  227. package/connectors/connect-f5bigip/src/cli/index.ts +254 -0
  228. package/connectors/connect-f5bigip/src/index.ts +103 -0
  229. package/connectors/connect-f5bigip/src/types/index.ts +237 -0
  230. package/connectors/connect-f5bigip/src/utils/auth.ts +274 -0
  231. package/connectors/connect-f5bigip/src/utils/bulk.ts +212 -0
  232. package/connectors/connect-f5bigip/src/utils/config.ts +326 -0
  233. package/connectors/connect-f5bigip/src/utils/output.ts +175 -0
  234. package/connectors/connect-f5bigip/src/utils/settings.ts +114 -0
  235. package/connectors/connect-f5bigip/src/utils/storage.ts +198 -0
  236. package/connectors/connect-f5bigip/tsconfig.json +16 -0
  237. package/connectors/connect-faraday/.env.example +11 -0
  238. package/connectors/connect-faraday/CLAUDE.md +272 -0
  239. package/connectors/connect-faraday/README.md +193 -0
  240. package/connectors/connect-faraday/package.json +51 -0
  241. package/connectors/connect-faraday/scripts/release.ts +179 -0
  242. package/connectors/connect-faraday/src/api/client.ts +213 -0
  243. package/connectors/connect-faraday/src/api/example.ts +48 -0
  244. package/connectors/connect-faraday/src/api/index.ts +51 -0
  245. package/connectors/connect-faraday/src/cli/index.ts +254 -0
  246. package/connectors/connect-faraday/src/index.ts +103 -0
  247. package/connectors/connect-faraday/src/types/index.ts +237 -0
  248. package/connectors/connect-faraday/src/utils/auth.ts +274 -0
  249. package/connectors/connect-faraday/src/utils/bulk.ts +212 -0
  250. package/connectors/connect-faraday/src/utils/config.ts +326 -0
  251. package/connectors/connect-faraday/src/utils/output.ts +175 -0
  252. package/connectors/connect-faraday/src/utils/settings.ts +114 -0
  253. package/connectors/connect-faraday/src/utils/storage.ts +198 -0
  254. package/connectors/connect-faraday/tsconfig.json +16 -0
  255. package/connectors/connect-faros/.env.example +11 -0
  256. package/connectors/connect-faros/CLAUDE.md +272 -0
  257. package/connectors/connect-faros/README.md +193 -0
  258. package/connectors/connect-faros/package.json +51 -0
  259. package/connectors/connect-faros/scripts/release.ts +179 -0
  260. package/connectors/connect-faros/src/api/client.ts +213 -0
  261. package/connectors/connect-faros/src/api/example.ts +48 -0
  262. package/connectors/connect-faros/src/api/index.ts +51 -0
  263. package/connectors/connect-faros/src/cli/index.ts +254 -0
  264. package/connectors/connect-faros/src/index.ts +103 -0
  265. package/connectors/connect-faros/src/types/index.ts +237 -0
  266. package/connectors/connect-faros/src/utils/auth.ts +274 -0
  267. package/connectors/connect-faros/src/utils/bulk.ts +212 -0
  268. package/connectors/connect-faros/src/utils/config.ts +326 -0
  269. package/connectors/connect-faros/src/utils/output.ts +175 -0
  270. package/connectors/connect-faros/src/utils/settings.ts +114 -0
  271. package/connectors/connect-faros/src/utils/storage.ts +198 -0
  272. package/connectors/connect-faros/tsconfig.json +16 -0
  273. package/connectors/connect-fastbots/.env.example +11 -0
  274. package/connectors/connect-fastbots/CLAUDE.md +272 -0
  275. package/connectors/connect-fastbots/README.md +193 -0
  276. package/connectors/connect-fastbots/package.json +51 -0
  277. package/connectors/connect-fastbots/scripts/release.ts +179 -0
  278. package/connectors/connect-fastbots/src/api/client.ts +213 -0
  279. package/connectors/connect-fastbots/src/api/example.ts +48 -0
  280. package/connectors/connect-fastbots/src/api/index.ts +51 -0
  281. package/connectors/connect-fastbots/src/cli/index.ts +254 -0
  282. package/connectors/connect-fastbots/src/index.ts +103 -0
  283. package/connectors/connect-fastbots/src/types/index.ts +237 -0
  284. package/connectors/connect-fastbots/src/utils/auth.ts +274 -0
  285. package/connectors/connect-fastbots/src/utils/bulk.ts +212 -0
  286. package/connectors/connect-fastbots/src/utils/config.ts +326 -0
  287. package/connectors/connect-fastbots/src/utils/output.ts +175 -0
  288. package/connectors/connect-fastbots/src/utils/settings.ts +114 -0
  289. package/connectors/connect-fastbots/src/utils/storage.ts +198 -0
  290. package/connectors/connect-fastbots/tsconfig.json +16 -0
  291. package/connectors/connect-filemaker/.env.example +11 -0
  292. package/connectors/connect-filemaker/CLAUDE.md +272 -0
  293. package/connectors/connect-filemaker/README.md +193 -0
  294. package/connectors/connect-filemaker/package.json +51 -0
  295. package/connectors/connect-filemaker/scripts/release.ts +179 -0
  296. package/connectors/connect-filemaker/src/api/client.ts +213 -0
  297. package/connectors/connect-filemaker/src/api/example.ts +48 -0
  298. package/connectors/connect-filemaker/src/api/index.ts +51 -0
  299. package/connectors/connect-filemaker/src/cli/index.ts +254 -0
  300. package/connectors/connect-filemaker/src/index.ts +103 -0
  301. package/connectors/connect-filemaker/src/types/index.ts +237 -0
  302. package/connectors/connect-filemaker/src/utils/auth.ts +274 -0
  303. package/connectors/connect-filemaker/src/utils/bulk.ts +212 -0
  304. package/connectors/connect-filemaker/src/utils/config.ts +326 -0
  305. package/connectors/connect-filemaker/src/utils/output.ts +175 -0
  306. package/connectors/connect-filemaker/src/utils/settings.ts +114 -0
  307. package/connectors/connect-filemaker/src/utils/storage.ts +198 -0
  308. package/connectors/connect-filemaker/tsconfig.json +16 -0
  309. package/connectors/connect-filescan/.env.example +11 -0
  310. package/connectors/connect-filescan/CLAUDE.md +272 -0
  311. package/connectors/connect-filescan/README.md +193 -0
  312. package/connectors/connect-filescan/package.json +51 -0
  313. package/connectors/connect-filescan/scripts/release.ts +179 -0
  314. package/connectors/connect-filescan/src/api/client.ts +213 -0
  315. package/connectors/connect-filescan/src/api/example.ts +48 -0
  316. package/connectors/connect-filescan/src/api/index.ts +51 -0
  317. package/connectors/connect-filescan/src/cli/index.ts +254 -0
  318. package/connectors/connect-filescan/src/index.ts +103 -0
  319. package/connectors/connect-filescan/src/types/index.ts +237 -0
  320. package/connectors/connect-filescan/src/utils/auth.ts +274 -0
  321. package/connectors/connect-filescan/src/utils/bulk.ts +212 -0
  322. package/connectors/connect-filescan/src/utils/config.ts +326 -0
  323. package/connectors/connect-filescan/src/utils/output.ts +175 -0
  324. package/connectors/connect-filescan/src/utils/settings.ts +114 -0
  325. package/connectors/connect-filescan/src/utils/storage.ts +198 -0
  326. package/connectors/connect-filescan/tsconfig.json +16 -0
  327. package/connectors/connect-firmao/.env.example +11 -0
  328. package/connectors/connect-firmao/CLAUDE.md +272 -0
  329. package/connectors/connect-firmao/README.md +193 -0
  330. package/connectors/connect-firmao/package.json +51 -0
  331. package/connectors/connect-firmao/scripts/release.ts +179 -0
  332. package/connectors/connect-firmao/src/api/client.ts +213 -0
  333. package/connectors/connect-firmao/src/api/example.ts +48 -0
  334. package/connectors/connect-firmao/src/api/index.ts +51 -0
  335. package/connectors/connect-firmao/src/cli/index.ts +254 -0
  336. package/connectors/connect-firmao/src/index.ts +103 -0
  337. package/connectors/connect-firmao/src/types/index.ts +237 -0
  338. package/connectors/connect-firmao/src/utils/auth.ts +274 -0
  339. package/connectors/connect-firmao/src/utils/bulk.ts +212 -0
  340. package/connectors/connect-firmao/src/utils/config.ts +326 -0
  341. package/connectors/connect-firmao/src/utils/output.ts +175 -0
  342. package/connectors/connect-firmao/src/utils/settings.ts +114 -0
  343. package/connectors/connect-firmao/src/utils/storage.ts +198 -0
  344. package/connectors/connect-firmao/tsconfig.json +16 -0
  345. package/connectors/connect-fitbit/.env.example +11 -0
  346. package/connectors/connect-fitbit/CLAUDE.md +272 -0
  347. package/connectors/connect-fitbit/README.md +193 -0
  348. package/connectors/connect-fitbit/package.json +51 -0
  349. package/connectors/connect-fitbit/scripts/release.ts +179 -0
  350. package/connectors/connect-fitbit/src/api/client.ts +213 -0
  351. package/connectors/connect-fitbit/src/api/example.ts +48 -0
  352. package/connectors/connect-fitbit/src/api/index.ts +51 -0
  353. package/connectors/connect-fitbit/src/cli/index.ts +254 -0
  354. package/connectors/connect-fitbit/src/index.ts +103 -0
  355. package/connectors/connect-fitbit/src/types/index.ts +237 -0
  356. package/connectors/connect-fitbit/src/utils/auth.ts +274 -0
  357. package/connectors/connect-fitbit/src/utils/bulk.ts +212 -0
  358. package/connectors/connect-fitbit/src/utils/config.ts +326 -0
  359. package/connectors/connect-fitbit/src/utils/output.ts +175 -0
  360. package/connectors/connect-fitbit/src/utils/settings.ts +114 -0
  361. package/connectors/connect-fitbit/src/utils/storage.ts +198 -0
  362. package/connectors/connect-fitbit/tsconfig.json +16 -0
  363. package/connectors/connect-flagship/.env.example +11 -0
  364. package/connectors/connect-flagship/CLAUDE.md +272 -0
  365. package/connectors/connect-flagship/README.md +193 -0
  366. package/connectors/connect-flagship/package.json +51 -0
  367. package/connectors/connect-flagship/scripts/release.ts +179 -0
  368. package/connectors/connect-flagship/src/api/client.ts +213 -0
  369. package/connectors/connect-flagship/src/api/example.ts +48 -0
  370. package/connectors/connect-flagship/src/api/index.ts +51 -0
  371. package/connectors/connect-flagship/src/cli/index.ts +254 -0
  372. package/connectors/connect-flagship/src/index.ts +103 -0
  373. package/connectors/connect-flagship/src/types/index.ts +237 -0
  374. package/connectors/connect-flagship/src/utils/auth.ts +274 -0
  375. package/connectors/connect-flagship/src/utils/bulk.ts +212 -0
  376. package/connectors/connect-flagship/src/utils/config.ts +326 -0
  377. package/connectors/connect-flagship/src/utils/output.ts +175 -0
  378. package/connectors/connect-flagship/src/utils/settings.ts +114 -0
  379. package/connectors/connect-flagship/src/utils/storage.ts +198 -0
  380. package/connectors/connect-flagship/tsconfig.json +16 -0
  381. package/connectors/connect-float/.env.example +11 -0
  382. package/connectors/connect-float/CLAUDE.md +272 -0
  383. package/connectors/connect-float/README.md +193 -0
  384. package/connectors/connect-float/package.json +51 -0
  385. package/connectors/connect-float/scripts/release.ts +179 -0
  386. package/connectors/connect-float/src/api/client.ts +213 -0
  387. package/connectors/connect-float/src/api/example.ts +48 -0
  388. package/connectors/connect-float/src/api/index.ts +51 -0
  389. package/connectors/connect-float/src/cli/index.ts +254 -0
  390. package/connectors/connect-float/src/index.ts +103 -0
  391. package/connectors/connect-float/src/types/index.ts +237 -0
  392. package/connectors/connect-float/src/utils/auth.ts +274 -0
  393. package/connectors/connect-float/src/utils/bulk.ts +212 -0
  394. package/connectors/connect-float/src/utils/config.ts +326 -0
  395. package/connectors/connect-float/src/utils/output.ts +175 -0
  396. package/connectors/connect-float/src/utils/settings.ts +114 -0
  397. package/connectors/connect-float/src/utils/storage.ts +198 -0
  398. package/connectors/connect-float/tsconfig.json +16 -0
  399. package/connectors/connect-flotiq/.env.example +11 -0
  400. package/connectors/connect-flotiq/CLAUDE.md +272 -0
  401. package/connectors/connect-flotiq/README.md +193 -0
  402. package/connectors/connect-flotiq/package.json +51 -0
  403. package/connectors/connect-flotiq/scripts/release.ts +179 -0
  404. package/connectors/connect-flotiq/src/api/client.ts +213 -0
  405. package/connectors/connect-flotiq/src/api/example.ts +48 -0
  406. package/connectors/connect-flotiq/src/api/index.ts +51 -0
  407. package/connectors/connect-flotiq/src/cli/index.ts +254 -0
  408. package/connectors/connect-flotiq/src/index.ts +103 -0
  409. package/connectors/connect-flotiq/src/types/index.ts +237 -0
  410. package/connectors/connect-flotiq/src/utils/auth.ts +274 -0
  411. package/connectors/connect-flotiq/src/utils/bulk.ts +212 -0
  412. package/connectors/connect-flotiq/src/utils/config.ts +326 -0
  413. package/connectors/connect-flotiq/src/utils/output.ts +175 -0
  414. package/connectors/connect-flotiq/src/utils/settings.ts +114 -0
  415. package/connectors/connect-flotiq/src/utils/storage.ts +198 -0
  416. package/connectors/connect-flotiq/tsconfig.json +16 -0
  417. package/connectors/connect-flow/.env.example +11 -0
  418. package/connectors/connect-flow/CLAUDE.md +272 -0
  419. package/connectors/connect-flow/README.md +193 -0
  420. package/connectors/connect-flow/package.json +51 -0
  421. package/connectors/connect-flow/scripts/release.ts +179 -0
  422. package/connectors/connect-flow/src/api/client.ts +213 -0
  423. package/connectors/connect-flow/src/api/example.ts +48 -0
  424. package/connectors/connect-flow/src/api/index.ts +51 -0
  425. package/connectors/connect-flow/src/cli/index.ts +254 -0
  426. package/connectors/connect-flow/src/index.ts +103 -0
  427. package/connectors/connect-flow/src/types/index.ts +237 -0
  428. package/connectors/connect-flow/src/utils/auth.ts +274 -0
  429. package/connectors/connect-flow/src/utils/bulk.ts +212 -0
  430. package/connectors/connect-flow/src/utils/config.ts +326 -0
  431. package/connectors/connect-flow/src/utils/output.ts +175 -0
  432. package/connectors/connect-flow/src/utils/settings.ts +114 -0
  433. package/connectors/connect-flow/src/utils/storage.ts +198 -0
  434. package/connectors/connect-flow/tsconfig.json +16 -0
  435. package/connectors/connect-fluentsupport/.env.example +11 -0
  436. package/connectors/connect-fluentsupport/CLAUDE.md +272 -0
  437. package/connectors/connect-fluentsupport/README.md +193 -0
  438. package/connectors/connect-fluentsupport/package.json +52 -0
  439. package/connectors/connect-fluentsupport/scripts/release.ts +179 -0
  440. package/connectors/connect-fluentsupport/src/api/client.ts +213 -0
  441. package/connectors/connect-fluentsupport/src/api/example.ts +48 -0
  442. package/connectors/connect-fluentsupport/src/api/index.ts +51 -0
  443. package/connectors/connect-fluentsupport/src/cli/index.ts +254 -0
  444. package/connectors/connect-fluentsupport/src/index.ts +103 -0
  445. package/connectors/connect-fluentsupport/src/types/index.ts +237 -0
  446. package/connectors/connect-fluentsupport/src/utils/auth.ts +274 -0
  447. package/connectors/connect-fluentsupport/src/utils/bulk.ts +212 -0
  448. package/connectors/connect-fluentsupport/src/utils/config.ts +326 -0
  449. package/connectors/connect-fluentsupport/src/utils/output.ts +175 -0
  450. package/connectors/connect-fluentsupport/src/utils/settings.ts +114 -0
  451. package/connectors/connect-fluentsupport/src/utils/storage.ts +198 -0
  452. package/connectors/connect-fluentsupport/tsconfig.json +16 -0
  453. package/dist/index.js +175 -0
  454. package/package.json +1 -1
@@ -0,0 +1,708 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { EPO } from '../api';
5
+ import {
6
+ getConsumerKey,
7
+ getConsumerSecret,
8
+ setCredentials,
9
+ getBaseUrl,
10
+ clearConfig,
11
+ getConfigDir,
12
+ setProfileOverride,
13
+ getCurrentProfile,
14
+ setCurrentProfile,
15
+ listProfiles,
16
+ createProfile,
17
+ deleteProfile,
18
+ profileExists,
19
+ loadProfile,
20
+ clearToken,
21
+ } from '../utils/config';
22
+ import type { OutputFormat } from '../utils/output';
23
+ import { success, error, info, print, warn } from '../utils/output';
24
+ import type { DocumentType, DocumentFormat } from '../types';
25
+
26
+ const CONNECTOR_NAME = 'connect-epo';
27
+ const VERSION = '0.0.1';
28
+
29
+ const program = new Command();
30
+
31
+ program
32
+ .name(CONNECTOR_NAME)
33
+ .description('EPO Open Patent Services (OPS) API connector - Search and retrieve patent data')
34
+ .version(VERSION)
35
+ .option('-f, --format <format>', 'Output format (json, pretty)', 'pretty')
36
+ .option('-p, --profile <profile>', 'Use a specific profile')
37
+ .hook('preAction', (thisCommand) => {
38
+ const opts = thisCommand.opts();
39
+ // Set profile override before any command runs
40
+ if (opts.profile) {
41
+ if (!profileExists(opts.profile)) {
42
+ error(`Profile "${opts.profile}" does not exist. Create it with "${CONNECTOR_NAME} profile create ${opts.profile}"`);
43
+ process.exit(1);
44
+ }
45
+ setProfileOverride(opts.profile);
46
+ }
47
+ });
48
+
49
+ // Helper to get root command format
50
+ function getRootFormat(): OutputFormat {
51
+ return (program.opts().format || 'pretty') as OutputFormat;
52
+ }
53
+
54
+ // Helper to get authenticated client
55
+ function getClient(): EPO {
56
+ const consumerKey = getConsumerKey();
57
+ const consumerSecret = getConsumerSecret();
58
+ if (!consumerKey || !consumerSecret) {
59
+ error(`No credentials configured. Run "${CONNECTOR_NAME} config set-credentials <key> <secret>" or set EPO_CONSUMER_KEY and EPO_CONSUMER_SECRET environment variables.`);
60
+ process.exit(1);
61
+ }
62
+ const baseUrl = getBaseUrl();
63
+ return new EPO({ consumerKey, consumerSecret, baseUrl });
64
+ }
65
+
66
+ // Helper to parse document reference
67
+ function parseDocRef(input: string): { type: DocumentType; format: DocumentFormat; number: string } {
68
+ // Default to publication/epodoc
69
+ return {
70
+ type: 'publication',
71
+ format: 'epodoc',
72
+ number: input,
73
+ };
74
+ }
75
+
76
+ // ============================================
77
+ // Search Command
78
+ // ============================================
79
+ program
80
+ .command('search <query>')
81
+ .description('Search published patents using CQL query (e.g., "ti=solar AND pa=tesla")')
82
+ .option('--range <range>', 'Result range (e.g., "1-25")', '1-25')
83
+ .action(async (query: string, opts) => {
84
+ try {
85
+ const client = getClient();
86
+
87
+ const [begin, end] = opts.range.split('-').map((n: string) => parseInt(n));
88
+
89
+ const result = await client.publications.search(query, {
90
+ rangeBegin: begin,
91
+ rangeEnd: end,
92
+ });
93
+
94
+ if (result.success) {
95
+ success(`Found ${result.totalResults || 0} results`);
96
+ print(result.results, getRootFormat());
97
+ } else {
98
+ error(result.error || 'Search failed');
99
+ process.exit(1);
100
+ }
101
+ } catch (err) {
102
+ error(String(err));
103
+ process.exit(1);
104
+ }
105
+ });
106
+
107
+ // ============================================
108
+ // Publication Commands
109
+ // ============================================
110
+ const pubCmd = program
111
+ .command('publication')
112
+ .alias('pub')
113
+ .description('Get publication data');
114
+
115
+ pubCmd
116
+ .command('get <number>')
117
+ .description('Get publication by document number')
118
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
119
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
120
+ .action(async (number: string, opts) => {
121
+ try {
122
+ const client = getClient();
123
+ const result = await client.publications.getPublication(
124
+ opts.type as DocumentType,
125
+ opts.format as DocumentFormat,
126
+ number
127
+ );
128
+
129
+ if (result.success) {
130
+ success('Publication retrieved');
131
+ print(result.data, getRootFormat());
132
+ } else {
133
+ error(result.error || 'Failed to get publication');
134
+ process.exit(1);
135
+ }
136
+ } catch (err) {
137
+ error(String(err));
138
+ process.exit(1);
139
+ }
140
+ });
141
+
142
+ pubCmd
143
+ .command('biblio <number>')
144
+ .description('Get bibliographic data for a publication')
145
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
146
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
147
+ .action(async (number: string, opts) => {
148
+ try {
149
+ const client = getClient();
150
+ const result = await client.publications.getBiblio(
151
+ opts.type as DocumentType,
152
+ opts.format as DocumentFormat,
153
+ number
154
+ );
155
+
156
+ if (result.success) {
157
+ success('Bibliographic data retrieved');
158
+ print(result.data, getRootFormat());
159
+ } else {
160
+ error(result.error || 'Failed to get bibliographic data');
161
+ process.exit(1);
162
+ }
163
+ } catch (err) {
164
+ error(String(err));
165
+ process.exit(1);
166
+ }
167
+ });
168
+
169
+ pubCmd
170
+ .command('abstract <number>')
171
+ .description('Get abstract for a publication')
172
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
173
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
174
+ .action(async (number: string, opts) => {
175
+ try {
176
+ const client = getClient();
177
+ const result = await client.publications.getAbstract(
178
+ opts.type as DocumentType,
179
+ opts.format as DocumentFormat,
180
+ number
181
+ );
182
+
183
+ if (result.success) {
184
+ success('Abstract retrieved');
185
+ print(result.data, getRootFormat());
186
+ } else {
187
+ error(result.error || 'Failed to get abstract');
188
+ process.exit(1);
189
+ }
190
+ } catch (err) {
191
+ error(String(err));
192
+ process.exit(1);
193
+ }
194
+ });
195
+
196
+ pubCmd
197
+ .command('description <number>')
198
+ .description('Get description for a publication')
199
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
200
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
201
+ .action(async (number: string, opts) => {
202
+ try {
203
+ const client = getClient();
204
+ const result = await client.publications.getDescription(
205
+ opts.type as DocumentType,
206
+ opts.format as DocumentFormat,
207
+ number
208
+ );
209
+
210
+ if (result.success) {
211
+ success('Description retrieved');
212
+ print(result.data, getRootFormat());
213
+ } else {
214
+ error(result.error || 'Failed to get description');
215
+ process.exit(1);
216
+ }
217
+ } catch (err) {
218
+ error(String(err));
219
+ process.exit(1);
220
+ }
221
+ });
222
+
223
+ pubCmd
224
+ .command('claims <number>')
225
+ .description('Get claims for a publication')
226
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
227
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
228
+ .action(async (number: string, opts) => {
229
+ try {
230
+ const client = getClient();
231
+ const result = await client.publications.getClaims(
232
+ opts.type as DocumentType,
233
+ opts.format as DocumentFormat,
234
+ number
235
+ );
236
+
237
+ if (result.success) {
238
+ success('Claims retrieved');
239
+ print(result.data, getRootFormat());
240
+ } else {
241
+ error(result.error || 'Failed to get claims');
242
+ process.exit(1);
243
+ }
244
+ } catch (err) {
245
+ error(String(err));
246
+ process.exit(1);
247
+ }
248
+ });
249
+
250
+ pubCmd
251
+ .command('images <number>')
252
+ .description('Get images metadata for a publication')
253
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
254
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
255
+ .action(async (number: string, opts) => {
256
+ try {
257
+ const client = getClient();
258
+ const result = await client.publications.getImages(
259
+ opts.type as DocumentType,
260
+ opts.format as DocumentFormat,
261
+ number
262
+ );
263
+
264
+ if (result.success) {
265
+ success('Images metadata retrieved');
266
+ print(result.data, getRootFormat());
267
+ } else {
268
+ error(result.error || 'Failed to get images');
269
+ process.exit(1);
270
+ }
271
+ } catch (err) {
272
+ error(String(err));
273
+ process.exit(1);
274
+ }
275
+ });
276
+
277
+ // ============================================
278
+ // Family Commands
279
+ // ============================================
280
+ const familyCmd = program
281
+ .command('family')
282
+ .description('Get patent family (INPADOC) data');
283
+
284
+ familyCmd
285
+ .command('get <number>')
286
+ .description('Get patent family for a document')
287
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
288
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
289
+ .action(async (number: string, opts) => {
290
+ try {
291
+ const client = getClient();
292
+ const result = await client.family.getFamily(
293
+ opts.type as DocumentType,
294
+ opts.format as DocumentFormat,
295
+ number
296
+ );
297
+
298
+ if (result.success) {
299
+ success(`Family retrieved: ${result.data?.totalMembers || 0} members`);
300
+ print(result.data, getRootFormat());
301
+ } else {
302
+ error(result.error || 'Failed to get family');
303
+ process.exit(1);
304
+ }
305
+ } catch (err) {
306
+ error(String(err));
307
+ process.exit(1);
308
+ }
309
+ });
310
+
311
+ familyCmd
312
+ .command('biblio <number>')
313
+ .description('Get patent family with bibliographic data')
314
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
315
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
316
+ .action(async (number: string, opts) => {
317
+ try {
318
+ const client = getClient();
319
+ const result = await client.family.getFamilyWithBiblio(
320
+ opts.type as DocumentType,
321
+ opts.format as DocumentFormat,
322
+ number
323
+ );
324
+
325
+ if (result.success) {
326
+ success(`Family with biblio retrieved: ${result.data?.totalMembers || 0} members`);
327
+ print(result.data, getRootFormat());
328
+ } else {
329
+ error(result.error || 'Failed to get family with biblio');
330
+ process.exit(1);
331
+ }
332
+ } catch (err) {
333
+ error(String(err));
334
+ process.exit(1);
335
+ }
336
+ });
337
+
338
+ familyCmd
339
+ .command('legal <number>')
340
+ .description('Get patent family with legal status')
341
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
342
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
343
+ .action(async (number: string, opts) => {
344
+ try {
345
+ const client = getClient();
346
+ const result = await client.family.getFamilyWithLegal(
347
+ opts.type as DocumentType,
348
+ opts.format as DocumentFormat,
349
+ number
350
+ );
351
+
352
+ if (result.success) {
353
+ success(`Family with legal status retrieved: ${result.data?.totalMembers || 0} members`);
354
+ print(result.data, getRootFormat());
355
+ } else {
356
+ error(result.error || 'Failed to get family with legal');
357
+ process.exit(1);
358
+ }
359
+ } catch (err) {
360
+ error(String(err));
361
+ process.exit(1);
362
+ }
363
+ });
364
+
365
+ // ============================================
366
+ // Legal Status Commands
367
+ // ============================================
368
+ program
369
+ .command('legal <number>')
370
+ .description('Get legal status for a document')
371
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
372
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
373
+ .action(async (number: string, opts) => {
374
+ try {
375
+ const client = getClient();
376
+ const result = await client.legal.getLegalStatus(
377
+ opts.type as DocumentType,
378
+ opts.format as DocumentFormat,
379
+ number
380
+ );
381
+
382
+ if (result.success) {
383
+ success(`Legal status retrieved: ${result.data?.events.length || 0} events`);
384
+ print(result.data, getRootFormat());
385
+ } else {
386
+ error(result.error || 'Failed to get legal status');
387
+ process.exit(1);
388
+ }
389
+ } catch (err) {
390
+ error(String(err));
391
+ process.exit(1);
392
+ }
393
+ });
394
+
395
+ // ============================================
396
+ // Register Commands
397
+ // ============================================
398
+ const registerCmd = program
399
+ .command('register')
400
+ .alias('reg')
401
+ .description('Access EP Register data');
402
+
403
+ registerCmd
404
+ .command('search <query>')
405
+ .description('Search the EP Register')
406
+ .option('--range <range>', 'Result range (e.g., "1-25")', '1-25')
407
+ .action(async (query: string, opts) => {
408
+ try {
409
+ const client = getClient();
410
+
411
+ const [begin, end] = opts.range.split('-').map((n: string) => parseInt(n));
412
+
413
+ const result = await client.register.search(query, {
414
+ rangeBegin: begin,
415
+ rangeEnd: end,
416
+ });
417
+
418
+ if (result.success) {
419
+ success(`Found ${result.totalResults || 0} results`);
420
+ print(result.results, getRootFormat());
421
+ } else {
422
+ error(result.error || 'Register search failed');
423
+ process.exit(1);
424
+ }
425
+ } catch (err) {
426
+ error(String(err));
427
+ process.exit(1);
428
+ }
429
+ });
430
+
431
+ registerCmd
432
+ .command('get <number>')
433
+ .description('Get register data for a publication')
434
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'publication')
435
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
436
+ .action(async (number: string, opts) => {
437
+ try {
438
+ const client = getClient();
439
+ const result = await client.register.getRegisterData(
440
+ opts.type as DocumentType,
441
+ opts.format as DocumentFormat,
442
+ number
443
+ );
444
+
445
+ if (result.success) {
446
+ success('Register data retrieved');
447
+ print(result.data, getRootFormat());
448
+ } else {
449
+ error(result.error || 'Failed to get register data');
450
+ process.exit(1);
451
+ }
452
+ } catch (err) {
453
+ error(String(err));
454
+ process.exit(1);
455
+ }
456
+ });
457
+
458
+ registerCmd
459
+ .command('procedural-steps <number>')
460
+ .alias('steps')
461
+ .description('Get procedural steps for an application')
462
+ .option('-t, --type <type>', 'Document type (publication, application, priority)', 'application')
463
+ .option('--format <format>', 'Document format (docdb, epodoc, original)', 'epodoc')
464
+ .action(async (number: string, opts) => {
465
+ try {
466
+ const client = getClient();
467
+ const result = await client.register.getProceduralSteps(
468
+ opts.type as DocumentType,
469
+ opts.format as DocumentFormat,
470
+ number
471
+ );
472
+
473
+ if (result.success) {
474
+ success('Procedural steps retrieved');
475
+ print(result.data, getRootFormat());
476
+ } else {
477
+ error(result.error || 'Failed to get procedural steps');
478
+ process.exit(1);
479
+ }
480
+ } catch (err) {
481
+ error(String(err));
482
+ process.exit(1);
483
+ }
484
+ });
485
+
486
+ // ============================================
487
+ // Classification Commands
488
+ // ============================================
489
+ const classCmd = program
490
+ .command('classification')
491
+ .alias('class')
492
+ .description('Access CPC classification data');
493
+
494
+ classCmd
495
+ .command('get <symbol>')
496
+ .description('Get CPC classification by symbol (e.g., "H01L", "A01B1/00")')
497
+ .option('--children', 'Include child classifications')
498
+ .option('--ancestors', 'Include ancestor classifications')
499
+ .action(async (symbol: string, opts) => {
500
+ try {
501
+ const client = getClient();
502
+ let result;
503
+
504
+ if (opts.children) {
505
+ result = await client.classification.getCPCWithChildren(symbol);
506
+ } else if (opts.ancestors) {
507
+ result = await client.classification.getCPCWithAncestors(symbol);
508
+ } else {
509
+ result = await client.classification.getCPC(symbol);
510
+ }
511
+
512
+ if (result.success) {
513
+ success(`Classification retrieved: ${result.data?.length || 0} nodes`);
514
+ print(result.data, getRootFormat());
515
+ } else {
516
+ error(result.error || 'Failed to get classification');
517
+ process.exit(1);
518
+ }
519
+ } catch (err) {
520
+ error(String(err));
521
+ process.exit(1);
522
+ }
523
+ });
524
+
525
+ classCmd
526
+ .command('search <query>')
527
+ .description('Search CPC classifications by keyword')
528
+ .action(async (query: string) => {
529
+ try {
530
+ const client = getClient();
531
+ const result = await client.classification.searchCPC(query);
532
+
533
+ if (result.success) {
534
+ success(`Found ${result.data?.length || 0} classifications`);
535
+ print(result.data, getRootFormat());
536
+ } else {
537
+ error(result.error || 'Classification search failed');
538
+ process.exit(1);
539
+ }
540
+ } catch (err) {
541
+ error(String(err));
542
+ process.exit(1);
543
+ }
544
+ });
545
+
546
+ // ============================================
547
+ // Auth Commands
548
+ // ============================================
549
+ const authCmd = program
550
+ .command('auth')
551
+ .description('Manage authentication');
552
+
553
+ authCmd
554
+ .command('test')
555
+ .description('Test authentication with current credentials')
556
+ .action(async () => {
557
+ try {
558
+ const client = getClient();
559
+ await client.authenticate();
560
+ success('Authentication successful');
561
+ info(`Token expires: ${client.getTokenExpiry()?.toISOString() || 'unknown'}`);
562
+ } catch (err) {
563
+ error(`Authentication failed: ${err}`);
564
+ process.exit(1);
565
+ }
566
+ });
567
+
568
+ authCmd
569
+ .command('clear-token')
570
+ .description('Clear cached OAuth token')
571
+ .action(() => {
572
+ clearToken();
573
+ success('Token cleared');
574
+ });
575
+
576
+ // ============================================
577
+ // Profile Commands
578
+ // ============================================
579
+ const profileCmd = program
580
+ .command('profile')
581
+ .description('Manage configuration profiles');
582
+
583
+ profileCmd
584
+ .command('list')
585
+ .description('List all profiles')
586
+ .action(() => {
587
+ const profiles = listProfiles();
588
+ const current = getCurrentProfile();
589
+
590
+ if (profiles.length === 0) {
591
+ info('No profiles found. Use "profile create <name>" to create one.');
592
+ return;
593
+ }
594
+
595
+ success(`Profiles:`);
596
+ profiles.forEach(p => {
597
+ const isActive = p === current ? chalk.green(' (active)') : '';
598
+ console.log(` ${p}${isActive}`);
599
+ });
600
+ });
601
+
602
+ profileCmd
603
+ .command('use <name>')
604
+ .description('Switch to a profile')
605
+ .action((name: string) => {
606
+ if (!profileExists(name)) {
607
+ error(`Profile "${name}" does not exist. Create it with "profile create ${name}"`);
608
+ process.exit(1);
609
+ }
610
+ setCurrentProfile(name);
611
+ success(`Switched to profile: ${name}`);
612
+ });
613
+
614
+ profileCmd
615
+ .command('create <name>')
616
+ .description('Create a new profile')
617
+ .option('--consumer-key <key>', 'Consumer key')
618
+ .option('--consumer-secret <secret>', 'Consumer secret')
619
+ .option('--use', 'Switch to this profile after creation')
620
+ .action((name: string, opts) => {
621
+ if (profileExists(name)) {
622
+ error(`Profile "${name}" already exists`);
623
+ process.exit(1);
624
+ }
625
+
626
+ createProfile(name, {
627
+ consumerKey: opts.consumerKey,
628
+ consumerSecret: opts.consumerSecret,
629
+ });
630
+ success(`Profile "${name}" created`);
631
+
632
+ if (opts.use) {
633
+ setCurrentProfile(name);
634
+ info(`Switched to profile: ${name}`);
635
+ }
636
+ });
637
+
638
+ profileCmd
639
+ .command('delete <name>')
640
+ .description('Delete a profile')
641
+ .action((name: string) => {
642
+ if (name === 'default') {
643
+ error('Cannot delete the default profile');
644
+ process.exit(1);
645
+ }
646
+ if (deleteProfile(name)) {
647
+ success(`Profile "${name}" deleted`);
648
+ } else {
649
+ error(`Profile "${name}" not found`);
650
+ process.exit(1);
651
+ }
652
+ });
653
+
654
+ profileCmd
655
+ .command('show [name]')
656
+ .description('Show profile configuration')
657
+ .action((name?: string) => {
658
+ const profileName = name || getCurrentProfile();
659
+ const config = loadProfile(profileName);
660
+ const active = getCurrentProfile();
661
+
662
+ console.log(chalk.bold(`Profile: ${profileName}${profileName === active ? chalk.green(' (active)') : ''}`));
663
+ info(`Consumer Key: ${config.consumerKey ? `${config.consumerKey.substring(0, 8)}...` : chalk.gray('not set')}`);
664
+ info(`Consumer Secret: ${config.consumerSecret ? '********' : chalk.gray('not set')}`);
665
+ info(`Base URL: ${config.baseUrl || chalk.gray('default (https://ops.epo.org/3.2/rest-services)')}`);
666
+ });
667
+
668
+ // ============================================
669
+ // Config Commands
670
+ // ============================================
671
+ const configCmd = program
672
+ .command('config')
673
+ .description('Manage CLI configuration (for active profile)');
674
+
675
+ configCmd
676
+ .command('set-credentials <consumerKey> <consumerSecret>')
677
+ .description('Set consumer key and secret')
678
+ .action((consumerKey: string, consumerSecret: string) => {
679
+ setCredentials(consumerKey, consumerSecret);
680
+ success(`Credentials saved to profile: ${getCurrentProfile()}`);
681
+ });
682
+
683
+ configCmd
684
+ .command('show')
685
+ .description('Show current configuration')
686
+ .action(() => {
687
+ const profileName = getCurrentProfile();
688
+ const consumerKey = getConsumerKey();
689
+ const consumerSecret = getConsumerSecret();
690
+ const baseUrl = getBaseUrl();
691
+
692
+ console.log(chalk.bold(`Active Profile: ${profileName}`));
693
+ info(`Config directory: ${getConfigDir()}`);
694
+ info(`Consumer Key: ${consumerKey ? `${consumerKey.substring(0, 8)}...` : chalk.gray('not set')}`);
695
+ info(`Consumer Secret: ${consumerSecret ? '********' : chalk.gray('not set')}`);
696
+ info(`Base URL: ${baseUrl || chalk.gray('default (https://ops.epo.org/3.2/rest-services)')}`);
697
+ });
698
+
699
+ configCmd
700
+ .command('clear')
701
+ .description('Clear configuration for active profile')
702
+ .action(() => {
703
+ clearConfig();
704
+ success(`Configuration cleared for profile: ${getCurrentProfile()}`);
705
+ });
706
+
707
+ // Parse and execute
708
+ program.parse();