@getfrontline/cli 1.0.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 (270) hide show
  1. package/README.md +319 -0
  2. package/dist/assets/logo3.png +0 -0
  3. package/dist/commands/agents/analytics.d.ts +3 -0
  4. package/dist/commands/agents/analytics.d.ts.map +1 -0
  5. package/dist/commands/agents/analytics.js +67 -0
  6. package/dist/commands/agents/analytics.js.map +1 -0
  7. package/dist/commands/agents/flows.d.ts +3 -0
  8. package/dist/commands/agents/flows.d.ts.map +1 -0
  9. package/dist/commands/agents/flows.js +47 -0
  10. package/dist/commands/agents/flows.js.map +1 -0
  11. package/dist/commands/agents/list.d.ts +3 -0
  12. package/dist/commands/agents/list.d.ts.map +1 -0
  13. package/dist/commands/agents/list.js +46 -0
  14. package/dist/commands/agents/list.js.map +1 -0
  15. package/dist/commands/api/raw.d.ts +3 -0
  16. package/dist/commands/api/raw.d.ts.map +1 -0
  17. package/dist/commands/api/raw.js +54 -0
  18. package/dist/commands/api/raw.js.map +1 -0
  19. package/dist/commands/auth/login.d.ts +3 -0
  20. package/dist/commands/auth/login.d.ts.map +1 -0
  21. package/dist/commands/auth/login.js +39 -0
  22. package/dist/commands/auth/login.js.map +1 -0
  23. package/dist/commands/auth/logout.d.ts +3 -0
  24. package/dist/commands/auth/logout.d.ts.map +1 -0
  25. package/dist/commands/auth/logout.js +16 -0
  26. package/dist/commands/auth/logout.js.map +1 -0
  27. package/dist/commands/auth/profiles.d.ts +3 -0
  28. package/dist/commands/auth/profiles.d.ts.map +1 -0
  29. package/dist/commands/auth/profiles.js +72 -0
  30. package/dist/commands/auth/profiles.js.map +1 -0
  31. package/dist/commands/auth/whoami.d.ts +3 -0
  32. package/dist/commands/auth/whoami.d.ts.map +1 -0
  33. package/dist/commands/auth/whoami.js +46 -0
  34. package/dist/commands/auth/whoami.js.map +1 -0
  35. package/dist/commands/billing/get.d.ts +3 -0
  36. package/dist/commands/billing/get.d.ts.map +1 -0
  37. package/dist/commands/billing/get.js +42 -0
  38. package/dist/commands/billing/get.js.map +1 -0
  39. package/dist/commands/object/aggregation.d.ts +3 -0
  40. package/dist/commands/object/aggregation.d.ts.map +1 -0
  41. package/dist/commands/object/aggregation.js +78 -0
  42. package/dist/commands/object/aggregation.js.map +1 -0
  43. package/dist/commands/object/export.d.ts +3 -0
  44. package/dist/commands/object/export.d.ts.map +1 -0
  45. package/dist/commands/object/export.js +98 -0
  46. package/dist/commands/object/export.js.map +1 -0
  47. package/dist/commands/object/field.d.ts +3 -0
  48. package/dist/commands/object/field.d.ts.map +1 -0
  49. package/dist/commands/object/field.js +76 -0
  50. package/dist/commands/object/field.js.map +1 -0
  51. package/dist/commands/object/file.d.ts +3 -0
  52. package/dist/commands/object/file.d.ts.map +1 -0
  53. package/dist/commands/object/file.js +105 -0
  54. package/dist/commands/object/file.js.map +1 -0
  55. package/dist/commands/object/index.d.ts +3 -0
  56. package/dist/commands/object/index.d.ts.map +1 -0
  57. package/dist/commands/object/index.js +136 -0
  58. package/dist/commands/object/index.js.map +1 -0
  59. package/dist/commands/object/note.d.ts +3 -0
  60. package/dist/commands/object/note.d.ts.map +1 -0
  61. package/dist/commands/object/note.js +62 -0
  62. package/dist/commands/object/note.js.map +1 -0
  63. package/dist/commands/object/option.d.ts +3 -0
  64. package/dist/commands/object/option.d.ts.map +1 -0
  65. package/dist/commands/object/option.js +78 -0
  66. package/dist/commands/object/option.js.map +1 -0
  67. package/dist/commands/object/record-type.d.ts +3 -0
  68. package/dist/commands/object/record-type.d.ts.map +1 -0
  69. package/dist/commands/object/record-type.js +73 -0
  70. package/dist/commands/object/record-type.js.map +1 -0
  71. package/dist/commands/object/record.d.ts +3 -0
  72. package/dist/commands/object/record.d.ts.map +1 -0
  73. package/dist/commands/object/record.js +128 -0
  74. package/dist/commands/object/record.js.map +1 -0
  75. package/dist/commands/object/relation.d.ts +3 -0
  76. package/dist/commands/object/relation.d.ts.map +1 -0
  77. package/dist/commands/object/relation.js +73 -0
  78. package/dist/commands/object/relation.js.map +1 -0
  79. package/dist/commands/object/task.d.ts +3 -0
  80. package/dist/commands/object/task.d.ts.map +1 -0
  81. package/dist/commands/object/task.js +88 -0
  82. package/dist/commands/object/task.js.map +1 -0
  83. package/dist/commands/object/view.d.ts +3 -0
  84. package/dist/commands/object/view.d.ts.map +1 -0
  85. package/dist/commands/object/view.js +118 -0
  86. package/dist/commands/object/view.js.map +1 -0
  87. package/dist/commands/setup/claudeSkills.d.ts +3 -0
  88. package/dist/commands/setup/claudeSkills.d.ts.map +1 -0
  89. package/dist/commands/setup/claudeSkills.js +84 -0
  90. package/dist/commands/setup/claudeSkills.js.map +1 -0
  91. package/dist/commands/table/aggregation.d.ts +3 -0
  92. package/dist/commands/table/aggregation.d.ts.map +1 -0
  93. package/dist/commands/table/aggregation.js +78 -0
  94. package/dist/commands/table/aggregation.js.map +1 -0
  95. package/dist/commands/table/export.d.ts +3 -0
  96. package/dist/commands/table/export.d.ts.map +1 -0
  97. package/dist/commands/table/export.js +97 -0
  98. package/dist/commands/table/export.js.map +1 -0
  99. package/dist/commands/table/field.d.ts +3 -0
  100. package/dist/commands/table/field.d.ts.map +1 -0
  101. package/dist/commands/table/field.js +76 -0
  102. package/dist/commands/table/field.js.map +1 -0
  103. package/dist/commands/table/file.d.ts +3 -0
  104. package/dist/commands/table/file.d.ts.map +1 -0
  105. package/dist/commands/table/file.js +106 -0
  106. package/dist/commands/table/file.js.map +1 -0
  107. package/dist/commands/table/index.d.ts +3 -0
  108. package/dist/commands/table/index.d.ts.map +1 -0
  109. package/dist/commands/table/index.js +142 -0
  110. package/dist/commands/table/index.js.map +1 -0
  111. package/dist/commands/table/note.d.ts +3 -0
  112. package/dist/commands/table/note.d.ts.map +1 -0
  113. package/dist/commands/table/note.js +62 -0
  114. package/dist/commands/table/note.js.map +1 -0
  115. package/dist/commands/table/option.d.ts +3 -0
  116. package/dist/commands/table/option.d.ts.map +1 -0
  117. package/dist/commands/table/option.js +78 -0
  118. package/dist/commands/table/option.js.map +1 -0
  119. package/dist/commands/table/relation.d.ts +3 -0
  120. package/dist/commands/table/relation.d.ts.map +1 -0
  121. package/dist/commands/table/relation.js +74 -0
  122. package/dist/commands/table/relation.js.map +1 -0
  123. package/dist/commands/table/row.d.ts +3 -0
  124. package/dist/commands/table/row.d.ts.map +1 -0
  125. package/dist/commands/table/row.js +124 -0
  126. package/dist/commands/table/row.js.map +1 -0
  127. package/dist/commands/table/task.d.ts +3 -0
  128. package/dist/commands/table/task.d.ts.map +1 -0
  129. package/dist/commands/table/task.js +88 -0
  130. package/dist/commands/table/task.js.map +1 -0
  131. package/dist/commands/workflows/analytics.d.ts +3 -0
  132. package/dist/commands/workflows/analytics.d.ts.map +1 -0
  133. package/dist/commands/workflows/analytics.js +60 -0
  134. package/dist/commands/workflows/analytics.js.map +1 -0
  135. package/dist/commands/workflows/list.d.ts +3 -0
  136. package/dist/commands/workflows/list.d.ts.map +1 -0
  137. package/dist/commands/workflows/list.js +47 -0
  138. package/dist/commands/workflows/list.js.map +1 -0
  139. package/dist/index.d.ts +3 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +73 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/lib/auth.d.ts +13 -0
  144. package/dist/lib/auth.d.ts.map +1 -0
  145. package/dist/lib/auth.js +40 -0
  146. package/dist/lib/auth.js.map +1 -0
  147. package/dist/lib/config.d.ts +28 -0
  148. package/dist/lib/config.d.ts.map +1 -0
  149. package/dist/lib/config.js +77 -0
  150. package/dist/lib/config.js.map +1 -0
  151. package/dist/lib/errors.d.ts +13 -0
  152. package/dist/lib/errors.d.ts.map +1 -0
  153. package/dist/lib/errors.js +31 -0
  154. package/dist/lib/errors.js.map +1 -0
  155. package/dist/lib/globalOpts.d.ts +23 -0
  156. package/dist/lib/globalOpts.d.ts.map +1 -0
  157. package/dist/lib/globalOpts.js +40 -0
  158. package/dist/lib/globalOpts.js.map +1 -0
  159. package/dist/lib/helpEpilog.d.ts +18 -0
  160. package/dist/lib/helpEpilog.d.ts.map +1 -0
  161. package/dist/lib/helpEpilog.js +56 -0
  162. package/dist/lib/helpEpilog.js.map +1 -0
  163. package/dist/lib/httpClient.d.ts +50 -0
  164. package/dist/lib/httpClient.d.ts.map +1 -0
  165. package/dist/lib/httpClient.js +196 -0
  166. package/dist/lib/httpClient.js.map +1 -0
  167. package/dist/lib/output.d.ts +38 -0
  168. package/dist/lib/output.d.ts.map +1 -0
  169. package/dist/lib/output.js +131 -0
  170. package/dist/lib/output.js.map +1 -0
  171. package/dist/max/browserLogin.d.ts +15 -0
  172. package/dist/max/browserLogin.d.ts.map +1 -0
  173. package/dist/max/browserLogin.js +164 -0
  174. package/dist/max/browserLogin.js.map +1 -0
  175. package/dist/max/commands/auth/login.d.ts +3 -0
  176. package/dist/max/commands/auth/login.d.ts.map +1 -0
  177. package/dist/max/commands/auth/login.js +58 -0
  178. package/dist/max/commands/auth/login.js.map +1 -0
  179. package/dist/max/commands/auth/logout.d.ts +3 -0
  180. package/dist/max/commands/auth/logout.d.ts.map +1 -0
  181. package/dist/max/commands/auth/logout.js +23 -0
  182. package/dist/max/commands/auth/logout.js.map +1 -0
  183. package/dist/max/commands/auth/whoami.d.ts +3 -0
  184. package/dist/max/commands/auth/whoami.d.ts.map +1 -0
  185. package/dist/max/commands/auth/whoami.js +46 -0
  186. package/dist/max/commands/auth/whoami.js.map +1 -0
  187. package/dist/max/commands/chat/repl.d.ts +3 -0
  188. package/dist/max/commands/chat/repl.d.ts.map +1 -0
  189. package/dist/max/commands/chat/repl.js +104 -0
  190. package/dist/max/commands/chat/repl.js.map +1 -0
  191. package/dist/max/commands/chat/send.d.ts +25 -0
  192. package/dist/max/commands/chat/send.d.ts.map +1 -0
  193. package/dist/max/commands/chat/send.js +163 -0
  194. package/dist/max/commands/chat/send.js.map +1 -0
  195. package/dist/max/commands/conversations/abort.d.ts +3 -0
  196. package/dist/max/commands/conversations/abort.d.ts.map +1 -0
  197. package/dist/max/commands/conversations/abort.js +55 -0
  198. package/dist/max/commands/conversations/abort.js.map +1 -0
  199. package/dist/max/commands/conversations/get.d.ts +3 -0
  200. package/dist/max/commands/conversations/get.d.ts.map +1 -0
  201. package/dist/max/commands/conversations/get.js +42 -0
  202. package/dist/max/commands/conversations/get.js.map +1 -0
  203. package/dist/max/commands/conversations/index.d.ts +3 -0
  204. package/dist/max/commands/conversations/index.d.ts.map +1 -0
  205. package/dist/max/commands/conversations/index.js +16 -0
  206. package/dist/max/commands/conversations/index.js.map +1 -0
  207. package/dist/max/commands/conversations/list.d.ts +3 -0
  208. package/dist/max/commands/conversations/list.d.ts.map +1 -0
  209. package/dist/max/commands/conversations/list.js +35 -0
  210. package/dist/max/commands/conversations/list.js.map +1 -0
  211. package/dist/max/commands/conversations/update.d.ts +3 -0
  212. package/dist/max/commands/conversations/update.d.ts.map +1 -0
  213. package/dist/max/commands/conversations/update.js +53 -0
  214. package/dist/max/commands/conversations/update.js.map +1 -0
  215. package/dist/max/jwtDecode.d.ts +5 -0
  216. package/dist/max/jwtDecode.d.ts.map +1 -0
  217. package/dist/max/jwtDecode.js +19 -0
  218. package/dist/max/jwtDecode.js.map +1 -0
  219. package/dist/max/lib/auth.d.ts +20 -0
  220. package/dist/max/lib/auth.d.ts.map +1 -0
  221. package/dist/max/lib/auth.js +53 -0
  222. package/dist/max/lib/auth.js.map +1 -0
  223. package/dist/max/lib/httpClient.d.ts +25 -0
  224. package/dist/max/lib/httpClient.d.ts.map +1 -0
  225. package/dist/max/lib/httpClient.js +138 -0
  226. package/dist/max/lib/httpClient.js.map +1 -0
  227. package/dist/max/lib/maxResponse.d.ts +30 -0
  228. package/dist/max/lib/maxResponse.d.ts.map +1 -0
  229. package/dist/max/lib/maxResponse.js +132 -0
  230. package/dist/max/lib/maxResponse.js.map +1 -0
  231. package/dist/max/lib/publicApiPaths.d.ts +12 -0
  232. package/dist/max/lib/publicApiPaths.d.ts.map +1 -0
  233. package/dist/max/lib/publicApiPaths.js +15 -0
  234. package/dist/max/lib/publicApiPaths.js.map +1 -0
  235. package/dist/max/maxConfig.d.ts +31 -0
  236. package/dist/max/maxConfig.d.ts.map +1 -0
  237. package/dist/max/maxConfig.js +50 -0
  238. package/dist/max/maxConfig.js.map +1 -0
  239. package/dist/max/ui/banner.d.ts +3 -0
  240. package/dist/max/ui/banner.d.ts.map +1 -0
  241. package/dist/max/ui/banner.js +96 -0
  242. package/dist/max/ui/banner.js.map +1 -0
  243. package/dist/max.d.ts +3 -0
  244. package/dist/max.d.ts.map +1 -0
  245. package/dist/max.js +94 -0
  246. package/dist/max.js.map +1 -0
  247. package/dist/scripts/postinstall.d.ts +8 -0
  248. package/dist/scripts/postinstall.d.ts.map +1 -0
  249. package/dist/scripts/postinstall.js +149 -0
  250. package/dist/scripts/postinstall.js.map +1 -0
  251. package/dist/skills/aggregations/SKILL.md +122 -0
  252. package/dist/skills/auth-and-profiles/SKILL.md +102 -0
  253. package/dist/skills/crm-setup/SKILL.md +385 -0
  254. package/dist/skills/crud-operations/SKILL.md +287 -0
  255. package/dist/skills/export-and-delete/SKILL.md +96 -0
  256. package/dist/skills/files/SKILL.md +70 -0
  257. package/dist/skills/filter-and-query/SKILL.md +199 -0
  258. package/dist/skills/frontline-agents/SKILL.md +99 -0
  259. package/dist/skills/frontline-api/SKILL.md +59 -0
  260. package/dist/skills/frontline-billing/SKILL.md +42 -0
  261. package/dist/skills/frontline-workflows/SKILL.md +72 -0
  262. package/dist/skills/max-auth/SKILL.md +76 -0
  263. package/dist/skills/max-chat/SKILL.md +111 -0
  264. package/dist/skills/notes-and-tasks/SKILL.md +128 -0
  265. package/dist/skills/pipeline-setup/SKILL.md +233 -0
  266. package/dist/skills/record-type-management/SKILL.md +104 -0
  267. package/dist/skills/relations/SKILL.md +153 -0
  268. package/dist/skills/resource-creation/SKILL.md +86 -0
  269. package/dist/skills/schema-design/SKILL.md +263 -0
  270. package/package.json +47 -0
