indiecrm-cli 0.1.0 → 0.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.
- package/CHANGELOG.md +442 -0
- package/CODE_OF_CONDUCT.md +35 -0
- package/CONTRIBUTING.md +7 -0
- package/README.md +14 -2
- package/RESEARCH.md +346 -0
- package/SECURITY.md +35 -0
- package/dist/affiliate-copy.js +49 -0
- package/dist/auth.js +453 -0
- package/dist/bigquery.js +199 -0
- package/dist/chrome-browser.js +231 -0
- package/dist/cli.js +19651 -0
- package/dist/company-identity-review.js +78 -0
- package/dist/company-leads.js +422 -0
- package/dist/company-recovery.js +84 -0
- package/dist/deel-outreach.js +469 -0
- package/dist/deel-salesnav.js +368 -0
- package/dist/direct-path.js +326 -0
- package/dist/domain.js +53 -0
- package/dist/domainfinder.js +764 -0
- package/dist/engine.js +216 -0
- package/dist/historical-queries.js +189 -0
- package/dist/hunter-emailfinder.js +252 -0
- package/dist/icp-templates.js +171 -0
- package/dist/indiecrm/commands.js +106 -0
- package/dist/indiecrm-cli.js +2 -104
- package/dist/instantly.js +136 -0
- package/dist/io.js +21 -0
- package/dist/leadlists-funnel.js +148 -0
- package/dist/linkedin-companies.js +562 -0
- package/dist/linkedin-product-details.js +1203 -0
- package/dist/linkedin-product-search.js +1081 -0
- package/dist/linkedin-products.js +786 -0
- package/dist/linkedin-session-contracts.js +3 -0
- package/dist/linkedin-session.js +846 -0
- package/dist/providers.js +1 -0
- package/dist/research-browser-preference.js +37 -0
- package/dist/sales-navigator.js +1231 -0
- package/dist/salesnav-backfill.js +710 -0
- package/dist/sample-data.js +34 -0
- package/dist/session-recovery.js +62 -0
- package/dist/vendor/salesprompter-shared/extension-session-contracts.js +29 -0
- package/dist/vendor/salesprompter-shared/linkedin-session.js +22 -0
- package/dist/vendor/salesprompter-shared/phantombuster-contracts.js +16 -0
- package/dist/vendor/salesprompter-shared/session-vault-contracts.js +17 -0
- package/package.json +73 -14
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
- Restore the full Salesprompter research command surface in `indiecrm`, including `leads:at-companies`, browser research, enrichment, scoring, and sync.
|
|
6
|
+
- Keep IndieCRM CRM sign-in and Salesprompter research sign-in separate, with the original research services and saved checkpoints intact.
|
|
7
|
+
- Migrate the research source, tests, docs, extension, plugin, and database migration files into the IndieCRM CLI repository.
|
|
8
|
+
- Update command examples, upgrade guidance, and research documentation for the `indiecrm` executable.
|
|
9
|
+
|
|
10
|
+
## 0.1.0
|
|
11
|
+
|
|
12
|
+
- Fork the Salesprompter CLI repository under the IndieCRM name.
|
|
13
|
+
- Add IndieCRM browser OAuth sign-in and commands for workspaces, pipelines, deals, contacts, companies, and activities through IndieCRM's MCP API.
|
|
14
|
+
- Publish only the IndieCRM command and auth implementation in the npm package.
|
|
15
|
+
|
|
16
|
+
## Salesprompter release history
|
|
17
|
+
|
|
18
|
+
The following entries document the original research implementation before it was included in `indiecrm-cli`.
|
|
19
|
+
|
|
20
|
+
## 0.1.84 - 2026-09-08
|
|
21
|
+
|
|
22
|
+
- Preserve checkpoints and release research locks when a guided review is cancelled with Ctrl+C or EOF.
|
|
23
|
+
|
|
24
|
+
- Remember the standalone Chrome research connection only after a successful authenticated check. Explicit connection flags override the saved choice; failed auth never silently changes identities. Add background `browser:connect --check`.
|
|
25
|
+
- Guide exact-name company disambiguation in the terminal with verified location, website and source links, explicit selection and confirmation, durable review decisions and immediate checkpoint resume. No hand-edited JSON is needed for supported exact-name ambiguities; uncertain identities remain unapproved.
|
|
26
|
+
- Return `outcome: complete|incomplete|needs_review` and exact next commands. Never prompt in JSON/quiet/non-TTY mode; support `--no-interactive` and `--require-complete` with exit 2 for unfinished collection or review.
|
|
27
|
+
- Cover preference isolation, overrides, invalid candidate evidence, skip/cancel, durable decisions, outcome reporting and guarded executable reruns. Retain exact employer checks, role review, pacing and research-only behavior.
|
|
28
|
+
|
|
29
|
+
## 0.1.83 - 2026-09-07
|
|
30
|
+
|
|
31
|
+
- Add native canonical-employer verification, safe presentation/legal-name aliases, and retained source evidence; never relax numeric current-employer identity checks.
|
|
32
|
+
- Add fingerprint-bound `--review-file` decisions for unresolved identities and employer aliases without changing the original brief or discarding collected people.
|
|
33
|
+
- Diagnose failed company resolution with query attempts, candidates and explicit ambiguity, oversized, incomplete and entity-decision reasons. Require complete unique matches and native company-detail evidence for automatic resolution.
|
|
34
|
+
- Add `--continue-partial quota|exhaustive`, per-page checkpoints, raw-offset resume, duplicate/count-drift protection and exact repeatable `--company` scoping. The accessible 2,500-result window is not an exhaustive-coverage guarantee.
|
|
35
|
+
- Tighten software, digital-product/UX and technical-data role classification. Preserve multiple review reasons and identify the selection policy in reports.
|
|
36
|
+
- Verify four canonical employers against Matthias's saved collection, recover 69 shortlist places under the stricter policy, and preserve the original export. No enrichment or outreach is started.
|
|
37
|
+
|
|
38
|
+
## 0.1.82 - 2026-09-07
|
|
39
|
+
|
|
40
|
+
- Let Chrome research unwind normally on SIGINT, SIGTERM and SIGHUP instead of exiting before checkpoint-lock cleanup.
|
|
41
|
+
- Close only the owned Chrome process, preserve completed searches, release the research lock and return an explicit interrupted status with the corresponding exit code.
|
|
42
|
+
- Add real-Chrome subprocess tests that interrupt an in-flight request with SIGINT/SIGTERM and prove that restart collects only the pending job.
|
|
43
|
+
|
|
44
|
+
## 0.1.81 - 2026-09-07
|
|
45
|
+
|
|
46
|
+
- Require Node.js 22.12+ for the current Chrome driver; Node.js 24 LTS is recommended.
|
|
47
|
+
|
|
48
|
+
- Add `browser:connect` for one-time manual sign-in to an isolated, persistent research Chrome profile.
|
|
49
|
+
- Add `leads:at-companies --browser chrome`: CLI-owned, lazy background Chrome with a private OS pipe; no external Codex browser worker, extension, cookie export or debugging port.
|
|
50
|
+
- Preserve exact identity checks, sequential pacing, checkpoint reuse, rate-limit stops and research-only boundaries. Fail clearly when sign-in or a security challenge requires the user.
|
|
51
|
+
- Verify fresh Helsing name resolution and two matching contacts against live LinkedIn, followed by a cached rerun without launching Chrome. Add browser transport, profile isolation, connection-mode and real-Chrome regression tests.
|
|
52
|
+
|
|
53
|
+
## 0.1.80 - 2026-09-07
|
|
54
|
+
|
|
55
|
+
- Load LinkedIn credentials lazily so completed company research can resume without a live LinkedIn session.
|
|
56
|
+
- Add bounded `--wait-for-session` recovery from refreshed extension credentials; reject identity changes and never retry rate limits.
|
|
57
|
+
- Add `--retry-unresolved` to retry cached identity misses without discarding completed searches or successful resolutions.
|
|
58
|
+
- Test credential waiting, offline checkpoint reuse, command option validation and targeted identity retries. Codex browser relay still requires an external worker.
|
|
59
|
+
|
|
60
|
+
## 0.1.79 - 2026-09-06
|
|
61
|
+
|
|
62
|
+
- Execute name-only company resolution and contact collection in one `leads:at-companies --resolve-companies --all` run.
|
|
63
|
+
- Paginate exact Account Search identity checks, reject ambiguity and shared IDs, preserve resolution evidence and reuse the checkpoint without manual brief edits.
|
|
64
|
+
- Keep known-company work first, share session recovery, retain pacing/rate-limit stops and never activate outreach.
|
|
65
|
+
- Verified live from the name Helsing to company ID and two shortlisted contacts; added orchestration and resume regressions.
|
|
66
|
+
|
|
67
|
+
## 0.1.78 - 2026-09-06
|
|
68
|
+
|
|
69
|
+
- Report distinct shortlist/review people separately from candidate/function rows, with partial, unknown, pending and unresolved coverage and explicit next actions.
|
|
70
|
+
- Add checkpoint-bound `--report-only` without LinkedIn requests.
|
|
71
|
+
- Support explicit evidence-backed employer-name aliases while retaining exact current-company ID checks and export provenance.
|
|
72
|
+
- Document browser-worker loopback handoff and safe continuation rules in the distributed CLI skill.
|
|
73
|
+
|
|
74
|
+
## 0.1.77 - 2026-09-06
|
|
75
|
+
|
|
76
|
+
- Escape punctuation in company query labels; verified against the TKMS HTTP 400 regression.
|
|
77
|
+
- Refresh private shortlist, review and coverage exports after every completed search.
|
|
78
|
+
|
|
79
|
+
## 0.1.76 - 2026-09-06
|
|
80
|
+
|
|
81
|
+
- Expand named-company research to talent acquisition, business intelligence, digital workplace, CDO and German department-head titles.
|
|
82
|
+
- Separate broad digital, transformation, communications, operational-technology and mixed-role matches into a private review queue instead of inflating the shortlist.
|
|
83
|
+
- Prefer current-position employer evidence over stale summary IDs and consider all matching current positions. Keep assistant, former-role and junior exclusions.
|
|
84
|
+
- Preserve source employer names and flag name/ID scope conflicts for review, including parent/subsidiary ambiguity.
|
|
85
|
+
- Add regression tests drawn from Matthias's archived role patterns, including ambiguity, employer drift and review-file privacy.
|
|
86
|
+
|
|
87
|
+
## 0.1.75
|
|
88
|
+
|
|
89
|
+
- Company research retries rejected LinkedIn authentication once with a different extension-synced session and reuses it for later searches.
|
|
90
|
+
- Preserve checkpoints, stop on rate limits, and explain browser-relay recovery when no working session is available.
|
|
91
|
+
|
|
92
|
+
All notable user-facing changes to `salesprompter-cli` should be recorded in this file.
|
|
93
|
+
|
|
94
|
+
The format is intentionally lightweight and release-oriented.
|
|
95
|
+
|
|
96
|
+
## 0.1.74 - 2026-09-06
|
|
97
|
+
|
|
98
|
+
### Added
|
|
99
|
+
|
|
100
|
+
- Native `leads:at-companies` research: a named-company brief, six configurable functions, exact employer checks, senior-role filtering, balanced variable-size shortlists, and private CSV/coverage exports.
|
|
101
|
+
- Workspace-bound resumable checkpoints, bounded search batches, concurrent-run protection, unresolved-company reporting and explicit partial-search evidence. No implicit email enrichment or outreach.
|
|
102
|
+
|
|
103
|
+
## 0.1.73 - 2026-09-02
|
|
104
|
+
|
|
105
|
+
### Added
|
|
106
|
+
|
|
107
|
+
- `affiliate:copy` previews nine Gojiberry variants, compiles native Instantly spintax in subjects and all body fields including link labels, and saves structured JSON plus mobile-width HTML previews.
|
|
108
|
+
- Missing-name fallbacks, exact step-URL preservation, all-choice word/phrase checks, clear opt-outs and a concise paid-link disclosure.
|
|
109
|
+
- Explicit saved-review apply with both local and remote stale-copy checks; active campaigns require `--allow-active`. No implicit draft activation or sender-limit changes.
|
|
110
|
+
|
|
111
|
+
### Fixed
|
|
112
|
+
|
|
113
|
+
- Large piped JSON output is flushed before CLI exit so copy reviews cannot be silently truncated.
|
|
114
|
+
|
|
115
|
+
## 0.1.72 - 2026-08-30
|
|
116
|
+
|
|
117
|
+
### Added
|
|
118
|
+
|
|
119
|
+
- Affiliate runs now surface aggregate Hunter verification evidence alongside the existing Instantly verification health.
|
|
120
|
+
|
|
121
|
+
### Changed
|
|
122
|
+
|
|
123
|
+
- The A-to-Z affiliate workflow reuses Hunter Email Finder verification evidence and sends recovery-source or evidence-missing addresses through Hunter Email Verifier before campaign import.
|
|
124
|
+
|
|
125
|
+
### Safety
|
|
126
|
+
|
|
127
|
+
- New campaigns require Hunter status `valid` and secondary Instantly verification before activation. Catch-all, disposable, webmail, invalid, unknown, claimed, pending, and unresolved addresses fail closed; `--allow-accept-all` is rejected.
|
|
128
|
+
|
|
129
|
+
## 0.1.71 - 2026-08-30
|
|
130
|
+
|
|
131
|
+
### Added
|
|
132
|
+
|
|
133
|
+
- Added `affiliate:finish` to repair stalled verification in bounded batches, quarantine unsafe recipients, activate only after the live safety gate opens, and read the running campaign back.
|
|
134
|
+
|
|
135
|
+
## 0.1.70 - 2026-08-30
|
|
136
|
+
|
|
137
|
+
### Added
|
|
138
|
+
|
|
139
|
+
- `affiliate:status` now reads the linked Instantly campaign live and returns an immediate `done` verdict with campaign state, sender count, lead totals, verification health, and contacted/replied counts.
|
|
140
|
+
|
|
141
|
+
### Safety
|
|
142
|
+
|
|
143
|
+
- A campaign is only done after it is running, every active lead is verified, enrichment is complete, and outreach activity has begun. The status payload remains aggregate-only and never exposes recipient data.
|
|
144
|
+
|
|
145
|
+
## 0.1.69 - 2026-08-26
|
|
146
|
+
|
|
147
|
+
### Added
|
|
148
|
+
|
|
149
|
+
- Added local-only `products:collect-details` / `linkedin-products:collect-details` to enrich a proven `products:collect` ranking with public LinkedIn product-page fields through a resumable loopback browser relay.
|
|
150
|
+
- Added external product websites, vendor LinkedIn identities, intended roles, customer companies, features, detail coverage, and a reproducible SHA-256 detail checksum to complete enriched artifacts.
|
|
151
|
+
|
|
152
|
+
### Safety
|
|
153
|
+
|
|
154
|
+
- Detail collection is bound to the source artifact's exact query hash, contiguous ranks, canonical product URLs, product count, and order checksum. Authentication loss, challenges, rate limits, interruption, and unexpected pages stop at the checkpoint without emitting a partial enriched artifact.
|
|
155
|
+
- Product unavailability requires bounded `404`/`410` or LinkedIn unavailable-page proof. The relay accepts only allowlisted public product fields and never collects cookies, storage, headers, messaging, connections, or other personalized content.
|
|
156
|
+
|
|
157
|
+
## 0.1.68 - 2026-08-25
|
|
158
|
+
|
|
159
|
+
### Added
|
|
160
|
+
|
|
161
|
+
- Added `affiliate:grow` as the A-to-Z alias for `affiliate:run`, with repeatable `--seed-profile` customer exclusions and a concise stage-by-stage result.
|
|
162
|
+
- Added an authenticated canonical audience readback before any Instantly draft is prepared.
|
|
163
|
+
|
|
164
|
+
### Changed
|
|
165
|
+
|
|
166
|
+
- Affiliate people collection now retries a rejected saved session once with the latest extension-synced session and no longer retries deterministic `401`/`403` responses.
|
|
167
|
+
- Affiliate persistence removes within-batch and prior-workspace audience duplicates. Zero-net-new cohorts create no audience, enrichment job, or Instantly campaign.
|
|
168
|
+
|
|
169
|
+
### Safety
|
|
170
|
+
|
|
171
|
+
- Session rejection and persistence-count drift fail closed before outreach preparation; activation remains explicit.
|
|
172
|
+
|
|
173
|
+
## 0.1.67 - 2026-08-25
|
|
174
|
+
|
|
175
|
+
### Added
|
|
176
|
+
|
|
177
|
+
- Added local-only `products:collect` / `linkedin-products:collect` for resumable, exact-order LinkedIn product-search collection through a loopback signed-in-browser relay.
|
|
178
|
+
- Added terminal-page proof, public-field allowlisting, contiguous first-seen ranks, query hashing, and a reproducible SHA-256 order checksum to complete artifacts.
|
|
179
|
+
|
|
180
|
+
### Safety
|
|
181
|
+
|
|
182
|
+
- Bounded, interrupted, challenged, rate-limited, and identity-drift runs remain incomplete and cannot emit a complete artifact or upload data to Salesprompter.
|
|
183
|
+
|
|
184
|
+
## 0.1.66 - 2026-08-13
|
|
185
|
+
|
|
186
|
+
### Added
|
|
187
|
+
|
|
188
|
+
- Added `leads:collect --defer-email-enrichment` for storing large lead universes without starting email discovery. The CLI verifies app support before collection and confirms the deferred state after import.
|
|
189
|
+
|
|
190
|
+
### Changed
|
|
191
|
+
|
|
192
|
+
- Kept the existing `leads:collect` behavior unchanged when the new flag is omitted, and added explicit `emailEnrichmentDeferred` and `outreachStarted` fields to collection output.
|
|
193
|
+
|
|
194
|
+
## 0.1.65 - 2026-08-13
|
|
195
|
+
|
|
196
|
+
### Fixed
|
|
197
|
+
|
|
198
|
+
- Removed recipient-level names, emails, profile URLs, and raw provider import rows from affiliate status output. Status now reports only the reviewed sequence, safe settings, and aggregate counts.
|
|
199
|
+
|
|
200
|
+
## 0.1.64 - 2026-08-13
|
|
201
|
+
|
|
202
|
+
### Added
|
|
203
|
+
|
|
204
|
+
- Added `affiliate:list` for safe workspace-scoped audience and outreach summaries.
|
|
205
|
+
- Added `affiliate:analytics <run-id>` for campaign totals plus step/variant reply and opportunity metrics; meetings and won deals remain campaign-level totals only.
|
|
206
|
+
- Exposed `affiliate:regenerate-sequence` in top-level help and the Outreach pack.
|
|
207
|
+
|
|
208
|
+
### Changed
|
|
209
|
+
|
|
210
|
+
- Added `--timing-mode auto|custom` to `affiliate:run`; the default `custom` mode now makes `--daily-limit`, `--send-from`, and `--send-to` effective.
|
|
211
|
+
- Made the fixed three-email sequence contract explicit, rejecting every other `--steps` value before creating an audience or campaign.
|
|
212
|
+
- Validated the 120-character campaign-name limit before audience collection, required complete ordered 3×3 sequences for ready and active responses, and showed unsupported per-step meeting/won metrics as `n/a`.
|
|
213
|
+
|
|
214
|
+
## 0.1.63 - 2026-08-13
|
|
215
|
+
|
|
216
|
+
### Fixed
|
|
217
|
+
|
|
218
|
+
- Hardened browser login callbacks against speculative requests and persistent connections so a completed login returns control to the CLI reliably.
|
|
219
|
+
|
|
220
|
+
## 0.1.62 - 2026-07-31
|
|
221
|
+
|
|
222
|
+
### Added
|
|
223
|
+
|
|
224
|
+
- Added automatic per-query checkpoints for exhaustive Sales Navigator people collection.
|
|
225
|
+
- Resume completed slices and canonical people after interruption or rate limiting, then remove the checkpoint only after workspace persistence succeeds.
|
|
226
|
+
|
|
227
|
+
### Fixed
|
|
228
|
+
|
|
229
|
+
- Restrict people normalization to the Sales Navigator response's actual result elements so unrelated `included` records and decorations cannot inflate an import.
|
|
230
|
+
|
|
231
|
+
## 0.1.61 - 2026-07-31
|
|
232
|
+
|
|
233
|
+
### Fixed
|
|
234
|
+
|
|
235
|
+
- Treat a completed company-headcount partition plus residual as coverage proof and persist its canonical profile URL union even when LinkedIn's matching-placement headline is higher.
|
|
236
|
+
- Record the exact `reportedCountDrift` and avoid redundant whole-root recovery passes after an exhaustive partition has completed.
|
|
237
|
+
|
|
238
|
+
## 0.1.60 - 2026-07-31
|
|
239
|
+
|
|
240
|
+
### Fixed
|
|
241
|
+
|
|
242
|
+
- Record an at-most-five reported-count drift when every page of an under-cap people search was fetched but LinkedIn repeated a few profile placements, avoiding unnecessary recovery passes without hiding missing canonical profiles.
|
|
243
|
+
- Keep larger gaps and every oversized aggregate fail-closed until adaptive slicing recovers the full deduplicated result set.
|
|
244
|
+
- Align the checkpointed Account Search collector and all packaged skill references with the 1,000-company native window.
|
|
245
|
+
- Upgrade the npm release workflow to the current checkout and Node setup action majors.
|
|
246
|
+
|
|
247
|
+
## 0.1.59 - 2026-07-31
|
|
248
|
+
|
|
249
|
+
### Improved
|
|
250
|
+
|
|
251
|
+
- Replaced per-child shortfall recursion with bounded whole-root recovery passes, keeping company headcount first and adding another safe dimension only when the deduplicated union is still short.
|
|
252
|
+
- Preserved recursive splitting only for slices that genuinely exceed the applicable result window.
|
|
253
|
+
|
|
254
|
+
## 0.1.58 - 2026-07-31
|
|
255
|
+
|
|
256
|
+
### Fixed
|
|
257
|
+
|
|
258
|
+
- Added adaptive recovery for under-cap Sales Navigator searches whose paginated rows contain duplicate or unstable profile entries.
|
|
259
|
+
- Headcount-slice and deduplicate those short collections before persistence, while keeping the existing fail-closed completeness check.
|
|
260
|
+
|
|
261
|
+
## 0.1.57 - 2026-07-31
|
|
262
|
+
|
|
263
|
+
### Changed
|
|
264
|
+
|
|
265
|
+
- Raised the normal Sales Navigator people-search window to 2,500 while preserving the 1,000-result account and `Connections of` limits.
|
|
266
|
+
- Made unbounded `leads:collect` runs automatically split oversized searches by company headcount, recurse through safe dimensions when needed, and deduplicate by canonical profile URL.
|
|
267
|
+
|
|
268
|
+
### Improved
|
|
269
|
+
|
|
270
|
+
- Persisted aggregate imports as one workspace run with per-slice evidence and fail-closed coverage checks.
|
|
271
|
+
- Documented the exhaustive historical-backfill flow and kept enrichment separate from outreach.
|
|
272
|
+
|
|
273
|
+
## 0.1.56 - 2026-07-31
|
|
274
|
+
|
|
275
|
+
### Changed
|
|
276
|
+
|
|
277
|
+
- Raised authenticated local Sales Navigator people collection from 1,000 to 2,000 results by default while preserving the 1,000-result account/company limit.
|
|
278
|
+
- Aligned affiliate people imports with the app's automatic Phantombuster-to-Hunter email processing pipeline.
|
|
279
|
+
|
|
280
|
+
### Improved
|
|
281
|
+
|
|
282
|
+
- Documented capped people imports and kept structured completion, truncation, and remaining-result reporting intact at the new limit.
|
|
283
|
+
|
|
284
|
+
## 0.1.55 - 2026-07-31
|
|
285
|
+
|
|
286
|
+
### Added
|
|
287
|
+
|
|
288
|
+
- Added `leads:download` / `leads:export-csv` to download stored leads from the active Salesprompter workspace as CSV.
|
|
289
|
+
- Added run, search, email-only, and output-path filters that match the app's CLI imports export.
|
|
290
|
+
|
|
291
|
+
## 0.1.54 - 2026-07-29
|
|
292
|
+
|
|
293
|
+
### Added
|
|
294
|
+
|
|
295
|
+
- Added `--retry-not-found-companies` for versioned, resumable retries of previous exact company misses without refreshing already enriched profiles.
|
|
296
|
+
- Added Hunter company-name fallback when no unambiguous official domain is available, plus `--no-hunter-company-fallback` for domain-only runs.
|
|
297
|
+
- Added `--retry-failed-emails` so transient or validation failures can be retried without rebilling previous Hunter `not_found` results.
|
|
298
|
+
|
|
299
|
+
### Improved
|
|
300
|
+
|
|
301
|
+
- Retry Account Search with a cleaned legal company name while retaining the exact normalized-match requirement.
|
|
302
|
+
- Recover conservative name-formatting failures such as honorifics, credentials, underscores, and quoted names before a second Hunter lookup.
|
|
303
|
+
- Reuse an existing domain only when an exact normalized company name maps to one unique domain in the active organization.
|
|
304
|
+
|
|
305
|
+
## 0.1.53 - 2026-07-28
|
|
306
|
+
|
|
307
|
+
### Fixed
|
|
308
|
+
|
|
309
|
+
- Recognize stale company `404` results whether LinkedIn returns the status in `statuses[id]` or in `errors[id].status`, so exact-name fallback runs for both live response shapes.
|
|
310
|
+
|
|
311
|
+
## 0.1.52 - 2026-07-28
|
|
312
|
+
|
|
313
|
+
### Fixed
|
|
314
|
+
|
|
315
|
+
- Fall back to exact-name Sales Navigator Account Search when an imported company id returns a per-company `404`.
|
|
316
|
+
- Stop reusing stale company ids as shortcuts for name-only aliases, so recoverable companies can receive their official domains before Hunter enrichment.
|
|
317
|
+
|
|
318
|
+
## 0.1.51 - 2026-07-28
|
|
319
|
+
|
|
320
|
+
### Added
|
|
321
|
+
|
|
322
|
+
- Added `leads:enrich-import` for the explicit local Sales Navigator company -> official domain -> Hunter pipeline across one or more stored CLI imports.
|
|
323
|
+
- Added durable, organization-scoped company profile and email-enrichment persistence with staged company-only and Hunter-only operation.
|
|
324
|
+
|
|
325
|
+
### Changed
|
|
326
|
+
|
|
327
|
+
- Kept this import-enrichment flow data-only: it never creates sequences, Instantly campaigns, or outreach and reports `outreachStarted = false`.
|
|
328
|
+
|
|
329
|
+
## 0.1.50 - 2026-07-27
|
|
330
|
+
|
|
331
|
+
### Fixed
|
|
332
|
+
|
|
333
|
+
- Added current-request header guidance to signed-in Sales Navigator browser relay tasks so Lead Search recovery can satisfy LinkedIn's CSRF requirement without exporting browser cookies.
|
|
334
|
+
- Made capped people-search imports explicit with `collectionComplete`, `truncated`, and `remainingResults` in the structured CLI result.
|
|
335
|
+
|
|
336
|
+
## 0.1.44 - 2026-07-20
|
|
337
|
+
|
|
338
|
+
### Added
|
|
339
|
+
|
|
340
|
+
- Added the complete affiliate campaign journey: local Sales Navigator people collection, persisted audience runs, email enrichment, draft Instantly campaigns, status checks, and explicit activation.
|
|
341
|
+
- Added `affiliate:enrich <run-id>` to recover additional campaign emails in the background, deduplicate existing leads, and import only new contacts with verification enabled.
|
|
342
|
+
- Added durable Account Search collection, market membership persistence, and prefixed Salesprompter Supabase migrations.
|
|
343
|
+
|
|
344
|
+
### Changed
|
|
345
|
+
|
|
346
|
+
- Affiliate email discovery now uses Hunter first and the configured Phantombuster Email Finder for unresolved people.
|
|
347
|
+
- Updated the packaged Salesprompter skill and CLI documentation to match the current local collection and outreach workflows.
|
|
348
|
+
|
|
349
|
+
## 0.1.43 - 2026-07-01
|
|
350
|
+
|
|
351
|
+
### Added
|
|
352
|
+
|
|
353
|
+
- Added `companies:scrape-linkedin` / `linkedin-companies:scrape-local` for locally captured LinkedIn company profile and insights enrichment with timestamped database history.
|
|
354
|
+
- Added `companies:scrape-dealroom` / `dealroom-companies:scrape-local` for locally captured Dealroom company enrichment with timestamped database history.
|
|
355
|
+
|
|
356
|
+
### Changed
|
|
357
|
+
|
|
358
|
+
- Added local scrape history tables for LinkedIn company snapshots, LinkedIn company insight rows, and Dealroom company snapshots.
|
|
359
|
+
- Filtered invalid, generic, and image-less LinkedIn account-search profiles out of the reporting view used by the Data Studio account-search dashboard.
|
|
360
|
+
|
|
361
|
+
## 0.1.42 - 2026-06-28
|
|
362
|
+
|
|
363
|
+
### Fixed
|
|
364
|
+
|
|
365
|
+
- Fixed Sales Navigator account-search employee counts to use exact LinkedIn display counts only when provided, and clear stale numeric counts when only a headcount range is available.
|
|
366
|
+
|
|
367
|
+
## 0.1.36 - 2026-05-11
|
|
368
|
+
|
|
369
|
+
### Changed
|
|
370
|
+
|
|
371
|
+
- Restored the repo-local Chrome extension compatibility copy and LinkedIn direct-strategy benchmark script.
|
|
372
|
+
- Added direct LinkedIn workflow updates for target-company inputs and workspace lead generation internals.
|
|
373
|
+
- Tightened Deel/direct-path company-size filtering to map Salesprompter size buckets into employee-count ranges.
|
|
374
|
+
|
|
375
|
+
## 0.1.35 - 2026-05-11
|
|
376
|
+
|
|
377
|
+
### Fixed
|
|
378
|
+
|
|
379
|
+
- Fixed the interactive product-market prompt for very long pasted Sales Navigator URLs by reading that prompt in raw mode, avoiding terminal line-buffer limits that made Return appear to do nothing.
|
|
380
|
+
|
|
381
|
+
## 0.1.34 - 2026-05-10
|
|
382
|
+
|
|
383
|
+
### Changed
|
|
384
|
+
|
|
385
|
+
- Switched `auth:workspace`, the startup workspace chooser, and the wizard `Switch workspace` action to use an in-terminal Salesprompter workspace selector when a cached CLI session exists.
|
|
386
|
+
- Added `--workspace`, `--org-id`, and `--browser` options to `auth:workspace` for direct workspace switches and explicit browser fallback.
|
|
387
|
+
- Kept the browser chooser as a fallback when the app workspace API is unavailable or no cached CLI session exists.
|
|
388
|
+
|
|
389
|
+
## 0.1.33 - 2026-05-10
|
|
390
|
+
|
|
391
|
+
### Changed
|
|
392
|
+
|
|
393
|
+
- Added `auth:workspace` / `auth:switch` so operators can reopen the workspace chooser without restarting or clearing auth manually.
|
|
394
|
+
- Added a wizard-level `Switch workspace` option for changing workspaces before choosing a workflow.
|
|
395
|
+
- Made the product-market wizard detect pasted LinkedIn Sales Navigator people-search URLs and process them directly through the durable Sales Navigator crawl path.
|
|
396
|
+
|
|
397
|
+
## 0.1.32 - 2026-05-10
|
|
398
|
+
|
|
399
|
+
### Changed
|
|
400
|
+
|
|
401
|
+
- Refresh cached wizard sessions through the app before rendering workspace choices, so older tokens can pick up Clerk and Salesprompter workspace metadata.
|
|
402
|
+
- Display Salesprompter workspace client metadata in the wizard when the app returns it.
|
|
403
|
+
|
|
404
|
+
## 0.1.31 - 2026-05-10
|
|
405
|
+
|
|
406
|
+
### Changed
|
|
407
|
+
|
|
408
|
+
- Replaced the cached-workspace yes/no prompt with a workspace selector in the interactive wizard.
|
|
409
|
+
- Show workspace names, slugs, and ids when the cached token includes them, and offer a browser workspace chooser when it does not.
|
|
410
|
+
|
|
411
|
+
## 0.1.30 - 2026-05-10
|
|
412
|
+
|
|
413
|
+
### Changed
|
|
414
|
+
|
|
415
|
+
- Made the interactive wizard show and confirm the cached Salesprompter workspace before starting a workflow.
|
|
416
|
+
- Added a browser-login handoff from the wizard when the user rejects the cached workspace, so multi-workspace users can pick the right CLI workspace.
|
|
417
|
+
|
|
418
|
+
## 0.1.29 - 2026-04-02
|
|
419
|
+
|
|
420
|
+
### Changed
|
|
421
|
+
|
|
422
|
+
- Fixed the durable Sales Navigator crawl loop so `--max-slices` does not keep retry-claiming distinct slices after a retryable failure.
|
|
423
|
+
- Hardened Sales Navigator CLI integration tests to bound subprocess lifetime while still verifying the JSON payloads they emit.
|
|
424
|
+
|
|
425
|
+
## 0.1.28 - 2026-04-01
|
|
426
|
+
|
|
427
|
+
### Added
|
|
428
|
+
|
|
429
|
+
- `companies:resolve-linkedin-urls` for resolving LinkedIn company URLs from pasted company lists.
|
|
430
|
+
- Serper-backed LinkedIn company lookup fallback when `SERPER_API_KEY` or `SALESPROMPTER_SERPER_API_KEY` is configured.
|
|
431
|
+
- Community and governance files: contributing guide, code of conduct, security policy, issue templates, PR template, and funding metadata.
|
|
432
|
+
|
|
433
|
+
### Changed
|
|
434
|
+
|
|
435
|
+
- Improved company URL matching to reject weak LinkedIn company false positives with page-level validation.
|
|
436
|
+
- Expanded README and package metadata to better describe the public CLI surface and support channels.
|
|
437
|
+
|
|
438
|
+
## 0.1.27 - 2026-03-25
|
|
439
|
+
|
|
440
|
+
### Notes
|
|
441
|
+
|
|
442
|
+
- Current latest published version on npm.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our standard
|
|
4
|
+
|
|
5
|
+
We expect contributors and maintainers to keep this project respectful, direct, and constructive.
|
|
6
|
+
|
|
7
|
+
Examples of expected behavior:
|
|
8
|
+
|
|
9
|
+
- assume good intent
|
|
10
|
+
- focus feedback on the code and product behavior
|
|
11
|
+
- use factual, reproducible reports
|
|
12
|
+
- be respectful in disagreement
|
|
13
|
+
- help keep the project usable for others
|
|
14
|
+
|
|
15
|
+
Examples of unacceptable behavior:
|
|
16
|
+
|
|
17
|
+
- harassment or personal attacks
|
|
18
|
+
- discriminatory language
|
|
19
|
+
- doxxing or publishing private information
|
|
20
|
+
- bad-faith disruption
|
|
21
|
+
- spam, abuse, or intimidation
|
|
22
|
+
|
|
23
|
+
## Enforcement
|
|
24
|
+
|
|
25
|
+
Project maintainers may remove, edit, or reject comments, commits, issues, or pull requests that violate this code of conduct.
|
|
26
|
+
|
|
27
|
+
Repeated or severe violations may result in temporary or permanent exclusion from project spaces.
|
|
28
|
+
|
|
29
|
+
## Reporting
|
|
30
|
+
|
|
31
|
+
To report conduct issues, contact:
|
|
32
|
+
|
|
33
|
+
- `hello@danielsinewe.com`
|
|
34
|
+
|
|
35
|
+
Please include links, screenshots, or other concrete context where possible.
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Contributing to IndieCRM CLI
|
|
2
|
+
|
|
3
|
+
IndieCRM CLI is the terminal client for [IndieCRM](https://indiecrm.app). CRM commands should match tools currently offered by IndieCRM's authenticated MCP API. Research commands inherited from Salesprompter must preserve their current behavior and independent authentication.
|
|
4
|
+
|
|
5
|
+
Use Node.js 22.12 or newer. Run `npm ci`, `npm test`, and `npm pack --dry-run` before proposing a release. Update the README when commands or authentication change. Do not add credentials, customer data, or local auth files to the repository or test fixtures.
|
|
6
|
+
|
|
7
|
+
For security reports, use the contact in [SECURITY.md](./SECURITY.md) instead of a public issue.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# IndieCRM CLI
|
|
2
2
|
|
|
3
|
-
The IndieCRM CLI works with the workspaces, pipelines, contacts, companies, and deals in [IndieCRM](https://indiecrm.app). It uses IndieCRM's authenticated MCP API
|
|
3
|
+
The IndieCRM CLI works with the workspaces, pipelines, contacts, companies, and deals in [IndieCRM](https://indiecrm.app). It also includes the full Salesprompter research workflow, including the `leads:at-companies` command. CRM access uses IndieCRM's authenticated MCP API; research commands still use Salesprompter services and accounts.
|
|
4
4
|
|
|
5
5
|
Requires Node.js 22.12 or newer.
|
|
6
6
|
|
|
@@ -28,6 +28,18 @@ indiecrm activity:log <app-id> <deal-id> "Sent proposal" --kind email
|
|
|
28
28
|
|
|
29
29
|
Commands print JSON for shell scripts and agents. Start with `indiecrm workspaces` to find the app ID for each workspace. `indiecrm tools` shows the live API tool catalog, and `indiecrm call <tool> --input '{"appId":"..."}'` exposes any supported tool directly. `indiecrm status` checks for a local session; `indiecrm logout` removes it.
|
|
30
30
|
|
|
31
|
+
## Research existing accounts and leads
|
|
32
|
+
|
|
33
|
+
The original Salesprompter research commands are available under the `indiecrm` executable. Research sign-in is separate from IndieCRM CRM sign-in:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
indiecrm auth:login
|
|
37
|
+
indiecrm browser:connect
|
|
38
|
+
indiecrm leads:at-companies --brief companies.json --out-dir ./research --resolve-companies --all
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
For example, `companies.json` can contain `{ "companies": [{ "name": "bizforward GmbH", "maxContacts": 20 }] }`. Use `--dry-run` to preview targeting without collecting data. The existing Salesprompter config, workspaces, saved research checkpoints, and service integrations remain supported. See [RESEARCH.md](RESEARCH.md) for the full research workflow and recovery options.
|
|
42
|
+
|
|
31
43
|
## Development
|
|
32
44
|
|
|
33
45
|
```bash
|
|
@@ -36,4 +48,4 @@ npm test
|
|
|
36
48
|
npm pack --dry-run
|
|
37
49
|
```
|
|
38
50
|
|
|
39
|
-
This repository was forked from `salesprompter-cli`. The IndieCRM package has its own command, authentication, API connection, and release version.
|
|
51
|
+
This repository was forked from `salesprompter-cli`. The IndieCRM package has its own command, authentication, API connection, and release version. The new package combines the original research commands with IndieCRM CRM commands, while keeping their sign-in and service boundaries explicit.
|