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 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
- # ilml-plugin-linkedin
1
+ # Your LinkedIn — finally yours
2
2
 
3
- LinkedIn job-search and networking automation as a plugin for the [`ilml`](https://www.npmjs.com/package/@ilivemylife/graph-sdk) CLI.
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
- - **npm:** https://www.npmjs.com/package/ilml-plugin-linkedin
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
- A toolkit that drives LinkedIn from your machine via a real browser (Puppeteer + stealth), with results synced into your [iLiveMyLife](https://ilivemylife.io) knowledge graph:
9
+ ---
14
10
 
15
- - **Easy Apply** — auto-fills and submits LinkedIn job applications. The graph's AI assistant (**Lifebot**) reads your profile node to answer custom application questions in your voice.
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
- All persistent data (job DB, profile DB, conversation history, cookies) is stored locally in a directory you choosenever in a cloud you don't control.
13
+ - **A full local mirror of your LinkedIn graph.** Connections, conversation threads, message history, profile metadata, your private notes about peoplesynced 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 Long-Term Support version is fine).
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
- That's the whole install. 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 its runtime dependencies (mainly Puppeteer's bundled Chromium — first install takes a couple of minutes).
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 it's installed:
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 plugin needs a few things to know who you are and where to log activity. The first time you run any `ilml linkedin <command>`, the CLI will prompt you for the **required** fields. You can also pre-configure:
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
- To inspect (secret values are masked):
71
-
63
+ Inspect (secrets masked):
72
64
  ```bash
73
65
  ilml plugin config linkedin
74
66
  ```
75
67
 
76
- To change a value later or remove one:
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 # wipe all; will re-prompt next run
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 — only used for auto-fill during one-time login. Stored locally on disk; never sent anywhere. |
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 the local DB / cookies. **Recommended** — keeps data outside the plugin install folder so it survives plugin updates. |
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 with your filters (use `f_AL=true` for Easy Apply). |
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 browser login is needed. Run:
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 anytime.
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 there's a newer version:
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.2.1)` — nothing downloaded
173
- - `linkedin: 1.2.1 → 1.3.0` followed by re-install — newer version pulled
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 saved configuration is preserved across updates (it lives outside the install dir). If a new version requires a new field, the next run will prompt you for just the new field.
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 data lives
192
+ ## Where things live
178
193
 
179
- | Path | What's there | Survives plugin update? | Cleared by `ilml logout`? |
194
+ | Path | What's there | Wiped on plugin update? | Wiped on `ilml logout`? |
180
195
  |---|---|---|---|
181
- | `~/.ilivemylife/plugins/linkedin/` | Plugin code (re-extracted on update) | Replaced | No |
182
- | `~/.ilivemylife/plugins-state/linkedin.json` (or per-project local) | Your configured values | Yes | Yes (with that scope) |
183
- | Directory you set as `DATA_DIR` | Local DBs, cookies, scraped profiles | Yes | No (you manage it) |
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
- If you didn't set `DATA_DIR`, 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.
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. To also clear your saved configuration in the active scope:
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
- To clean up the data directory (cookies, DBs), delete the folder you set as `DATA_DIR` manually.
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
- # Developer Notes
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
- # 3b. Full check via ilml CLI needs the plugin re-packed and re-installed
256
- npm pack
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
- ## Release process
231
+ ## Links
273
232
 
274
- 1. **Update `CHANGELOG.md`** add an entry at the top describing what changed for users.
275
- 2. **Bump version in BOTH** `package.json#version` AND `ilml-plugin.json#version`. They must match — `ilml plugin update` compares the manifest version against npm's `dist-tags.latest`. Drift here causes false update loops or silent skips.
276
- 3. **Commit with explicit paths only:**
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
- - `npm pack --dry-run` — verify only `dist/`, `ilml-plugin.json`, `package.json`, `README.md` end up in the tarball (~13 files). No `.env`, `cookies.json`, `*.json` data files, source `.mjs` at the repo root, `node_modules/`, internal handoff `.md`, `tmpclaude-*`, `.git/`.
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
- ## Useful pointers
239
+ ## Author & contact
292
240
 
293
- - iLiveMyLife graph-sdk Plugin spec & 12 architecture rules: [`PLUGINS.md`](https://github.com/iLiveMyLife/graph-sdk.iLiveMyLife.io/blob/main/PLUGINS.md)
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
- ## Author
246
+ ### Need a custom plugin or extension?
301
247
 
302
- Ilya Sorokin · [iLiveMyLife.io](https://ilivemylife.io) · info@ilivemylife.io
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.