@@ -0,0 +1,31 @@
1
+ export interface MaxProfileConfig {
2
+ /**
3
+ * Per-user API key used as Bearer for Max REST calls and shared with the
4
+ * Frontline CLI store under the same profile name. This is the primary
5
+ * credential now that the browser SSO flow is paused.
6
+ */
7
+ apiKey?: string;
8
+ /**
9
+ * Firebase ID token produced by the (currently disabled) hosted login page.
10
+ * Kept optional so previously saved profiles keep working until the SSO
11
+ * flow is re-enabled.
12
+ */
13
+ idToken?: string;
14
+ /** Optional refresh token if the web app returns it. */
15
+ refreshToken?: string;
16
+ /**
17
+ * Optional override for Public API root (…/public/v1). Prefer storing baseUrl
18
+ * on the Frontline profile; this field is legacy / max-only override.
19
+ */
20
+ apiBaseUrl?: string;
21
+ /** Last used Max conversation (for `max "..."` default). */
22
+ lastConversationId?: number;
23
+ }
24
+ export declare function getMaxCurrentProfile(): string;
25
+ export declare function setMaxCurrentProfile(name: string): void;
26
+ export declare function getMaxProfile(name?: string): MaxProfileConfig | undefined;
27
+ export declare function setMaxProfile(name: string, config: MaxProfileConfig): void;
28
+ export declare function updateMaxProfile(name: string, patch: Partial<MaxProfileConfig>): void;
29
+ export declare function deleteMaxProfile(name: string): void;
30
+ export declare function getMaxConfigPath(): string;
31
+ //# sourceMappingURL=maxConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maxConfig.d.ts","sourceRoot":"","sources":["../../src/max/maxConfig.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAeD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAGzE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAI1E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAKrF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getMaxCurrentProfile = getMaxCurrentProfile;
7
+ exports.setMaxCurrentProfile = setMaxCurrentProfile;
8
+ exports.getMaxProfile = getMaxProfile;
9
+ exports.setMaxProfile = setMaxProfile;
10
+ exports.updateMaxProfile = updateMaxProfile;
11
+ exports.deleteMaxProfile = deleteMaxProfile;
12
+ exports.getMaxConfigPath = getMaxConfigPath;
13
+ const conf_1 = __importDefault(require("conf"));
14
+ const store = new conf_1.default({
15
+ projectName: "max-cli",
16
+ defaults: {
17
+ currentProfile: "default",
18
+ profiles: {},
19
+ },
20
+ });
21
+ function getMaxCurrentProfile() {
22
+ return store.get("currentProfile");
23
+ }
24
+ function setMaxCurrentProfile(name) {
25
+ store.set("currentProfile", name);
26
+ }
27
+ function getMaxProfile(name) {
28
+ const profileName = name ?? getMaxCurrentProfile();
29
+ return store.get("profiles")[profileName];
30
+ }
31
+ function setMaxProfile(name, config) {
32
+ const profiles = store.get("profiles");
33
+ profiles[name] = config;
34
+ store.set("profiles", profiles);
35
+ }
36
+ function updateMaxProfile(name, patch) {
37
+ const profiles = store.get("profiles");
38
+ const existing = profiles[name];
39
+ profiles[name] = { ...(existing ?? {}), ...patch };
40
+ store.set("profiles", profiles);
41
+ }
42
+ function deleteMaxProfile(name) {
43
+ const profiles = store.get("profiles");
44
+ delete profiles[name];
45
+ store.set("profiles", profiles);
46
+ }
47
+ function getMaxConfigPath() {
48
+ return store.path;
49
+ }
50
+ //# sourceMappingURL=maxConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maxConfig.js","sourceRoot":"","sources":["../../src/max/maxConfig.ts"],"names":[],"mappings":";;;;;AAuCA,oDAEC;AAED,oDAEC;AAED,sCAGC;AAED,sCAIC;AAED,4CAKC;AAED,4CAIC;AAED,4CAEC;AAzED,gDAAwB;AA+BxB,MAAM,KAAK,GAAG,IAAI,cAAI,CAAe;IACjC,WAAW,EAAE,SAAS;IACtB,QAAQ,EAAE;QACN,cAAc,EAAE,SAAS;QACzB,QAAQ,EAAE,EAAE;KACf;CACJ,CAAC,CAAC;AAEH,SAAgB,oBAAoB;IAChC,OAAO,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACvC,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAY;IAC7C,KAAK,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,aAAa,CAAC,IAAa;IACvC,MAAM,WAAW,GAAG,IAAI,IAAI,oBAAoB,EAAE,CAAC;IACnD,OAAO,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY,EAAE,MAAwB;IAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IACxB,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAY,EAAE,KAAgC;IAC3E,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,IAAK,EAAuB,CAAC,EAAE,GAAG,KAAK,EAAsB,CAAC;IAC7F,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAY;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,SAAgB,gBAAgB;IAC5B,OAAO,KAAK,CAAC,IAAI,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function printFrontlineLogo(): Promise<void>;
2
+ export declare function printMaxWelcome(): Promise<void>;
3
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../../src/max/ui/banner.ts"],"names":[],"mappings":"AAsEA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBxD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAOrD"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.printFrontlineLogo = printFrontlineLogo;
7
+ exports.printMaxWelcome = printMaxWelcome;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
12
+ const package_json_1 = __importDefault(require("../../../package.json"));
13
+ function getCandidateLogoPaths() {
14
+ const fromEnv = process.env.MAX_CLI_LOGO_PATH?.trim() ||
15
+ process.env.FRONTLINE_CLI_LOGO_PATH?.trim() ||
16
+ process.env.FRONTLINE_LOGO_PATH?.trim();
17
+ const candidates = [];
18
+ if (fromEnv)
19
+ candidates.push(fromEnv);
20
+ // Bundled: packages/cli/assets/logo3.png (published via package.json "files")
21
+ // __dirname = dist/max/ui → three levels up = package root.
22
+ candidates.push(path_1.default.join(__dirname, "..", "..", "..", "assets", "logo3.png"));
23
+ candidates.push(path_1.default.join(process.cwd(), "assets", "logo3.png"));
24
+ return candidates;
25
+ }
26
+ function resolveBundledLogoPath() {
27
+ for (const p of getCandidateLogoPaths()) {
28
+ try {
29
+ if (fs_1.default.existsSync(p))
30
+ return p;
31
+ }
32
+ catch {
33
+ // ignore
34
+ }
35
+ }
36
+ return null;
37
+ }
38
+ /** Text fallback when PNG inline rendering is not supported (typical on Windows conhost / PowerShell). */
39
+ function printAsciiLogo() {
40
+ // Fallback banner (matches the Frontline mark in plain text terminals).
41
+ // Keep as a single template literal to preserve spacing.
42
+ const art = `
43
+ @@@@@@@@@@@@@@@@@@@@@@
44
+ @@@@@@@@@@@@@@@@@@@@@@@@
45
+ @@@@@@@@@@@@@@@@@@@@@@@@@@
46
+ @@@@@@@@@@@@@@@@@@@@@@@@@@
47
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@
48
+
49
+
50
+ @@@@@@@@@@@@@@@@@@
51
+ @@@@@@@@@@@@@@@@@@@@@
52
+ @@@@@@@@@@@@@@@@@@@@@
53
+ @@@@@@@@@@@@@@@@@@@@@@
54
+ @@@@@@@@@@@@@@@@@@@@@
55
+ @@@@@@@@@@
56
+ @@@@@@@@@
57
+ `;
58
+ console.log(chalk_1.default.white(art));
59
+ }
60
+ async function tryRenderPngLogo(logoPath) {
61
+ try {
62
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
63
+ const terminalImage = require("terminal-image");
64
+ const buf = fs_1.default.readFileSync(logoPath);
65
+ const out = await terminalImage.buffer(buf, { width: 28 });
66
+ if (typeof out === "string" && out.trim().length > 0)
67
+ return out;
68
+ }
69
+ catch {
70
+ // Unsupported terminal or render failure — use ASCII below.
71
+ }
72
+ return null;
73
+ }
74
+ async function printFrontlineLogo() {
75
+ const logoPath = resolveBundledLogoPath();
76
+ let rendered = false;
77
+ if (logoPath) {
78
+ const png = await tryRenderPngLogo(logoPath);
79
+ if (png) {
80
+ console.log(png);
81
+ rendered = true;
82
+ }
83
+ }
84
+ if (!rendered) {
85
+ // Always show a visible “logo” on terminals that cannot render PNG (most Windows defaults).
86
+ printAsciiLogo();
87
+ }
88
+ }
89
+ async function printMaxWelcome() {
90
+ await printFrontlineLogo();
91
+ console.log(chalk_1.default.bold.white("Welcome to Max CLI"));
92
+ console.log(chalk_1.default.gray(`Version: ${package_json_1.default.version}`));
93
+ console.log(chalk_1.default.gray("Sign in to chat with Max from your terminal."));
94
+ console.log();
95
+ }
96
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../src/max/ui/banner.ts"],"names":[],"mappings":"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"}
package/dist/max.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=max.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max.d.ts","sourceRoot":"","sources":["../src/max.ts"],"names":[],"mappings":""}
package/dist/max.js ADDED
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const login_1 = require("./max/commands/auth/login");
6
+ const logout_1 = require("./max/commands/auth/logout");
7
+ const whoami_1 = require("./max/commands/auth/whoami");
8
+ const send_1 = require("./max/commands/chat/send");
9
+ const repl_1 = require("./max/commands/chat/repl");
10
+ const output_1 = require("./lib/output");
11
+ const maxConfig_1 = require("./max/maxConfig");
12
+ const helpEpilog_1 = require("./lib/helpEpilog");
13
+ const conversations_1 = require("./max/commands/conversations");
14
+ const pkg = require("../package.json");
15
+ const program = new commander_1.Command();
16
+ program
17
+ .name("max")
18
+ .description("Max CLI — authenticate with a per-user API key (shared with the Frontline CLI) and call Max on the Public API (/public/v1/max/...). Base URL from env, profile, or --base-url.")
19
+ .version(pkg.version ?? "0.0.0")
20
+ .addHelpText("after", `\n${helpEpilog_1.MAX_CLI_EPILOG}\n`);
21
+ const authCmd = new commander_1.Command("auth").description("Max session: save per-user API key, clear credentials, show current profile");
22
+ authCmd.addCommand(login_1.maxLoginCommand);
23
+ authCmd.addCommand(logout_1.maxLogoutCommand);
24
+ authCmd.addCommand(whoami_1.maxWhoamiCommand);
25
+ program.addCommand(authCmd);
26
+ const chatCmd = new commander_1.Command("chat")
27
+ .description("Send messages to Max on the Public API (Bearer = per-user API key; base URL from env, profile, or --base-url — see `max --help`)")
28
+ .addHelpText("after", `\nAuth: max auth login <api-key>. URL: see \`max --help\` (REST).\n`)
29
+ .action(async () => {
30
+ // Default behavior: interactive mode
31
+ await repl_1.maxChatReplCommand.parseAsync(process.argv, { from: "user" });
32
+ });
33
+ chatCmd.addCommand(send_1.maxSendCommand);
34
+ chatCmd.addCommand(repl_1.maxChatReplCommand);
35
+ program.addCommand(chatCmd);
36
+ program.addCommand(conversations_1.maxConversationsCommand);
37
+ program
38
+ .command("config-path")
39
+ .description("Print where Max CLI stores its config")
40
+ .action(() => {
41
+ console.log((0, maxConfig_1.getMaxConfigPath)());
42
+ });
43
+ // Root default action: `max "Hello"` or `max --new "Hello"`
44
+ program
45
+ .argument("[message...]", "Message to send to Max")
46
+ .option("--new", "Start a new conversation")
47
+ .option("--conversation <id>", "Conversation id to use")
48
+ .option("--profile <name>", helpEpilog_1.MAX_PROFILE_OPTION)
49
+ .option("--base-url <url>", helpEpilog_1.MAX_BASE_URL_OPTION)
50
+ .option("--api-base-url <url>", "Deprecated alias for --base-url (Public API root)")
51
+ .option("--api-key <key>", "Override per-user API key for this run")
52
+ .option("--pretty", "Print assistant message from `data` instead of one-line JSON")
53
+ .option("--json", "Print only the POST response JSON (no polling)")
54
+ .option("--debug", "Show debug information")
55
+ .option("--no-wait", "Do not poll for assistant reply")
56
+ .option("--timeout <seconds>", "Polling timeout in seconds", "60")
57
+ .action(async (messageParts, options) => {
58
+ if (!messageParts || messageParts.length === 0) {
59
+ program.help();
60
+ return;
61
+ }
62
+ await (0, send_1.runMaxSend)(messageParts, {
63
+ new: Boolean(options.new),
64
+ conversation: options.conversation ? String(options.conversation) : undefined,
65
+ profile: options.profile ? String(options.profile) : undefined,
66
+ baseUrl: options.baseUrl ? String(options.baseUrl) : undefined,
67
+ apiBaseUrl: options.apiBaseUrl ? String(options.apiBaseUrl) : undefined,
68
+ apiKey: options.apiKey ? String(options.apiKey) : undefined,
69
+ json: Boolean(options.json),
70
+ pretty: Boolean(options.pretty),
71
+ debug: Boolean(options.debug),
72
+ wait: options.wait !== false,
73
+ timeout: options.timeout ? String(options.timeout) : undefined,
74
+ chatMode: false,
75
+ });
76
+ });
77
+ program.exitOverride();
78
+ async function main() {
79
+ try {
80
+ await program.parseAsync(process.argv);
81
+ }
82
+ catch (err) {
83
+ if (err instanceof Error && err.message !== "(outputHelp)") {
84
+ const code = err.code;
85
+ if (code === "commander.helpDisplayed" || code === "commander.version") {
86
+ return;
87
+ }
88
+ (0, output_1.printError)(err.message);
89
+ process.exitCode = 1;
90
+ }
91
+ }
92
+ }
93
+ main();
94
+ //# sourceMappingURL=max.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max.js","sourceRoot":"","sources":["../src/max.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export declare function copySkills(options?: {
3
+ force?: boolean;
4
+ }): {
5
+ copied: string[];
6
+ skipped: string[];
7
+ };
8
+ //# sourceMappingURL=postinstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../../src/scripts/postinstall.ts"],"names":[],"mappings":";AAiEA,wBAAgB,UAAU,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG;IAC3D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB,CA+BA"}
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.copySkills = copySkills;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const os = __importStar(require("os"));
41
+ const child_process_1 = require("child_process");
42
+ const SKILL_DIRS = [
43
+ // Public API: high-level Frontline Public API workflows (agents, workflows, billing, raw GET)
44
+ "frontline-agents",
45
+ "frontline-workflows",
46
+ "frontline-billing",
47
+ "frontline-api",
48
+ // Max CLI: Firebase-authenticated chat / admin REST
49
+ "max-chat",
50
+ "max-auth",
51
+ // Table / Object CRUD: data modelling, records, fields, relations, aggregations
52
+ "auth-and-profiles",
53
+ "crm-setup",
54
+ "crud-operations",
55
+ "pipeline-setup",
56
+ "schema-design",
57
+ "resource-creation",
58
+ "record-type-management",
59
+ "relations",
60
+ "filter-and-query",
61
+ "files",
62
+ "notes-and-tasks",
63
+ "export-and-delete",
64
+ "aggregations",
65
+ ];
66
+ function getClaudeBaseDir() {
67
+ return process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), ".claude");
68
+ }
69
+ function isClaudeInPath() {
70
+ try {
71
+ (0, child_process_1.execFileSync)("claude", ["--version"], {
72
+ timeout: 5000,
73
+ stdio: "ignore",
74
+ });
75
+ return true;
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ function isClaudeDirPresent() {
82
+ try {
83
+ return fs.statSync(getClaudeBaseDir()).isDirectory();
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ function detectClaudeCode() {
90
+ return isClaudeInPath() || isClaudeDirPresent();
91
+ }
92
+ function getSkillsSourceDir() {
93
+ // __dirname = dist/scripts/ at runtime, skills are copied to dist/skills/
94
+ return path.resolve(__dirname, "..", "skills");
95
+ }
96
+ function copySkills(options = {}) {
97
+ const sourceBase = getSkillsSourceDir();
98
+ const targetBase = path.join(getClaudeBaseDir(), "skills");
99
+ const copied = [];
100
+ const skipped = [];
101
+ for (const skillDir of SKILL_DIRS) {
102
+ const src = path.join(sourceBase, skillDir, "SKILL.md");
103
+ const destDir = path.join(targetBase, skillDir);
104
+ const dest = path.join(destDir, "SKILL.md");
105
+ if (!fs.existsSync(src)) {
106
+ skipped.push(skillDir);
107
+ continue;
108
+ }
109
+ if (!options.force && fs.existsSync(dest)) {
110
+ const content = fs.readFileSync(dest, "utf-8").trim();
111
+ if (content.length > 0) {
112
+ skipped.push(skillDir);
113
+ continue;
114
+ }
115
+ }
116
+ fs.mkdirSync(destDir, { recursive: true });
117
+ fs.copyFileSync(src, dest);
118
+ copied.push(skillDir);
119
+ }
120
+ return { copied, skipped };
121
+ }
122
+ function main() {
123
+ if (!detectClaudeCode()) {
124
+ console.log("\n@frontline/cli: Claude Code not detected.\n" +
125
+ 'Run "frontline setup --claude-skills" to install skills manually.\n');
126
+ return;
127
+ }
128
+ try {
129
+ const { copied, skipped } = copySkills();
130
+ if (copied.length > 0) {
131
+ console.log(`\n@frontline/cli: Installed ${copied.length} Claude Code skill(s) to ${path.join(getClaudeBaseDir(), "skills")}/`);
132
+ for (const s of copied)
133
+ console.log(` + ${s}`);
134
+ }
135
+ if (skipped.length > 0) {
136
+ console.log(` Skipped ${skipped.length} (already present): ${skipped.join(", ")}`);
137
+ }
138
+ if (copied.length > 0 || skipped.length > 0) {
139
+ console.log(' Use "frontline setup --claude-skills --force" to overwrite existing skills.\n');
140
+ }
141
+ }
142
+ catch (err) {
143
+ console.warn(`@frontline/cli: Could not install Claude Code skills: ${err instanceof Error ? err.message : err}`);
144
+ }
145
+ }
146
+ if (require.main === module) {
147
+ main();
148
+ }
149
+ //# sourceMappingURL=postinstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../../src/scripts/postinstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: aggregations
3
+ description: >
4
+ How to create, update, delete, and compute aggregations on views
5
+ using the Frontline CLI. Aggregations are summary statistics
6
+ (SUM, AVERAGE, COUNT_FILLED, etc.) attached to view columns.
7
+ allowed-tools: Bash(frontline:*)
8
+ ---
9
+
10
+ # Aggregations
11
+
12
+ Aggregations are summary statistics attached to a view's columns. They compute
13
+ values like SUM, AVERAGE, COUNT_FILLED, MIN, MAX across all rows matching the
14
+ current view's filters.
15
+
16
+ ## Available Operations
17
+
18
+ | Operation | Applies To | Description |
19
+ | ---------------- | -------------- | ------------------------- |
20
+ | `COUNT_EMPTY` | Any column | Count of empty/null cells |
21
+ | `COUNT_FILLED` | Any column | Count of non-empty cells |
22
+ | `PERCENT_EMPTY` | Any column | % of empty cells |
23
+ | `PERCENT_FILLED` | Any column | % of non-empty cells |
24
+ | `SUM` | Number columns | Sum of all values |
25
+ | `AVERAGE` | Number columns | Average of all values |
26
+ | `MIN` | Number/Date | Minimum value |
27
+ | `MAX` | Number/Date | Maximum value |
28
+
29
+ ## Prerequisites
30
+
31
+ You need a **view ID** and a **column ID**. Get both from:
32
+
33
+ ```bash
34
+ # Get object/table detail (includes views with their IDs)
35
+ frontline object get <object>
36
+
37
+ # Get fields (includes column IDs)
38
+ frontline object field list <object>
39
+ ```
40
+
41
+ ## List Aggregations
42
+
43
+ ```bash
44
+ frontline object aggregation list <object> <view-id>
45
+ frontline table aggregation list <table> <view-id>
46
+ ```
47
+
48
+ ## Create an Aggregation
49
+
50
+ ```bash
51
+ # SUM on a number column
52
+ frontline object aggregation create <object> <view-id> \
53
+ --data '{"columnId": 5, "operation": "SUM"}'
54
+
55
+ # COUNT_FILLED on any column
56
+ frontline object aggregation create <object> <view-id> \
57
+ --data '{"columnId": 3, "operation": "COUNT_FILLED"}'
58
+
59
+ # COUNT_FILLED scoped to a specific tag (option) ID — useful in kanban views
60
+ frontline object aggregation create <object> <view-id> \
61
+ --data '{"columnId": 8, "operation": "COUNT_FILLED", "tagId": 12}'
62
+ ```
63
+
64
+ ## Update an Aggregation
65
+
66
+ Change the operation of an existing aggregation:
67
+
68
+ ```bash
69
+ frontline object aggregation update <object> <view-id> <agg-id> \
70
+ --data '{"operation": "AVERAGE"}'
71
+ ```
72
+
73
+ ## Delete an Aggregation
74
+
75
+ ```bash
76
+ frontline object aggregation delete <object> <view-id> <agg-id>
77
+ ```
78
+
79
+ ## Compute Aggregation Values
80
+
81
+ Compute the actual numeric results for all aggregations on a view.
82
+ Optionally filter with a query or search:
83
+
84
+ ```bash
85
+ # Compute all aggregations
86
+ frontline object aggregation compute <object> <view-id>
87
+
88
+ # Compute with a filter
89
+ frontline object aggregation compute <object> <view-id> \
90
+ --query '{"path":"[Status]","operator":"containsAny","value":[3]}'
91
+
92
+ # Compute for a specific column only
93
+ frontline object aggregation compute <object> <view-id> --column-id 5
94
+ ```
95
+
96
+ ---
97
+
98
+ ## Typical Workflow
99
+
100
+ ```bash
101
+ # 1. Identify the view and columns
102
+ frontline object get sor__deals
103
+ # → view ID = 1
104
+ frontline object field list sor__deals
105
+ # → Amount column ID = 5, Status column ID = 8
106
+
107
+ # 2. Add aggregations
108
+ frontline object aggregation create sor__deals 1 \
109
+ --data '{"columnId": 5, "operation": "SUM"}'
110
+ frontline object aggregation create sor__deals 1 \
111
+ --data '{"columnId": 5, "operation": "AVERAGE"}'
112
+ frontline object aggregation create sor__deals 1 \
113
+ --data '{"columnId": 8, "operation": "COUNT_FILLED"}'
114
+
115
+ # 3. Compute results
116
+ frontline object aggregation compute sor__deals 1
117
+ # → { aggregations: [{ columnId: 5, operation: "SUM", value: 1250000 }, ...] }
118
+
119
+ # 4. Compute only for "Won" deals
120
+ frontline object aggregation compute sor__deals 1 \
121
+ --query '{"path":"[Status]","operator":"containsAny","value":[3]}'
122
+ ```