@curviate/cli 0.7.1 → 0.8.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.
package/CHANGELOG.md CHANGED
@@ -8,6 +8,26 @@ a new command or flag is a minor; a breaking command/flag/exit-code change is a
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [0.8.0] - 2026-07-02
12
+
13
+ ### Added
14
+
15
+ - `recruiter reject-applicant` gained `--message` and `--notify-at` flags. The applicant is only notified of the rejection when `--message` is provided (the prior behavior — no notification — is unchanged when both are omitted). `--notify-at` schedules the notification (a UNIX-milliseconds timestamp) and requires `--message`; passing `--notify-at` alone, or a non-numeric value, is a usage error (exit `2`).
16
+ - README gained dedicated "Sales Navigator" and "Recruiter" sections with numbered, runnable examples covering every in-scope command: searching and getting profiles, saving a lead, starting a chat, listing/searching Recruiter people and hiring projects, the job create → publish → checkpoint lifecycle, listing/getting applicants, downloading a resume, and rejecting an applicant with and without a notification.
17
+
18
+ ### Changed
19
+
20
+ - **Help output cleanup:** Recruiter and Sales Navigator write commands (`add-candidate`, `add-applicant`, `reject-applicant`, `job create`/`publish`/`checkpoint`, `save-lead`, `message new`) and single-object read commands (`profile`, `project`, `applicant`, `applicant resume`) no longer advertise `--limit`/`--cursor`/`--all`/`--max-pages` in `--help` — those flags only ever applied to list/search commands, which keep them unchanged. Single-object reads keep `--fields`.
21
+ - Corrected the `search parameters --type` flag description on both `recruiter` and `sales-nav` — it previously suggested example values (`LOCATION`, `INDUSTRY`, `TITLE`) that the API does not accept for either surface; it now lists the real accepted values.
22
+ - Polished the `message new --to` flag description on both surfaces with the expected provider-ID format and a note that it is not resolved from a URL or slug.
23
+ - Updated `@curviate/sdk` dependency to `^0.8.0`. No resource method signatures changed (per the SDK 0.8.0 changelog); Recruiter's job-lifecycle endpoints (applicant get/reject/resume, applicant list, job publish/checkpoint, Recruiter profile) are now fully implemented server-side instead of returning `501`.
24
+
25
+ ## [0.7.2] - 2026-07-01
26
+
27
+ ### Changed
28
+
29
+ - Updated `@curviate/sdk` dependency to `^0.7.0`. The `recruiter message new` command output now reflects the aligned start-chat response `{ object, chat_id, message_id }` (the SDK dropped the `attendee_ids` echo and now surfaces `message_id`). The command sends the request unchanged (`attendees_ids` plus recruiter-specific flags); it renders the server response verbatim, so no command flags change.
30
+
11
31
  ## [0.7.1] - 2026-07-01
12
32
 
13
33
  ### Fixed
package/README.md CHANGED
@@ -158,6 +158,175 @@ curviate account list --all --json \
158
158
  > accounts.csv
