ilml-plugin-linkedin 1.2.2 → 1.3.1
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 +16 -0
- package/README.md +118 -52
- package/dist/funnelRunner.mjs +20 -18
- package/dist/messageBot.mjs +101 -101
- package/dist/run.mjs +38 -38
- package/dist/scout.mjs +86 -86
- package/dist/src/saveLoginState.mjs +3 -3
- package/dist/syncAll.mjs +98 -98
- package/dist/viewers.mjs +85 -85
- package/dist/visit.mjs +85 -85
- package/dist/warmScan.mjs +5 -0
- package/ilml-plugin.json +2 -1
- package/package.json +11 -4
- package/target-companies.json +58 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import"dotenv/config";import*as l from"fs";import*as s from"path";import{fileURLToPath as A}from"url";var g=s.dirname(A(import.meta.url)),y=process.env.DATA_DIR?s.resolve(process.env.DATA_DIR,"collected-profiles"):s.join(g,"collected-profiles"),a={};for(let n of process.argv.slice(2)){let e=n.match(/^--([^=]+)(?:=(.*))?$/);e&&(a[e[1]]=e[2]??!0)}var h=a.group||"apiLeaders",d=a["min-seniority"]||null,v=!!a["show-all"],S=[process.env.DATA_DIR&&s.resolve(process.env.DATA_DIR,"target-companies.json"),s.join(g,"target-companies.json"),s.resolve(g,"..","target-companies.json")].filter(Boolean),C=S.find(n=>l.existsSync(n));C||(console.error(`target-companies.json not found. Tried:
|
|
2
|
+
`+S.join(`
|
|
3
|
+
`)),console.error("Set DATA_DIR and place your own target-companies.json there, or reinstall the plugin to restore the shipped default."),process.exit(1));var j=JSON.parse(l.readFileSync(C,"utf8")),u=a.companies?String(a.companies).split(",").map(n=>n.trim()).filter(Boolean):j[h]?.companies;u||(console.error(`Unknown group: ${h}. Available: ${Object.keys(j).join(", ")}`),process.exit(1));var R=JSON.parse(l.readFileSync(s.join(y,"people.json"),"utf8")),b=JSON.parse(l.readFileSync(s.join(y,"conversations.json"),"utf8")),m=new Map;for(let[n,e]of Object.entries(b))typeof e.isConnection=="boolean"&&m.set(n,{isConnection:e.isConnection,conv:e});function k(n){if(n.name&&m.has(n.name)){let e=m.get(n.name);return{is:e.isConnection,src:"A.convInbox",conv:e.conv}}return n.connectionDegree==="1st"?{is:!0,src:"B.profileScrape"}:n.connectionDegree==="2nd"||n.connectionDegree==="3rd"?{is:!1,src:"B.profileScrape"}:n.connectionStatus==="connected"?{is:!0,src:"C.botStatus"}:["sent_without_note","sent_with_note","withdrawn","rejected"].includes(n.connectionStatus)?{is:!1,src:"C.botStatus"}:{is:null,src:null}}var $={intern:0,junior:1,mid:2,senior:3,lead:4,staff:4,principal:5,director:5,vp:6};function O(n,e){if(!e)return!0;if(!n)return!1;let r=n.toLowerCase(),i=$[e.toLowerCase()];if(i==null)return!0;for(let[o,t]of Object.entries($))if(r.includes(o)&&t>=i)return!0;return!1}function T(n,e){return[n.company,n.title,e?.personContext?.title,e?.personContext?.company].filter(Boolean).join(" | ").toLowerCase()}function x(n){let e=n.toLowerCase().replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`\\b${e}\\b`,"i")}var B=u.map(n=>({name:n,re:x(n)})),p={};for(let n of u)p[n]={connected:[],notConnected:[],unknown:[]};for(let[n,e]of Object.entries(R)){let r=e.name?b[e.name]:null,i=T(e,r);if(i)for(let{name:o,re:t}of B){if(!t.test(i))continue;if(!O(e.title||r?.personContext?.title,d))break;let c=k(e),f={name:e.name||n.slice(-40),title:e.title||r?.personContext?.title||"",company:e.company,degree:e.connectionDegree,via:c.src,convStatus:c.conv?.conversationStatus,lastMsg:c.conv?.lastMessageTime,lastBy:c.conv?.lastMessageBy,category:c.conv?.category||e.category};c.is===!0?p[o].connected.push(f):c.is===!1?p[o].notConnected.push(f):p[o].unknown.push(f);break}}var _=d?` (min-seniority=${d})`:"";console.log(`
|
|
4
|
+
\u2550\u2550 Warm-scan: ${h}${_} \u2014 ${u.length} target companies \u2550\u2550
|
|
5
|
+
`);var I=Object.entries(p).sort((n,e)=>e[1].connected.length-n[1].connected.length),w=0;for(let[n,e]of I){let r=e.connected.length+e.notConnected.length+e.unknown.length;w+=e.connected.length;let i=`${n.padEnd(18)} connected: ${e.connected.length}, other: ${e.notConnected.length+e.unknown.length}, total seen: ${r}`;if(console.log(i),e.connected.length>0)for(let t of e.connected){let c=(t.title||"").slice(0,55),f=t.convStatus?` [${t.convStatus}]`:"",D=t.lastMsg?` (${t.lastMsg.slice(0,10)})`:"";console.log(` \xB7 ${t.name.padEnd(28)} ${c}${f}${D}`)}let o=[...e.notConnected,...e.unknown];if(o.length>0&&(v||o.length<=5)){console.log(" seen but not 1st-degree:");for(let t of o.slice(0,v?o.length:5))console.log(` ${t.name.padEnd(28)} ${(t.title||"").slice(0,55)}`)}else o.length>5&&console.log(` seen but not 1st-degree: ${o.length} \u2014 add --show-all or --companies="${n}" to expand`);console.log("")}console.log(`Total 1st-degree at target companies: ${w}`);
|
package/ilml-plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "linkedin",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "LinkedIn job automation: apply, scout, sync, funnel, messages",
|
|
5
5
|
"commands": {
|
|
6
6
|
"apply": { "run": "node dist/run.mjs" },
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"visit": { "run": "node dist/visit.mjs" },
|
|
16
16
|
"viewers": { "run": "node dist/viewers.mjs" },
|
|
17
17
|
"apply-queue": { "run": "node dist/applyQueue.mjs" },
|
|
18
|
+
"warm-scan": { "run": "node dist/warmScan.mjs" },
|
|
18
19
|
"daily": { "run": "node dist/daily.mjs" },
|
|
19
20
|
"login": { "run": "node dist/src/saveLoginState.mjs" }
|
|
20
21
|
},
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ilml-plugin-linkedin",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "ilml plugin:
|
|
3
|
+
"version": "1.3.1",
|
|
4
|
+
"description": "ilml plugin: pull your LinkedIn graph (connections, threads, notes) into iLiveMyLife and run inbox sync, AI-drafted replies, Easy Apply, and recruiter outreach from the terminal.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
8
8
|
"ilml-plugin.json",
|
|
9
|
+
"target-companies.json",
|
|
9
10
|
"CHANGELOG.md"
|
|
10
11
|
],
|
|
11
12
|
"scripts": {
|
|
@@ -62,7 +63,13 @@
|
|
|
62
63
|
"ilml-plugin",
|
|
63
64
|
"ilivemylife",
|
|
64
65
|
"linkedin",
|
|
65
|
-
"
|
|
66
|
+
"linkedin-bot",
|
|
67
|
+
"linkedin-automation",
|
|
68
|
+
"easy-apply",
|
|
69
|
+
"job-search",
|
|
70
|
+
"inbox-sync",
|
|
71
|
+
"recruiter-outreach",
|
|
72
|
+
"ai-messaging",
|
|
66
73
|
"puppeteer"
|
|
67
74
|
],
|
|
68
75
|
"author": "Ilya Sorokin <info@ilivemylife.io> (https://ilivemylife.io)",
|
|
@@ -72,7 +79,7 @@
|
|
|
72
79
|
},
|
|
73
80
|
"homepage": "https://github.com/iLiveMyLife/linkedInJobsAutoApply#readme",
|
|
74
81
|
"dependencies": {
|
|
75
|
-
"@ilivemylife/graph-sdk": "^1.0.
|
|
82
|
+
"@ilivemylife/graph-sdk": "^1.0.18",
|
|
76
83
|
"dotenv": "^16.4.5",
|
|
77
84
|
"puppeteer": "^22.15.0",
|
|
78
85
|
"puppeteer-extra": "^3.3.6",
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"apiLeaders": {
|
|
3
|
+
"description": "API/AI industry leaders (original focus). Substring match, word-boundary.",
|
|
4
|
+
"companies": [
|
|
5
|
+
"Anthropic",
|
|
6
|
+
"OpenAI",
|
|
7
|
+
"Stripe",
|
|
8
|
+
"Plaid",
|
|
9
|
+
"Twilio",
|
|
10
|
+
"Mastercard",
|
|
11
|
+
"Visa",
|
|
12
|
+
"Square",
|
|
13
|
+
"Block",
|
|
14
|
+
"Ramp",
|
|
15
|
+
"Retool",
|
|
16
|
+
"Linear",
|
|
17
|
+
"Cohere",
|
|
18
|
+
"Hugging Face",
|
|
19
|
+
"Scale AI"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"topPaying": {
|
|
23
|
+
"description": "FAANG + tier-1 tech + top AI + high-comp fintech/SaaS — senior engineer total comp typically $300K+. Broader target when user isn't picky about domain, only about pay.",
|
|
24
|
+
"companies": [
|
|
25
|
+
"Meta",
|
|
26
|
+
"Google",
|
|
27
|
+
"Amazon",
|
|
28
|
+
"Apple",
|
|
29
|
+
"Netflix",
|
|
30
|
+
"Microsoft",
|
|
31
|
+
"Uber",
|
|
32
|
+
"Airbnb",
|
|
33
|
+
"LinkedIn",
|
|
34
|
+
"Pinterest",
|
|
35
|
+
"Anthropic",
|
|
36
|
+
"OpenAI",
|
|
37
|
+
"Cohere",
|
|
38
|
+
"Databricks",
|
|
39
|
+
"Snowflake",
|
|
40
|
+
"Hugging Face",
|
|
41
|
+
"Scale AI",
|
|
42
|
+
"Stripe",
|
|
43
|
+
"Plaid",
|
|
44
|
+
"Mastercard",
|
|
45
|
+
"Visa",
|
|
46
|
+
"Square",
|
|
47
|
+
"Block",
|
|
48
|
+
"Ramp",
|
|
49
|
+
"Datadog",
|
|
50
|
+
"MongoDB",
|
|
51
|
+
"Figma",
|
|
52
|
+
"Notion",
|
|
53
|
+
"HashiCorp",
|
|
54
|
+
"Retool",
|
|
55
|
+
"Linear"
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
}
|