ilml-plugin-linkedin 1.2.1 → 1.3.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 +39 -0
- package/README.md +82 -136
- 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/ilml-plugin.json +1 -1
- package/package.json +3 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 1.3.0
|
|
4
|
+
- **Behavior change — LinkedIn session cookies now live in the active ilml scope** instead of in the plugin install directory. New path: `<scope>/.ilivemylife/plugins-state/linkedin/cookies.json` (production) / `./cookies.json` next to `ilml-plugin.json` (dev mode, unchanged). This means:
|
|
5
|
+
- `ilml plugin update linkedin` no longer wipes your LinkedIn session — sessions survive plugin updates
|
|
6
|
+
- `ilml logout` correctly clears the LinkedIn session in that scope (alongside other user-tied data)
|
|
7
|
+
- Different ilml login scopes (e.g. global vs `--local` per project) hold separate LinkedIn sessions — useful for multiple LinkedIn accounts
|
|
8
|
+
- **One-time:** after upgrading to 1.3.0, run `ilml linkedin login` once. The old session was inside the install dir which got wiped by the upgrade
|
|
9
|
+
- README rewritten with marketing-first framing — leads with what users *get* (your LinkedIn data finally yours, AI-assisted messaging, terminal-first automation, Easy Apply that actually thinks) before diving into install/configure
|
|
10
|
+
- New section: **Save AI tokens — tune the node settings** — explains how to use `ilml editSettings` to set `intelligence: disabled` (cheaper model) and `rootAccess: disabled` (skip whole-graph context lookup) on the Easy Apply node to control token spend
|
|
11
|
+
- Improved **Where things live** table — clearer per-row "wiped on plugin update?" / "wiped on `ilml logout`?" columns; explicitly highlights that `DATA_DIR` survives both
|
|
12
|
+
- Internal: new `src/cookiesStore.mjs` is the single source of truth for cookie path resolution. All cookie readers/writers in published entries (`src/browser.mjs`, `src/saveLoginState.mjs`, `run.mjs`, `funnelRunner.mjs`) go through it. SDK and CLI APIs unchanged
|
|
13
|
+
|
|
14
|
+
## 1.2.2
|
|
15
|
+
- README polish based on real-user feedback:
|
|
16
|
+
- Cleaner top — removed the metadata bullet list (npm/tracker/license) that was the very first thing visitors saw on the npm page; now opens straight into "What it does"
|
|
17
|
+
- Removed the entire `Developer Notes` section — it was internal-only and not useful for end users (release process and architecture notes live in `CLAUDE.md` and the SDK's plugin spec)
|
|
18
|
+
- Clarified the `LINKEDIN_SEARCH_URL` instruction (no more raw URL parameters like `f_AL=true` — just "open LinkedIn → Jobs, set filters, copy URL")
|
|
19
|
+
- New **Author & contact** section with personal page, LinkedIn, and a **DigitalTwins.team** call-to-action for custom plugin development
|
|
20
|
+
- `CHANGELOG.md` is now shipped in the npm tarball (added to `package.json#files`), so the npm package page renders release notes next to the README
|
|
21
|
+
- New **Feedback & support** section in the README pointing at a dedicated **Support** node in iLiveMyLife (`0000019dde81b04f-2e534bb8ebad0000`) — users can write directly to the maintainer via the in-graph messenger or `ilml send` from the terminal
|
|
22
|
+
|
|
23
|
+
## 1.2.1
|
|
24
|
+
- Documentation overhaul — `README.md` rewritten in English, split into **User Guide** (install, configure, run, update) and **Developer Notes** (release process, architecture, security checklist)
|
|
25
|
+
- Removed outdated `.env`-based user instructions — the plugin is now fully self-configuring via `ilml plugin install linkedin` + first-run prompts (or `ilml plugin config linkedin set KEY VALUE`)
|
|
26
|
+
- Added `CHANGELOG.md` (this file)
|
|
27
|
+
- Added `CLAUDE.md` — project-level guide for the AI assistant covering release process and key architecture pointers
|
|
28
|
+
- Added a `Releases` node in the iLiveMyLife graph for in-app release notifications
|
|
29
|
+
|
|
30
|
+
## 1.2.0
|
|
31
|
+
- First public publish on npm as `ilml-plugin-linkedin`
|
|
32
|
+
- `src/config.mjs` refactored to use `getPluginConfig()` from `@ilivemylife/graph-sdk` v1.0.17
|
|
33
|
+
- Resolved configuration is merged into `process.env` so the rest of the codebase (16+ files reading `process.env.X`) keeps working unchanged
|
|
34
|
+
- The manual `LINKEDIN_NAME` bootstrap check is removed — schema validation in the SDK handles it
|
|
35
|
+
- Works in both **production** (`ilml linkedin <command>`) and **development** (`node run.mjs` with `.env` next to manifest), without any code changes between modes
|
|
36
|
+
- Bumped `@ilivemylife/graph-sdk` peer to `^1.0.17`
|
|
37
|
+
- `package.json` polish for npm publish — `author`, `license: UNLICENSED`, `keywords`, strict `files: ["dist", "ilml-plugin.json"]` whitelist
|
|
38
|
+
- `ilml-plugin.json` declares config via `config.sections[].fields[]` (richer manifest format supported by SDK 1.0.17): grouped fields with `label`, `hint`, types (`text`, `secret`, `path`, `nodeId`, `url`, `number`, `boolean`)
|
|
39
|
+
- All sensitive files (`.env`, `cookies.json`, raw sources, internal handoff docs, runtime data) excluded from the npm tarball via `.npmignore`
|
package/README.md
CHANGED
|
@@ -1,33 +1,26 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Your LinkedIn — finally yours
|
|
2
2
|
|
|
3
|
-
LinkedIn
|
|
3
|
+
LinkedIn keeps your **connections, conversations, and the notes you write about people** locked inside their interface. You can't export message threads. You can't query an AI on your own contact history. You can't run batch operations from a script. You can't keep a personal database of who said what when.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
- **Tracker / Releases (in iLiveMyLife):** open the **Releases** node inside the **LinkedIn Automation** project in your iLiveMyLife app
|
|
7
|
-
- **License:** UNLICENSED — all rights reserved
|
|
5
|
+
This plugin pulls all of that onto your machine and into your [iLiveMyLife](https://ilivemylife.io) knowledge graph — where it's searchable, syncable, AI-queryable, and yours to keep forever. Even if you uninstall the plugin or switch ilml accounts, **your accumulated data stays where you put it**.
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
## What it does
|
|
7
|
+
It also automates LinkedIn from the terminal — applying to jobs, drafting outreach, processing recruiter funnels — so you can script what LinkedIn's web UI makes you do one click at a time.
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
---
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
- **Inbox sync** — scans LinkedIn messages, detects changes, and mirrors threads into your graph.
|
|
17
|
-
- **Message bot** — draft → review → send batch messaging workflow (you approve before anything is sent).
|
|
18
|
-
- **Connection funnel** — process recruiter / founder / investor profiles in batches (connect, skip, message).
|
|
19
|
-
- **Scout** — find jobs without applying; reports back which match your filters.
|
|
20
|
-
- **Profile activity** — track who viewed your profile, who you visited, etc.
|
|
11
|
+
## What you get
|
|
21
12
|
|
|
22
|
-
|
|
13
|
+
- **A full local mirror of your LinkedIn graph.** Connections, conversation threads, message history, profile metadata, your private notes about people — synced into your iLiveMyLife graph and a local database. Nothing stays trapped in linkedin.com.
|
|
14
|
+
- **AI-assisted messaging.** [Lifebot](https://ilivemylife.io) reads the full context of each thread (history, your notes, tags) and helps you draft replies in your voice. No copy-pasting into ChatGPT, no losing context, no generic templates.
|
|
15
|
+
- **Terminal-first automation.** Batch operations — apply to dozens of jobs at once, draft 50 outreach messages then review them all in one pass, run a connection campaign on a schedule. Scriptable. Re-runnable. Logged.
|
|
16
|
+
- **Easy Apply that actually thinks.** Auto-fills LinkedIn job applications, with Lifebot answering custom questions ("Why are you interested in this role?") in your voice using context from your graph — not boilerplate.
|
|
17
|
+
- **Your data outlives the plugin.** The connection database, conversation history, and your notes live in a directory **you** choose (`DATA_DIR`). Plugin updates don't wipe them. Logging out of ilml doesn't wipe them. Uninstalling the plugin doesn't wipe them. Only **you** decide when they go.
|
|
23
18
|
|
|
24
19
|
---
|
|
25
20
|
|
|
26
|
-
# User Guide
|
|
27
|
-
|
|
28
21
|
## Prerequisites
|
|
29
22
|
|
|
30
|
-
- **Node.js 18+** — [download](https://nodejs.org/) (the
|
|
23
|
+
- **Node.js 18+** — [download](https://nodejs.org/) (the LTS version is fine).
|
|
31
24
|
- **iLiveMyLife account** — free signup at [iLiveMyLife.io](https://ilivemylife.io).
|
|
32
25
|
- **LinkedIn account** — your personal one.
|
|
33
26
|
|
|
@@ -48,9 +41,9 @@ ilml login
|
|
|
48
41
|
ilml plugin install linkedin
|
|
49
42
|
```
|
|
50
43
|
|
|
51
|
-
|
|
44
|
+
The bare-name `linkedin` resolves to `npm:ilml-plugin-linkedin` via the ilml plugin convention. The CLI downloads the latest version from npm, extracts it under `~/.ilivemylife/plugins/linkedin/`, and runs `npm install` for runtime dependencies (mainly Puppeteer's bundled Chromium — first install takes a couple of minutes).
|
|
52
45
|
|
|
53
|
-
Verify
|
|
46
|
+
Verify:
|
|
54
47
|
|
|
55
48
|
```bash
|
|
56
49
|
ilml plugin list
|
|
@@ -59,7 +52,7 @@ ilml linkedin
|
|
|
59
52
|
|
|
60
53
|
## Configure
|
|
61
54
|
|
|
62
|
-
The
|
|
55
|
+
The first time you run `ilml linkedin <command>`, the CLI will prompt for required fields. You can also pre-configure:
|
|
63
56
|
|
|
64
57
|
```bash
|
|
65
58
|
ilml plugin config linkedin set LINKEDIN_NAME "Your Full Name"
|
|
@@ -67,18 +60,16 @@ ilml plugin config linkedin set NODE_EASY_APPLY_MAIN <node-id>
|
|
|
67
60
|
ilml plugin config linkedin set NODE_EASY_APPLY_ERRORS <node-id>
|
|
68
61
|
```
|
|
69
62
|
|
|
70
|
-
|
|
71
|
-
|
|
63
|
+
Inspect (secrets masked):
|
|
72
64
|
```bash
|
|
73
65
|
ilml plugin config linkedin
|
|
74
66
|
```
|
|
75
67
|
|
|
76
|
-
|
|
77
|
-
|
|
68
|
+
Change later or wipe:
|
|
78
69
|
```bash
|
|
79
70
|
ilml plugin config linkedin set LINKEDIN_NAME "New Name"
|
|
80
71
|
ilml plugin config linkedin unset OPTIONAL_KEY
|
|
81
|
-
ilml plugin config linkedin reset
|
|
72
|
+
ilml plugin config linkedin reset # re-prompt on next run
|
|
82
73
|
```
|
|
83
74
|
|
|
84
75
|
### Configuration fields
|
|
@@ -86,15 +77,15 @@ ilml plugin config linkedin reset # wipe all; will re-promp
|
|
|
86
77
|
| Section | Field | Required | What it is |
|
|
87
78
|
|---|---|---|---|
|
|
88
79
|
| LinkedIn account | `LINKEDIN_NAME` | yes | Your full name **exactly** as it appears on LinkedIn (used to identify your own messages in threads). |
|
|
89
|
-
| | `LINKEDIN_LOGIN` | no | LinkedIn email — only used for auto-fill during one-time login. |
|
|
90
|
-
| | `LINKEDIN_PASS` | no, secret | LinkedIn password —
|
|
80
|
+
| | `LINKEDIN_LOGIN` | no | LinkedIn email — only used for auto-fill during one-time browser login. |
|
|
81
|
+
| | `LINKEDIN_PASS` | no, secret | LinkedIn password — auto-fill only. Stored locally on disk; never sent anywhere. |
|
|
91
82
|
| iLiveMyLife integration | `NODE_EASY_APPLY_MAIN` | yes | Node ID where job applications are tracked. See "Setting up your graph" below. |
|
|
92
83
|
| | `NODE_EASY_APPLY_ERRORS` | yes | Node ID where Easy Apply errors are logged. |
|
|
93
84
|
| | `NODE_RUN_REPORTS` | no | Node ID where end-of-session summaries are posted (enable notifications on it to get pings when long jobs finish). |
|
|
94
|
-
| Data storage | `DATA_DIR` | no | Absolute path to a directory for
|
|
85
|
+
| Data storage | `DATA_DIR` | no | Absolute path to a directory for your local databases (connections, conversations, profile cache). **Strongly recommended** — keeps your accumulated data outside the plugin install folder so it survives plugin updates, ilml logout, and reinstalls. |
|
|
95
86
|
| Apply bot | `City` | no | Default city for filters. Default: `Toronto`. |
|
|
96
87
|
| | `MAX_APPLY_FOR_RUN` | no | Stop after this many applications per run. Default: `50`. |
|
|
97
|
-
| | `LINKEDIN_SEARCH_URL` | no | Default LinkedIn jobs search URL
|
|
88
|
+
| | `LINKEDIN_SEARCH_URL` | no | Default LinkedIn jobs search URL. Open LinkedIn → Jobs, set your filters, make sure Easy Apply is on, copy the resulting URL from the address bar. |
|
|
98
89
|
| Scouting | `LINKEDIN_SCOUT_URLS` | no | Comma-separated job search URLs to scan without applying. |
|
|
99
90
|
| Resume / CV | `CV_TEXT`, `RESUME_PDF_URL`, `RESUME_FILENAME` | no | CV snippet, public PDF URL, suggested filename. Used in messages to recruiters. |
|
|
100
91
|
| Funnel | `FUNNEL_USE_CUSTOM_MESSAGE` | no | Send a custom note with connection requests. Default: `false`. |
|
|
@@ -129,9 +120,27 @@ The Easy Apply bot uses iLiveMyLife's AI assistant (**Lifebot**) to answer custo
|
|
|
129
120
|
|
|
130
121
|
7. Create a sibling node titled **"Easy Apply Errors"** (no AI needed). Copy its ID and set it: `ilml plugin config linkedin set NODE_EASY_APPLY_ERRORS <id>`.
|
|
131
122
|
|
|
123
|
+
### Save AI tokens — tune the node settings
|
|
124
|
+
|
|
125
|
+
Lifebot uses AI tokens for every form question it answers. Two settings on the Easy Apply node let you tune cost vs. quality without touching the plugin:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# Use a cheaper, faster AI model (good enough for filling forms):
|
|
129
|
+
ilml editSettings <NODE_EASY_APPLY_MAIN> --intelligence disabled
|
|
130
|
+
|
|
131
|
+
# Skip whole-graph context lookup — just use this node's description:
|
|
132
|
+
ilml editSettings <NODE_EASY_APPLY_MAIN> --rootAccess disabled
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
`intelligence: disabled` switches Lifebot to a cheaper model (think GPT-3.5 / Claude Haiku tier instead of GPT-4 / Claude Opus). For application form filling, the cheap model is usually fine — questions are mechanical.
|
|
136
|
+
|
|
137
|
+
`rootAccess: disabled` stops Lifebot from searching your entire knowledge graph for context every time it answers. The Easy Apply node's description and child nodes already have everything Lifebot needs — extra context costs tokens for no benefit.
|
|
138
|
+
|
|
139
|
+
To switch back: pass `--intelligence enabled` or `--rootAccess enabled`. To reset to your account default: pass `null`.
|
|
140
|
+
|
|
132
141
|
## First-time LinkedIn login
|
|
133
142
|
|
|
134
|
-
LinkedIn requires an authenticated session, so a one-time
|
|
143
|
+
LinkedIn requires an authenticated browser session, so a one-time login is needed:
|
|
135
144
|
|
|
136
145
|
```bash
|
|
137
146
|
ilml linkedin login
|
|
@@ -139,6 +148,12 @@ ilml linkedin login
|
|
|
139
148
|
|
|
140
149
|
A real browser window opens. Sign in to LinkedIn (manually solve any captcha or 2FA). When you see your feed, close the window — your session cookies are saved locally for future runs.
|
|
141
150
|
|
|
151
|
+
Sessions live in your active ilml scope (`<scope>/.ilivemylife/plugins-state/linkedin/cookies.json`), so:
|
|
152
|
+
|
|
153
|
+
- Different ilml scopes (e.g. `ilml login` globally vs `ilml login --local` in a project folder) keep **separate** LinkedIn sessions — useful if you have multiple LinkedIn accounts.
|
|
154
|
+
- Plugin updates do **not** wipe your session — you don't need to re-login after `ilml plugin update linkedin`.
|
|
155
|
+
- `ilml logout` does wipe the session in that scope (alongside other user-tied data) — clean handoff between users on a shared machine.
|
|
156
|
+
|
|
142
157
|
## Daily commands
|
|
143
158
|
|
|
144
159
|
| Command | What it does |
|
|
@@ -156,11 +171,11 @@ A real browser window opens. Sign in to LinkedIn (manually solve any captcha or
|
|
|
156
171
|
| `ilml linkedin daily` | Compound routine combining several commands. |
|
|
157
172
|
| `ilml linkedin login` | Re-save LinkedIn cookies after a session expires. |
|
|
158
173
|
|
|
159
|
-
Run `ilml linkedin` (no subcommand) to see the list
|
|
174
|
+
Run `ilml linkedin` (no subcommand) any time to see the list.
|
|
160
175
|
|
|
161
176
|
## Updating
|
|
162
177
|
|
|
163
|
-
Updates ship via npm. The CLI checks the registry and only downloads when
|
|
178
|
+
Updates ship via npm. The CLI checks the registry and only downloads when a newer version is actually available:
|
|
164
179
|
|
|
165
180
|
```bash
|
|
166
181
|
ilml plugin update linkedin # check this plugin
|
|
@@ -169,20 +184,27 @@ ilml update # update the SDK and all plugins together
|
|
|
169
184
|
```
|
|
170
185
|
|
|
171
186
|
You'll see one of:
|
|
172
|
-
- `linkedin: already on latest version (1.
|
|
173
|
-
- `linkedin: 1.
|
|
187
|
+
- `linkedin: already on latest version (1.3.0)` — nothing downloaded
|
|
188
|
+
- `linkedin: 1.3.0 → 1.3.1` then re-install — newer version pulled
|
|
174
189
|
|
|
175
|
-
Your
|
|
190
|
+
**Your config and your data both survive updates.** Only the plugin code dir gets refreshed; everything user-tied lives elsewhere.
|
|
176
191
|
|
|
177
|
-
## Where
|
|
192
|
+
## Where things live
|
|
178
193
|
|
|
179
|
-
| Path | What's there |
|
|
194
|
+
| Path | What's there | Wiped on plugin update? | Wiped on `ilml logout`? |
|
|
180
195
|
|---|---|---|---|
|
|
181
|
-
| `~/.ilivemylife/plugins/linkedin/` | Plugin code (re-extracted
|
|
182
|
-
|
|
|
183
|
-
|
|
|
196
|
+
| `~/.ilivemylife/plugins/linkedin/` | Plugin code | yes (re-extracted) | no |
|
|
197
|
+
| `<scope>/.ilivemylife/plugins-state/linkedin.json` | Your configured values (LINKEDIN_NAME, node IDs, etc.) | no | yes (with that scope) |
|
|
198
|
+
| `<scope>/.ilivemylife/plugins-state/linkedin/cookies.json` | LinkedIn session cookies | no | yes (with that scope) |
|
|
199
|
+
| Directory you set as `DATA_DIR` | Local DBs, scraped profiles, message history, your notes | **no** | **no** |
|
|
200
|
+
|
|
201
|
+
If you didn't set `DATA_DIR`, runtime data files default to inside the plugin's install dir — meaning a plugin reinstall **wipes them**. Setting `DATA_DIR` to a sibling folder like `~/linkedin-plugin-data/` is **strongly recommended**:
|
|
184
202
|
|
|
185
|
-
|
|
203
|
+
```bash
|
|
204
|
+
ilml plugin config linkedin set DATA_DIR /absolute/path/to/your/linkedin-data
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Once set, you can sync `DATA_DIR` to a backup drive, a cloud folder, or another machine — the data is plain SQLite-style JSON, fully portable.
|
|
186
208
|
|
|
187
209
|
## Removing the plugin
|
|
188
210
|
|
|
@@ -190,113 +212,37 @@ If you didn't set `DATA_DIR`, data files default to inside the plugin's install
|
|
|
190
212
|
ilml plugin remove linkedin
|
|
191
213
|
```
|
|
192
214
|
|
|
193
|
-
This wipes the install dir.
|
|
194
|
-
|
|
215
|
+
This wipes the install dir. Your config in the active scope:
|
|
195
216
|
```bash
|
|
196
217
|
ilml plugin config linkedin reset
|
|
197
218
|
```
|
|
198
219
|
|
|
199
|
-
|
|
220
|
+
The data in `DATA_DIR` is yours — delete the folder manually if you want it gone, or keep it.
|
|
200
221
|
|
|
201
222
|
---
|
|
202
223
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
> Single-developer project. The reference for plugin architecture and SDK contracts is the iLiveMyLife graph-sdk repo's [`PLUGINS.md`](https://github.com/iLiveMyLife/graph-sdk.iLiveMyLife.io/blob/main/PLUGINS.md). Most of what follows is just reminders for me when I come back to this in a few months.
|
|
206
|
-
|
|
207
|
-
## Layout
|
|
224
|
+
## Feedback & support
|
|
208
225
|
|
|
209
|
-
|
|
210
|
-
ilml-plugin.json # manifest: name, version, commands, config.sections[].fields[]
|
|
211
|
-
package.json # npm metadata; "files": ["dist", "ilml-plugin.json"] is the publish whitelist
|
|
212
|
-
.npmignore # belt-and-suspenders excludes (.env, cookies.json, sources, etc.)
|
|
213
|
-
.env / .env.example # dev only; gitignored
|
|
214
|
-
|
|
215
|
-
run.mjs / syncAll.mjs / messageBot.mjs / scout.mjs / ... # entry points (one per ilml subcommand)
|
|
216
|
-
src/
|
|
217
|
-
config.mjs # reads via SDK getPluginConfig(); merges into process.env so the rest of the codebase keeps using process.env.X
|
|
218
|
-
graphClient.mjs # SDK client wrapper
|
|
219
|
-
database.mjs # local JSON DB at DATA_DIR
|
|
220
|
-
saveLoginState.mjs # entry: ilml linkedin login
|
|
221
|
-
... domain modules ...
|
|
222
|
-
scripts/
|
|
223
|
-
build-plugin.mjs # esbuild bundler — outputs dist/*.mjs (minified, no sourcemaps)
|
|
224
|
-
# externalizes: puppeteer, dotenv, @ilivemylife/graph-sdk
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
## Configuration model
|
|
228
|
-
|
|
229
|
-
- The plugin reads its config **only** through `getPluginConfig()` from `@ilivemylife/graph-sdk` (called once in `src/config.mjs`).
|
|
230
|
-
- Resolved values are merged into `process.env` so existing files reading `process.env.LINKEDIN_NAME` etc. keep working unchanged. New code should read directly from the SDK return value when feasible.
|
|
231
|
-
- Auth token: `process.env.ILML_TOKEN` — injected by ilml CLI in production; resolved by the SDK in dev (local config / `.env` / global config / env var).
|
|
232
|
-
- Active scope dir: `process.env.ILML_SCOPE_DIR` — set in production only. Plugin code never reads it directly; the SDK does.
|
|
233
|
-
|
|
234
|
-
## Two run modes
|
|
235
|
-
|
|
236
|
-
| Mode | How invoked | Where config comes from |
|
|
237
|
-
|---|---|---|
|
|
238
|
-
| **Production** | `ilml linkedin <command>` | The active ilml scope's `<scope>/.ilivemylife/plugins-state/linkedin.json` |
|
|
239
|
-
| **Dev** | `node run.mjs` (etc.) | `.env` next to `ilml-plugin.json` (auto-detected by SDK) |
|
|
240
|
-
|
|
241
|
-
The plugin code is identical between the two. `ILML_SCOPE_DIR`'s presence is the only signal.
|
|
242
|
-
|
|
243
|
-
## Local dev iteration
|
|
244
|
-
|
|
245
|
-
When the plugin code itself is what's changing:
|
|
246
|
-
|
|
247
|
-
```bash
|
|
248
|
-
# 1. (optional) edit ilml-plugin.json or src/*
|
|
249
|
-
# 2. Build
|
|
250
|
-
npm run build:plugin
|
|
251
|
-
|
|
252
|
-
# 3a. Quick check via direct run (uses .env)
|
|
253
|
-
node run.mjs
|
|
226
|
+
Bug reports, feature requests, and general questions land in the plugin's **Support** node inside iLiveMyLife. Send a message there and we'll get back to you:
|
|
254
227
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
ilml plugin install linkedin file:///$(pwd)/ilml-plugin-linkedin-X.Y.Z.tgz
|
|
258
|
-
ilml linkedin <command>
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
When the **SDK** is what's changing alongside, also rebuild and re-install the SDK from the sibling `graph-sdk.iLiveMyLife.io` repo:
|
|
262
|
-
|
|
263
|
-
```bash
|
|
264
|
-
# In ../graph-sdk.iLiveMyLife.io
|
|
265
|
-
npm run build && npm pack
|
|
266
|
-
|
|
267
|
-
# In this repo
|
|
268
|
-
npm install ../graph-sdk.iLiveMyLife.io/ilivemylife-graph-sdk-X.Y.Z.tgz --no-save
|
|
269
|
-
npm run build:plugin
|
|
270
|
-
```
|
|
228
|
+
- In any iLiveMyLife app (web / mobile / desktop): open https://app.ilivemylife.io/item/0000019dde81b04f-2e534bb8ebad0000 and use the messenger panel
|
|
229
|
+
- From the terminal: `ilml send 0000019dde81b04f-2e534bb8ebad0000 "your message"`
|
|
271
230
|
|
|
272
|
-
##
|
|
231
|
+
## Links
|
|
273
232
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
```bash
|
|
278
|
-
git commit -- package.json ilml-plugin.json CHANGELOG.md <other-changed-files> -m "v1.X.Y: short description"
|
|
279
|
-
```
|
|
280
|
-
4. **Push:** `git push`.
|
|
281
|
-
5. **Publish:** `npm publish --access public`. The `prepublishOnly` script runs `build:plugin` automatically — `dist/` is rebuilt from current sources before packing.
|
|
282
|
-
6. **Update the Releases node in the graph** — sync description with the new CHANGELOG entry.
|
|
283
|
-
|
|
284
|
-
## Security checklist before each `npm publish`
|
|
233
|
+
- This plugin on npm: https://www.npmjs.com/package/ilml-plugin-linkedin
|
|
234
|
+
- `ilml` CLI on npm: https://www.npmjs.com/package/@ilivemylife/graph-sdk
|
|
235
|
+
- iLiveMyLife: https://ilivemylife.io
|
|
285
236
|
|
|
286
|
-
|
|
287
|
-
- `grep -E "ilya|sorokin|password|token|@gmail" dist/*.mjs dist/src/*.mjs` — no real personal data should appear in bundled output. (Examples in `README.md` like `ivan@example.com` are fine — they're documentation placeholders.)
|
|
288
|
-
- `ls dist/*.map dist/**/*.map 2>/dev/null` — must return nothing (no sourcemaps).
|
|
289
|
-
- `npm whoami` — confirm correct npm account before publish.
|
|
237
|
+
---
|
|
290
238
|
|
|
291
|
-
##
|
|
239
|
+
## Author & contact
|
|
292
240
|
|
|
293
|
-
|
|
294
|
-
- SDK source: https://github.com/iLiveMyLife/graph-sdk.iLiveMyLife.io
|
|
295
|
-
- This plugin on npm: https://www.npmjs.com/package/ilml-plugin-linkedin
|
|
296
|
-
- ilml CLI on npm: https://www.npmjs.com/package/@ilivemylife/graph-sdk
|
|
241
|
+
**[Ilya Sorokin](https://www.digitaltwins.team/team/ilya-sorokin)** — creator of [iLiveMyLife.io](https://ilivemylife.io) and this plugin.
|
|
297
242
|
|
|
298
|
-
|
|
243
|
+
- LinkedIn: [linkedin.com/in/ilyasorokin](https://www.linkedin.com/in/ilyasorokin/)
|
|
244
|
+
- Email: info@ilivemylife.io
|
|
299
245
|
|
|
300
|
-
|
|
246
|
+
### Need a custom plugin or extension?
|
|
301
247
|
|
|
302
|
-
|
|
248
|
+
[**DigitalTwins.team**](https://www.digitaltwins.team/) — my consulting company — designs and builds custom automation, SDK extensions, and bespoke plugins for the iLiveMyLife ecosystem (and beyond). If you want to integrate your own workflow with iLiveMyLife, extend this plugin's behavior, or commission something new, get in touch.
|