159
159
  ```
160
160
 
161
+ ## Sales Navigator
162
+
163
+ Sales Navigator commands (`curviate sales-nav ...`) require an account with the Sales Navigator
164
+ add-on tier attached. A call against an account without it fails with **exit code `5`** and a
165
+ `TIER_NOT_ACTIVE` error body naming the required tier (`sales_nav`) — branch on the exit code the
166
+ same way as example 4 above. Write commands (`save-lead`, `message new`) accept `--preview` to
167
+ render the request without sending it.
168
+
169
+ ### 1. Search Sales Navigator profiles, then get one full profile
170
+
171
+ ```bash
172
+ curviate sales-nav search people \
173
+ --keywords "VP Engineering" \
174
+ --account acc_1 \
175
+ --limit 5 \
176
+ | jq -r '.items[0].id' \
177
+ | xargs -I{} curviate sales-nav profile {} --account acc_1
178
+ ```
179
+
180
+ ### 2. Save a lead to a specific lead list
181
+
182
+ Preview first, then send:
183
+
184
+ ```bash
185
+ curviate sales-nav save-lead ACwAAA1234567 \
186
+ --account acc_1 \
187
+ --list-id 987654 \
188
+ --preview
189
+
190
+ curviate sales-nav save-lead ACwAAA1234567 --account acc_1 --list-id 987654
191
+ ```
192
+
193
+ ### 3. Start a new Sales Navigator chat
194
+
195
+ ```bash
196
+ curviate sales-nav message new \
197
+ --to ACwAAA1234567 \
198
+ --account acc_1 \
199
+ "Hi — I'd love to connect about an opportunity at our company."
200
+ ```
201
+
202
+ ### 4. Search Sales Navigator companies
203
+
204
+ ```bash
205
+ curviate sales-nav search companies \
206
+ --keywords "series B fintech" \
207
+ --account acc_1 \
208
+ --limit 5 --json \
209
+ | jq -r '.items[] | "\(.id)\t\(.name)"'
210
+ ```
211
+
212
+ ## Recruiter
213
+
214
+ Recruiter commands (`curviate recruiter ...`) require an account with the Recruiter add-on tier
215
+ attached. A call against an account without it fails with **exit code `5`** and a `TIER_NOT_ACTIVE`
216
+ error body naming the required tier (`recruiter`). Write commands (`add-candidate`,
217
+ `add-applicant`, `reject-applicant`, `job create`/`publish`/`checkpoint`, `message new`) accept
218
+ `--preview` to render the request without sending it.
219
+
220
+ ### 1. List hiring projects
221
+
222
+ ```bash
223
+ curviate recruiter projects --account acc_1 --limit 20 --json \
224
+ | jq -r '.items[] | "\(.id)\t\(.name)"'
225
+ ```
226
+
227
+ ### 2. Create a job posting draft, then publish it (with the checkpoint flow)
228
+
229
+ Publishing can return a verification checkpoint instead of a published job — solve it with the
230
+ `job_id` from the publish response, then retry:
231
+
232
+ ```bash
233
+ curviate recruiter job create \
234
+ --account acc_1 \
235
+ --job-title "Senior Backend Engineer" \
236
+ --description "Remote-first team building the core platform." \
237
+ --employment-type FULL_TIME \
238
+ --json > draft.json
239
+
240
+ JOB_ID=$(jq -r '.job_id' draft.json)
241
+
242
+ curviate recruiter job publish "$JOB_ID" --account acc_1 --mode FREE --json > publish.json
243
+
244
+ # If publish returns a checkpoint object instead of a published job, solve it:
245
+ if [ "$(jq -r '.object // empty' publish.json)" = "job_posting_checkpoint" ]; then
246
+ curviate recruiter job checkpoint "$JOB_ID" --account acc_1 --input "123456"
247
+ fi
248
+ ```
249
+
250
+ ### 3. List applicants for a job, then get one applicant's detail
251
+
252
+ ```bash
253
+ curviate recruiter job applicants "$JOB_ID" --account acc_1 --limit 10 --json \
254
+ | jq -r '.items[0].id' \
255
+ | xargs -I{} curviate recruiter applicant {} --account acc_1
256
+ ```
257
+
258
+ ### 4. Download an applicant's resume
259
+
260
+ ```bash
261
+ curviate recruiter applicant resume APPLICANT_ID --account acc_1 -o resume.pdf
262
+ ```
263
+
264
+ ### 5. Reject an applicant, optionally notifying them
265
+
266
+ The applicant is only notified when `--message` is given; omit it to reject silently.
267
+ `--notify-at` (a UNIX-ms timestamp to schedule the notification) requires `--message`.
268
+
269
+ ```bash
270
+ # Silent rejection — no notification sent
271
+ curviate recruiter reject-applicant AEM789 \
272
+ --account acc_1 \
273
+ --hiring-project-id proj_abc \
274
+ --reason NOT_MEET_BASIC_QUALIFICATIONS
275
+
276
+ # Rejection with a notification to the applicant
277
+ curviate recruiter reject-applicant AEM789 \
278
+ --account acc_1 \
279
+ --hiring-project-id proj_abc \
280
+ --reason NOT_MEET_BASIC_QUALIFICATIONS \
281
+ --message "Thanks for applying — we've decided to move forward with other candidates." \
282
+ --preview
283
+ ```
284
+
285
+ ### 6. Search Recruiter people
286
+
287
+ ```bash
288
+ curviate recruiter search people \
289
+ --keywords "senior backend engineer" \
290
+ --account acc_1 \
291
+ --limit 5 --json \
292
+ | jq -r '.items[] | "\(.id)\t\(.full_name // .headline)"'
293
+ ```
294
+
295
+ ### 7. Add a candidate to a hiring project, then promote them to applicant
296
+
297
+ ```bash
298
+ curviate recruiter add-candidate AEM789 \
299
+ --account acc_1 \
300
+ --hiring-project-id proj_abc \
301
+ --stage UNCONTACTED
302
+
303
+ # Once they've applied, move them to the applicant pool:
304
+ curviate recruiter add-applicant AEM789 \
305
+ --account acc_1 \
306
+ --hiring-project-id proj_abc \
307
+ --stage CONTACTED
308
+ ```
309
+
310
+ ### 8. Inspect a single hiring project, then list its job postings
311
+
312
+ ```bash
313
+ curviate recruiter project proj_abc --account acc_1 --json
314
+
315
+ curviate recruiter jobs --account acc_1 --limit 10 --json \
316
+ | jq -r '.items[] | "\(.id)\t\(.title)\t\(.state)"'
317
+ ```
318
+
319
+ ### 9. Get a Recruiter-enriched profile, then start a chat with them
320
+
321
+ ```bash
322
+ curviate recruiter profile "https://www.linkedin.com/in/example" --account acc_1 --json
323
+
324
+ curviate recruiter message new \
325
+ --to AEM789 \
326
+ --account acc_1 \
327
+ "Hi — I came across your profile and think you'd be a great fit for a role we're hiring for."
328
+ ```
329
+
161
330
  ## Exit codes
162
331
 
163
332
  | Code | Meaning |
package/dist/cli.js CHANGED
@@ -152,8 +152,8 @@ var main = defineCommand({
152
152
  post: () => import("./post-KBSR3ADF.js").then((m) => m.postCommand),
153
153
  account: () => import("./account-O5GZNE72.js").then((m) => m.accountCommand),
154
154
  webhook: () => import("./webhook-F6CRIISR.js").then((m) => m.webhookCommand),
155
- "sales-nav": () => import("./sales-nav-LSBARRGL.js").then((m) => m.salesNavCommand),
156
- recruiter: () => import("./recruiter-3JHYSZPL.js").then((m) => m.recruiterCommand)
155
+ "sales-nav": () => import("./sales-nav-4DYBMHKN.js").then((m) => m.salesNavCommand),
156
+ recruiter: () => import("./recruiter-B5UIHTIN.js").then((m) => m.recruiterCommand)
157
157
  },
158
158
  async run() {
159
159
  const { runMain } = await import("citty");
@@ -29,7 +29,9 @@ import {
29
29
  resolveEffectiveConfig
30
30
  } from "./chunk-47SYFQRF.js";
31
31
  import {
32
- GLOBAL_FLAGS
32
+ GLOBAL_FLAGS,
33
+ READ_SINGLE_FLAGS,
34
+ WRITE_FLAGS
33
35
  } from "./chunk-TDYIQHQX.js";
34
36
 
35
37
  // src/commands/recruiter.ts
@@ -368,9 +370,28 @@ async function runRecruiterRejectApplicant(client, flags, out) {
368
370
  const accountId = requireAccount(flags.account, out);
369
371
  const userId = flags.userId ?? "";
370
372
  const outOpts = resolveOutputOpts(flags);
373
+ if (flags["notify-at"] && !flags.message) {
374
+ out.stderr.write(
375
+ "error: --notify-at requires --message (rejection_notification.message is required to send a notification).\n"
376
+ );
377
+ process.exit(2);
378
+ }
379
+ let notifyAt;
380
+ if (flags["notify-at"]) {
381
+ notifyAt = Number(flags["notify-at"]);
382
+ if (!Number.isFinite(notifyAt)) {
383
+ out.stderr.write("error: --notify-at must be a UNIX milliseconds timestamp (a number).\n");
384
+ process.exit(2);
385
+ }
386
+ }
371
387
  const body = {};
372
388
  if (flags["hiring-project-id"]) body["hiring_project_id"] = flags["hiring-project-id"];
373
389
  if (flags.reason) body["reason"] = flags.reason;
390
+ if (flags.message) {
391
+ const rejectionNotification = { message: flags.message };
392
+ if (notifyAt !== void 0) rejectionNotification["send_notification_at"] = notifyAt;
393
+ body["rejection_notification"] = rejectionNotification;
394
+ }
374
395
  if (flags.preview) {
375
396
  const preview = buildPreviewOutput({
376
397
  method: "recruiter.rejectApplicant",
@@ -568,14 +589,19 @@ var recruiterSyncCommand = defineCommand({
568
589
  }
569
590
  });
570
591
  var recruiterMessageNewCommand = defineCommand({
571
- meta: { name: "new", description: "Start a new Recruiter chat (InMail)." },
592
+ meta: { name: "new", description: "Start a new Recruiter chat with a member." },
572
593
  args: {
573
- ...GLOBAL_FLAGS,
574
- to: { type: "string", description: "Recipient provider ID.", required: true },
575
- text: { type: "positional", description: "Message text." },
576
- attach: { type: "string", description: "File to attach (repeatable)." },
577
- voice: { type: "string", description: "Voice message file." },
578
- video: { type: "string", description: "Video message file." }
594
+ // Write command: WRITE_FLAGS omits pagination/projection flags
595
+ ...WRITE_FLAGS,
596
+ to: {
597
+ type: "string",
598
+ description: "Recipient's LinkedIn provider ID (AE\u2026 format, e.g. from a Recruiter search result or profile). Not resolved from a URL/slug \u2014 pass the provider ID directly.",
599
+ required: true
600
+ },
601
+ text: { type: "positional", description: "Opening message text." },
602
+ attach: { type: "string", description: "File to attach (repeatable, max 7 MiB each)." },
603
+ voice: { type: "string", description: "Voice message file (max 7 MiB)." },
604
+ video: { type: "string", description: "Video message file (max 7 MiB)." }
579
605
  },
580
606
  async run({ args }) {
581
607
  const flags = args;
@@ -608,7 +634,8 @@ var recruiterMessageCommand = defineCommand({
608
634
  var recruiterProfileCommand = defineCommand({
609
635
  meta: { name: "profile", description: "Get a Recruiter enriched member profile." },
610
636
  args: {
611
- ...GLOBAL_FLAGS,
637
+ // Single-object read: READ_SINGLE_FLAGS omits pagination flags, keeps --fields
638
+ ...READ_SINGLE_FLAGS,
612
639
  identifier: { type: "positional", description: "LinkedIn URL, slug, or native id." }
613
640
  },
614
641
  async run({ args }) {
@@ -663,7 +690,11 @@ var recruiterSearchParametersCommand = defineCommand({
663
690
  meta: { name: "parameters", description: "Resolve Recruiter filter parameter IDs." },
664
691
  args: {
665
692
  ...GLOBAL_FLAGS,
666
- type: { type: "string", description: "Parameter type (e.g. LOCATION, INDUSTRY, TITLE).", required: true },
693
+ type: {
694
+ type: "string",
695
+ description: "Parameter type to resolve. One of: GROUPS, DEPARTMENT, HIRING_PROJECTS, SAVED_SEARCHES, SAVED_FILTERS, DEGREE.",
696
+ required: true
697
+ },
667
698
  keywords: { type: "string", description: "Human term to resolve (e.g. Berlin)." }
668
699
  },
669
700
  async run({ args }) {
@@ -721,7 +752,8 @@ var recruiterProjectsCommand = defineCommand({
721
752
  var recruiterProjectCommand = defineCommand({
722
753
  meta: { name: "project", description: "Get a Recruiter hiring project by ID." },
723
754
  args: {
724
- ...GLOBAL_FLAGS,
755
+ // Single-object read: READ_SINGLE_FLAGS omits pagination flags, keeps --fields
756
+ ...READ_SINGLE_FLAGS,
725
757
  projectId: { type: "positional", description: "Recruiter project ID." }
726
758
  },
727
759
  async run({ args }) {
@@ -745,7 +777,8 @@ var recruiterProjectCommand = defineCommand({
745
777
  var recruiterAddCandidateCommand = defineCommand({
746
778
  meta: { name: "add-candidate", description: "Add a member as a candidate in a hiring project." },
747
779
  args: {
748
- ...GLOBAL_FLAGS,
780
+ // Write command: WRITE_FLAGS omits pagination/projection flags
781
+ ...WRITE_FLAGS,
749
782
  userId: { type: "positional", description: "Member ID (AEM\u2026 format)." },
750
783
  "hiring-project-id": { type: "string", description: "Recruiter hiring project ID.", required: true },
751
784
  stage: { type: "string", description: "Pipeline stage (UNCONTACTED, CONTACTED, REPLIED)." }
@@ -771,7 +804,8 @@ var recruiterAddCandidateCommand = defineCommand({
771
804
  var recruiterAddApplicantCommand = defineCommand({
772
805
  meta: { name: "add-applicant", description: "Add a member as an applicant in a hiring project." },
773
806
  args: {
774
- ...GLOBAL_FLAGS,
807
+ // Write command: WRITE_FLAGS omits pagination/projection flags
808
+ ...WRITE_FLAGS,
775
809
  userId: { type: "positional", description: "Member ID (AEM\u2026 format)." },
776
810
  "hiring-project-id": { type: "string", description: "Recruiter hiring project ID.", required: true },
777
811
  stage: { type: "string", description: "Pipeline stage (UNCONTACTED, CONTACTED, REPLIED)." }
@@ -797,13 +831,22 @@ var recruiterAddApplicantCommand = defineCommand({
797
831
  var recruiterRejectApplicantCommand = defineCommand({
798
832
  meta: { name: "reject-applicant", description: "Reject an applicant from a hiring project." },
799
833
  args: {
800
- ...GLOBAL_FLAGS,
834
+ // Write command: WRITE_FLAGS omits pagination/projection flags
835
+ ...WRITE_FLAGS,
801
836
  userId: { type: "positional", description: "Member ID (AEM\u2026 format)." },
802
837
  "hiring-project-id": { type: "string", description: "Recruiter hiring project ID.", required: true },
803
838
  reason: {
804
839
  type: "string",
805
840
  description: "Rejection reason (NOT_MEET_BASIC_QUALIFICATIONS, NOT_IN_DESIRED_LOCATION, MORE_QUALIFIED_CANDIDATES, WITHDREW_APPLICATION, NOT_CONSIDERED_OR_REASON_NOT_SPECIFIED).",
806
841
  required: true
842
+ },
843
+ message: {
844
+ type: "string",
845
+ description: "Rejection notification text. The applicant is only notified when --message is provided; omit it to reject silently."
846
+ },
847
+ "notify-at": {
848
+ type: "string",
849
+ description: "UNIX milliseconds timestamp to schedule the notification (default: now). Requires --message."
807
850
  }
808
851
  },
809
852
  async run({ args }) {
@@ -848,7 +891,8 @@ var recruiterJobsCommand = defineCommand({
848
891
  var recruiterJobCreateCommand = defineCommand({
849
892
  meta: { name: "create", description: "Create a Recruiter job posting draft." },
850
893
  args: {
851
- ...GLOBAL_FLAGS,
894
+ // Write command: WRITE_FLAGS omits pagination/projection flags
895
+ ...WRITE_FLAGS,
852
896
  "body-file": { type: "string", description: "Path to a JSON file with the full job-create body." },
853
897
  body: { type: "string", description: "Read the JSON job-create body from stdin (pass '-')." },
854
898
  "job-title": { type: "string", description: "Job title text (merged over the JSON as job_title.text)." },
@@ -876,7 +920,8 @@ var recruiterJobCreateCommand = defineCommand({
876
920
  var recruiterJobPublishCommand = defineCommand({
877
921
  meta: { name: "publish", description: "Publish a Recruiter job posting draft." },
878
922
  args: {
879
- ...GLOBAL_FLAGS,
923
+ // Write command: WRITE_FLAGS omits pagination/projection flags
924
+ ...WRITE_FLAGS,
880
925
  jobId: { type: "positional", description: "Job posting ID." },
881
926
  mode: { type: "string", description: "Publish mode: FREE (default), PROMOTED, or PROMOTED_PLUS." }
882
927
  },
@@ -901,7 +946,8 @@ var recruiterJobPublishCommand = defineCommand({
901
946
  var recruiterJobCheckpointCommand = defineCommand({
902
947
  meta: { name: "checkpoint", description: "Solve a job posting publish verification checkpoint." },
903
948
  args: {
904
- ...GLOBAL_FLAGS,
949
+ // Write command: WRITE_FLAGS omits pagination/projection flags
950
+ ...WRITE_FLAGS,
905
951
  jobId: { type: "positional", description: "Job posting ID." },
906
952
  input: { type: "string", description: "Verification value (OTP or email confirmation).", required: true }
907
953
  },
@@ -965,7 +1011,8 @@ var recruiterJobCommand = defineCommand({
965
1011
  var recruiterApplicantResumeCommand = defineCommand({
966
1012
  meta: { name: "resume", description: "Download a job applicant's resume." },
967
1013
  args: {
968
- ...GLOBAL_FLAGS,
1014
+ // Single-object read: READ_SINGLE_FLAGS omits pagination flags, keeps --fields
1015
+ ...READ_SINGLE_FLAGS,
969
1016
  applicantId: { type: "positional", description: "Applicant ID." },
970
1017
  output: { type: "string", alias: "o", description: "Path to write the resume file." }
971
1018
  },
@@ -995,7 +1042,8 @@ var recruiterApplicantResumeCommand = defineCommand({
995
1042
  var recruiterApplicantCommand = defineCommand({
996
1043
  meta: { name: "applicant", description: "Recruiter job applicant operations." },
997
1044
  args: {
998
- ...GLOBAL_FLAGS,
1045
+ // Single-object read: READ_SINGLE_FLAGS omits pagination flags, keeps --fields
1046
+ ...READ_SINGLE_FLAGS,
999
1047
  applicantId: { type: "positional", description: "Applicant ID.", required: false }
1000
1048
  },
1001
1049
  subCommands: {
@@ -26,7 +26,9 @@ import {
26
26
  resolveEffectiveConfig
27
27
  } from "./chunk-47SYFQRF.js";
28
28
  import {
29
- GLOBAL_FLAGS
29
+ GLOBAL_FLAGS,
30
+ READ_SINGLE_FLAGS,
31
+ WRITE_FLAGS
30
32
  } from "./chunk-TDYIQHQX.js";
31
33
 
32
34
  // src/commands/sales-nav.ts
@@ -319,12 +321,17 @@ var salesNavSyncCommand = defineCommand({
319
321
  var salesNavMessageNewCommand = defineCommand({
320
322
  meta: { name: "new", description: "Start a new Sales Navigator chat." },
321
323
  args: {
322
- ...GLOBAL_FLAGS,
323
- to: { type: "string", description: "Recipient provider ID.", required: true },
324
- text: { type: "positional", description: "Message text." },
325
- attach: { type: "string", description: "File to attach (repeatable)." },
326
- voice: { type: "string", description: "Voice message file." },
327
- video: { type: "string", description: "Video message file." }
324
+ // Write command: WRITE_FLAGS omits pagination/projection flags
325
+ ...WRITE_FLAGS,
326
+ to: {
327
+ type: "string",
328
+ description: "Recipient's LinkedIn provider ID (ACw\u2026 format, e.g. from a Sales Navigator search result or profile). Not resolved from a URL/slug \u2014 pass the provider ID directly.",
329
+ required: true
330
+ },
331
+ text: { type: "positional", description: "Opening message text." },
332
+ attach: { type: "string", description: "File to attach (repeatable, max 7 MiB each)." },
333
+ voice: { type: "string", description: "Voice message file (max 7 MiB)." },
334
+ video: { type: "string", description: "Video message file (max 7 MiB)." }
328
335
  },
329
336
  async run({ args }) {
330
337
  const flags = args;
@@ -417,7 +424,11 @@ var salesNavSearchParametersCommand = defineCommand({
417
424
  meta: { name: "parameters", description: "Resolve Sales Navigator filter parameter IDs." },
418
425
  args: {
419
426
  ...GLOBAL_FLAGS,
420
- type: { type: "string", description: "Parameter type (e.g. LOCATION, INDUSTRY, TITLE).", required: true },
427
+ type: {
428
+ type: "string",
429
+ description: "Parameter type to resolve. One of: GROUPS, SALES_INDUSTRY, DEPARTMENT, PERSONA, ACCOUNT_LISTS, LEAD_LISTS, TECHNOLOGIES, SAVED_ACCOUNTS, SAVED_SEARCHES, RECENT_SEARCHES, REGION, POSTAL_CODE.",
430
+ required: true
431
+ },
421
432
  keywords: { type: "string", description: "Human term to resolve (e.g. Berlin)." }
422
433
  },
423
434
  async run({ args }) {
@@ -455,7 +466,8 @@ var salesNavSearchCommand = defineCommand({
455
466
  var salesNavProfileCommand = defineCommand({
456
467
  meta: { name: "profile", description: "Get a Sales Navigator enriched member profile." },
457
468
  args: {
458
- ...GLOBAL_FLAGS,
469
+ // Single-object read: READ_SINGLE_FLAGS omits pagination flags, keeps --fields
470
+ ...READ_SINGLE_FLAGS,
459
471
  identifier: { type: "positional", description: "LinkedIn URL, slug, or native id." }
460
472
  },
461
473
  async run({ args }) {
@@ -479,7 +491,8 @@ var salesNavProfileCommand = defineCommand({
479
491
  var salesNavSaveLeadCommand = defineCommand({
480
492
  meta: { name: "save-lead", description: "Save a Sales Navigator member as a lead." },
481
493
  args: {
482
- ...GLOBAL_FLAGS,
494
+ // Write command: WRITE_FLAGS omits pagination/projection flags
495
+ ...WRITE_FLAGS,
483
496
  userId: { type: "positional", description: "Sales Navigator member ID (ACw\u2026 format)." },
484
497
  "list-id": { type: "string", description: "Lead list ID to save the lead into." }
485
498
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curviate/cli",
3
- "version": "0.7.1",
3
+ "version": "0.8.0",
4
4
  "private": false,
5
5
  "description": "Official command-line interface for the Curviate API.",
6
6
  "license": "MIT",
@@ -40,7 +40,7 @@
40
40
  "clean": "rm -rf dist *.tsbuildinfo"
41
41
  },
42
42
  "dependencies": {
43
- "@curviate/sdk": "^0.6.0",
43
+ "@curviate/sdk": "^0.8.0",
44
44
  "citty": "^0.1.6"
45
45
  },
46
46
  "devDependencies": {