ilml-plugin-linkedin 1.2.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.
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "linkedin",
3
+ "version": "1.2.0",
4
+ "description": "LinkedIn job automation: apply, scout, sync, funnel, messages",
5
+ "commands": {
6
+ "apply": { "run": "node dist/run.mjs" },
7
+ "sync": { "run": "node dist/syncAll.mjs" },
8
+ "sync-all": { "run": "node dist/syncAll.mjs" },
9
+ "today": { "run": "node dist/syncAll.mjs --today" },
10
+ "enrich": { "run": "node dist/syncAll.mjs --enrich" },
11
+ "report": { "run": "node dist/syncAll.mjs --report" },
12
+ "scout": { "run": "node dist/scout.mjs" },
13
+ "messages": { "run": "node dist/messageBot.mjs" },
14
+ "funnel": { "run": "node dist/funnelRunner.mjs" },
15
+ "visit": { "run": "node dist/visit.mjs" },
16
+ "viewers": { "run": "node dist/viewers.mjs" },
17
+ "apply-queue": { "run": "node dist/applyQueue.mjs" },
18
+ "daily": { "run": "node dist/daily.mjs" },
19
+ "login": { "run": "node dist/src/saveLoginState.mjs" }
20
+ },
21
+ "config": {
22
+ "sections": [
23
+ {
24
+ "title": "LinkedIn account",
25
+ "fields": [
26
+ { "key": "LINKEDIN_NAME", "label": "Your full name on LinkedIn", "type": "text", "required": true, "hint": "Used to detect which messages were sent by you" },
27
+ { "key": "LINKEDIN_LOGIN", "label": "LinkedIn email", "type": "text", "required": false, "hint": "Optional — auto-fill during login only" },
28
+ { "key": "LINKEDIN_PASS", "label": "LinkedIn password", "type": "secret", "required": false, "hint": "Optional — auto-fill during login only. Never sent anywhere; stored locally (or wallet-encrypted node in graph)" }
29
+ ]
30
+ },
31
+ {
32
+ "title": "iLiveMyLife integration",
33
+ "fields": [
34
+ { "key": "NODE_EASY_APPLY_MAIN", "label": "Main tracking node ID", "type": "nodeId", "required": true, "hint": "Create a node in app.ilivemylife.io where applications are tracked, paste its ID" },
35
+ { "key": "NODE_EASY_APPLY_ERRORS", "label": "Error log node ID", "type": "nodeId", "required": true, "hint": "Node where apply errors are logged" },
36
+ { "key": "NODE_RUN_REPORTS", "label": "End-of-session reports node ID", "type": "nodeId", "required": false, "hint": "Optional. Create a node with notifications ENABLED — each session end (apply, funnel, etc.) posts a child item there with the final summary. Lets you know when a run finished, hit a quota, or errored without subscribing to noisier nodes." }
37
+ ]
38
+ },
39
+ {
40
+ "title": "Data storage",
41
+ "fields": [
42
+ { "key": "DATA_DIR", "label": "External data directory", "type": "path", "required": false, "hint": "Recommended — keeps profile/job data outside the plugin dir, survives plugin updates and syncs via cloud storage" }
43
+ ]
44
+ },
45
+ {
46
+ "title": "Apply bot (npm run apply)",
47
+ "fields": [
48
+ { "key": "City", "label": "Default city", "type": "text", "required": false, "default": "Toronto" },
49
+ { "key": "MAX_APPLY_FOR_RUN", "label": "Max applications per run", "type": "number", "required": false, "default": 50 },
50
+ { "key": "LINKEDIN_SEARCH_URL", "label": "Default job search URL", "type": "url", "required": false, "hint": "LinkedIn jobs search URL with your filters (keywords, location, f_AL=true for Easy Apply)" }
51
+ ]
52
+ },
53
+ {
54
+ "title": "Scouting (npm run scout)",
55
+ "fields": [
56
+ { "key": "LINKEDIN_SCOUT_URLS", "label": "Scouting search URLs", "type": "text", "required": false, "hint": "Comma-separated list of LinkedIn job search URLs — scouted without applying" }
57
+ ]
58
+ },
59
+ {
60
+ "title": "Resume / CV",
61
+ "fields": [
62
+ { "key": "CV_TEXT", "label": "CV snippet for messages", "type": "text", "required": false, "hint": "Shown to recruiters, e.g., 'Check my CV: https://app.ilivemylife.io/item/<node>'" },
63
+ { "key": "RESUME_PDF_URL", "label": "Resume PDF URL", "type": "url", "required": false },
64
+ { "key": "RESUME_FILENAME", "label": "Resume filename", "type": "text", "required": false, "default": "Resume.pdf" }
65
+ ]
66
+ },
67
+ {
68
+ "title": "Recruiter funnel (optional)",
69
+ "fields": [
70
+ { "key": "FUNNEL_USE_CUSTOM_MESSAGE", "label": "Send custom message with connection requests", "type": "boolean", "required": false, "default": false },
71
+ { "key": "FUNNEL_MAX_CONNECTIONS", "label": "Max connection requests per run", "type": "number", "required": false, "default": 20 },
72
+ { "key": "FUNNEL_MESSAGE", "label": "Connection request message", "type": "text", "required": false, "hint": "Use {name} placeholder, e.g., 'Hi {name}, I just applied for a role at your company'" },
73
+ { "key": "FUNNEL_EXCLUDE_LOCATIONS", "label": "Exclude these locations", "type": "text", "required": false, "hint": "Comma-separated list" }
74
+ ]
75
+ }
76
+ ]
77
+ }
78
+ }
package/package.json ADDED
@@ -0,0 +1,92 @@
1
+ {
2
+ "name": "ilml-plugin-linkedin",
3
+ "version": "1.2.0",
4
+ "description": "ilml plugin: LinkedIn job automation — apply, scout, sync, funnel, messages",
5
+ "type": "module",
6
+ "files": [
7
+ "dist",
8
+ "ilml-plugin.json"
9
+ ],
10
+ "scripts": {
11
+ "build:plugin": "node scripts/build-plugin.mjs",
12
+ "prepublishOnly": "npm run build:plugin",
13
+ "start": "npm run build:webpack && npm run serve",
14
+ "serve": "npx nodemon --exec \"npx http-server dist -c-1 -p 3111 --cors\" --watch . --ext js",
15
+ "build:webpack": "webpack --config webpack.config.js",
16
+ "login": "node src/saveLoginState.mjs",
17
+ "pack-release": "node scripts/pack-release.mjs",
18
+ "search": "node scripts/search.mjs",
19
+ "apply": "npx nodemon run.mjs",
20
+ "outreach": "node outreachBot.mjs",
21
+ "funnel": "node funnelRunner.mjs",
22
+ "funnel:list": "node funnelRunner.mjs --list",
23
+ "scout": "node scout.mjs",
24
+ "scout:list": "node scout.mjs --list",
25
+ "visit": "node visit.mjs",
26
+ "visit:list": "node visit.mjs --list",
27
+ "viewers": "node viewers.mjs --save",
28
+ "viewers:list": "node viewers.mjs --list",
29
+ "apply-queue": "node applyQueue.mjs",
30
+ "apply-queue:list": "node applyQueue.mjs --list",
31
+ "daily": "node daily.mjs",
32
+ "daily:jobs": "node daily.mjs --jobs",
33
+ "daily:comms": "node daily.mjs --comms",
34
+ "test:funnel": "node testFunnel.mjs",
35
+ "test:extract": "node testFunnel.mjs --extract-only",
36
+ "test:connect": "node testConnect.mjs",
37
+ "run": "node run.mjs",
38
+ "sync": "node syncConnections.mjs",
39
+ "messages": "node messageBot.mjs",
40
+ "messages:review": "node messageBot.mjs --review-drafts",
41
+ "messages:push": "node messageBot.mjs --push-drafts",
42
+ "messages:list": "node messageBot.mjs --list",
43
+ "read-threads": "node readHotThreads.mjs",
44
+ "sync-all": "node syncAll.mjs",
45
+ "sync-all:full": "node syncAll.mjs --full",
46
+ "sync-all:backfill": "node syncAll.mjs --backfill",
47
+ "sync-all:report": "node syncAll.mjs --report",
48
+ "sync-all:safe": "node syncAll.mjs --skip-unread",
49
+ "warm-scan": "node warmScan.mjs",
50
+ "enrich": "node syncAll.mjs --enrich",
51
+ "today": "node syncAll.mjs --today",
52
+ "fix-unknown": "node fix-unknown-senders.mjs",
53
+ "test": "echo \"Error: no test specified\" && exit 1"
54
+ },
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/iLiveMyLife/linkedInJobsAutoApply.git"
58
+ },
59
+ "keywords": [
60
+ "ilml",
61
+ "ilml-plugin",
62
+ "ilivemylife",
63
+ "linkedin",
64
+ "automation",
65
+ "puppeteer"
66
+ ],
67
+ "author": "Ilya Sorokin <info@ilivemylife.io> (https://ilivemylife.io)",
68
+ "license": "UNLICENSED",
69
+ "bugs": {
70
+ "url": "https://github.com/iLiveMyLife/linkedInJobsAutoApply/issues"
71
+ },
72
+ "homepage": "https://github.com/iLiveMyLife/linkedInJobsAutoApply#readme",
73
+ "dependencies": {
74
+ "@ilivemylife/graph-sdk": "^1.0.17",
75
+ "dotenv": "^16.4.5",
76
+ "puppeteer": "^22.15.0",
77
+ "puppeteer-extra": "^3.3.6",
78
+ "puppeteer-extra-plugin-stealth": "^2.11.2"
79
+ },
80
+ "devDependencies": {
81
+ "@babel/core": "^7.24.9",
82
+ "@babel/preset-env": "^7.24.8",
83
+ "babel-loader": "^9.1.3",
84
+ "esbuild": "^0.24.0",
85
+ "http-server": "^14.0.0",
86
+ "nodemon": "^3.1.4",
87
+ "react": "^18.3.1",
88
+ "react-dom": "^18.3.1",
89
+ "webpack": "^5.93.0",
90
+ "webpack-cli": "^5.1.4"
91
+ }
92
+ }