@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-
|
|
156
|
-
recruiter: () => import("./recruiter-
|
|
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
|
|
592
|
+
meta: { name: "new", description: "Start a new Recruiter chat with a member." },
|
|
572
593
|
args: {
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
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
|
-
|
|
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: {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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: {
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
43
|
+
"@curviate/sdk": "^0.8.0",
|
|
44
44
|
"citty": "^0.1.6"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|