indiecrm-cli 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +447 -0
  2. package/CODE_OF_CONDUCT.md +35 -0
  3. package/CONTRIBUTING.md +7 -0
  4. package/README.md +14 -2
  5. package/RESEARCH.md +346 -0
  6. package/SECURITY.md +35 -0
  7. package/dist/affiliate-copy.js +49 -0
  8. package/dist/auth.js +453 -0
  9. package/dist/bigquery.js +199 -0
  10. package/dist/chrome-browser.js +231 -0
  11. package/dist/cli.js +19652 -0
  12. package/dist/company-identity-review.js +78 -0
  13. package/dist/company-leads.js +422 -0
  14. package/dist/company-recovery.js +84 -0
  15. package/dist/deel-outreach.js +469 -0
  16. package/dist/deel-salesnav.js +368 -0
  17. package/dist/direct-path.js +326 -0
  18. package/dist/domain.js +53 -0
  19. package/dist/domainfinder.js +764 -0
  20. package/dist/engine.js +216 -0
  21. package/dist/historical-queries.js +189 -0
  22. package/dist/hunter-emailfinder.js +252 -0
  23. package/dist/icp-templates.js +171 -0
  24. package/dist/indiecrm/commands.js +108 -0
  25. package/dist/indiecrm-cli.js +2 -104
  26. package/dist/instantly.js +136 -0
  27. package/dist/io.js +21 -0
  28. package/dist/leadlists-funnel.js +148 -0
  29. package/dist/linkedin-companies.js +562 -0
  30. package/dist/linkedin-product-details.js +1203 -0
  31. package/dist/linkedin-product-search.js +1081 -0
  32. package/dist/linkedin-products.js +786 -0
  33. package/dist/linkedin-session-contracts.js +3 -0
  34. package/dist/linkedin-session.js +846 -0
  35. package/dist/providers.js +1 -0
  36. package/dist/research-browser-preference.js +37 -0
  37. package/dist/sales-navigator.js +1231 -0
  38. package/dist/salesnav-backfill.js +710 -0
  39. package/dist/sample-data.js +34 -0
  40. package/dist/session-recovery.js +62 -0
  41. package/dist/vendor/salesprompter-shared/extension-session-contracts.js +29 -0
  42. package/dist/vendor/salesprompter-shared/linkedin-session.js +22 -0
  43. package/dist/vendor/salesprompter-shared/phantombuster-contracts.js +16 -0
  44. package/dist/vendor/salesprompter-shared/session-vault-contracts.js +17 -0
  45. package/package.json +73 -14
package/CHANGELOG.md ADDED
@@ -0,0 +1,447 @@
1
+ # Changelog
2
+
3
+ ## 0.2.1
4
+
5
+ - Keep IndieCRM CRM commands outside the inherited Salesprompter research authentication hook.
6
+ - Verify both authentication boundaries through the packaged `indiecrm` executable.
7
+
8
+ ## 0.2.0
9
+
10
+ - Restore the full Salesprompter research command surface in `indiecrm`, including `leads:at-companies`, browser research, enrichment, scoring, and sync.
11
+ - Keep IndieCRM CRM sign-in and Salesprompter research sign-in separate, with the original research services and saved checkpoints intact.
12
+ - Migrate the research source, tests, docs, extension, plugin, and database migration files into the IndieCRM CLI repository.
13
+ - Update command examples, upgrade guidance, and research documentation for the `indiecrm` executable.
14
+
15
+ ## 0.1.0
16
+
17
+ - Fork the Salesprompter CLI repository under the IndieCRM name.
18
+ - Add IndieCRM browser OAuth sign-in and commands for workspaces, pipelines, deals, contacts, companies, and activities through IndieCRM's MCP API.
19
+ - Publish only the IndieCRM command and auth implementation in the npm package.
20
+
21
+ ## Salesprompter release history
22
+
23
+ The following entries document the original research implementation before it was included in `indiecrm-cli`.
24
+
25
+ ## 0.1.84 - 2026-09-08
26
+
27
+ - Preserve checkpoints and release research locks when a guided review is cancelled with Ctrl+C or EOF.
28
+
29
+ - 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`.
30
+ - 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.
31
+ - 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.
32
+ - 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.
33
+
34
+ ## 0.1.83 - 2026-09-07
35
+
36
+ - Add native canonical-employer verification, safe presentation/legal-name aliases, and retained source evidence; never relax numeric current-employer identity checks.
37
+ - Add fingerprint-bound `--review-file` decisions for unresolved identities and employer aliases without changing the original brief or discarding collected people.
38
+ - 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.
39
+ - 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.
40
+ - Tighten software, digital-product/UX and technical-data role classification. Preserve multiple review reasons and identify the selection policy in reports.
41
+ - 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.
42
+
43
+ ## 0.1.82 - 2026-09-07
44
+
45
+ - Let Chrome research unwind normally on SIGINT, SIGTERM and SIGHUP instead of exiting before checkpoint-lock cleanup.
46
+ - Close only the owned Chrome process, preserve completed searches, release the research lock and return an explicit interrupted status with the corresponding exit code.
47
+ - Add real-Chrome subprocess tests that interrupt an in-flight request with SIGINT/SIGTERM and prove that restart collects only the pending job.
48
+
49
+ ## 0.1.81 - 2026-09-07
50
+
51
+ - Require Node.js 22.12+ for the current Chrome driver; Node.js 24 LTS is recommended.
52
+
53
+ - Add `browser:connect` for one-time manual sign-in to an isolated, persistent research Chrome profile.
54
+ - 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.
55
+ - 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.
56
+ - 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.
57
+
58
+ ## 0.1.80 - 2026-09-07
59
+
60
+ - Load LinkedIn credentials lazily so completed company research can resume without a live LinkedIn session.
61
+ - Add bounded `--wait-for-session` recovery from refreshed extension credentials; reject identity changes and never retry rate limits.
62
+ - Add `--retry-unresolved` to retry cached identity misses without discarding completed searches or successful resolutions.
63
+ - Test credential waiting, offline checkpoint reuse, command option validation and targeted identity retries. Codex browser relay still requires an external worker.
64
+
65
+ ## 0.1.79 - 2026-09-06
66
+
67
+ - Execute name-only company resolution and contact collection in one `leads:at-companies --resolve-companies --all` run.
68
+ - Paginate exact Account Search identity checks, reject ambiguity and shared IDs, preserve resolution evidence and reuse the checkpoint without manual brief edits.
69
+ - Keep known-company work first, share session recovery, retain pacing/rate-limit stops and never activate outreach.
70
+ - Verified live from the name Helsing to company ID and two shortlisted contacts; added orchestration and resume regressions.
71
+
72
+ ## 0.1.78 - 2026-09-06
73
+
74
+ - Report distinct shortlist/review people separately from candidate/function rows, with partial, unknown, pending and unresolved coverage and explicit next actions.
75
+ - Add checkpoint-bound `--report-only` without LinkedIn requests.
76
+ - Support explicit evidence-backed employer-name aliases while retaining exact current-company ID checks and export provenance.
77
+ - Document browser-worker loopback handoff and safe continuation rules in the distributed CLI skill.
78
+
79
+ ## 0.1.77 - 2026-09-06
80
+
81
+ - Escape punctuation in company query labels; verified against the TKMS HTTP 400 regression.
82
+ - Refresh private shortlist, review and coverage exports after every completed search.
83
+
84
+ ## 0.1.76 - 2026-09-06
85
+
86
+ - Expand named-company research to talent acquisition, business intelligence, digital workplace, CDO and German department-head titles.
87
+ - Separate broad digital, transformation, communications, operational-technology and mixed-role matches into a private review queue instead of inflating the shortlist.
88
+ - Prefer current-position employer evidence over stale summary IDs and consider all matching current positions. Keep assistant, former-role and junior exclusions.
89
+ - Preserve source employer names and flag name/ID scope conflicts for review, including parent/subsidiary ambiguity.
90
+ - Add regression tests drawn from Matthias's archived role patterns, including ambiguity, employer drift and review-file privacy.
91
+
92
+ ## 0.1.75
93
+
94
+ - Company research retries rejected LinkedIn authentication once with a different extension-synced session and reuses it for later searches.
95
+ - Preserve checkpoints, stop on rate limits, and explain browser-relay recovery when no working session is available.
96
+
97
+ All notable user-facing changes to `salesprompter-cli` should be recorded in this file.
98
+
99
+ The format is intentionally lightweight and release-oriented.
100
+
101
+ ## 0.1.74 - 2026-09-06
102
+
103
+ ### Added
104
+
105
+ - 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.
106
+ - Workspace-bound resumable checkpoints, bounded search batches, concurrent-run protection, unresolved-company reporting and explicit partial-search evidence. No implicit email enrichment or outreach.
107
+
108
+ ## 0.1.73 - 2026-09-02
109
+
110
+ ### Added
111
+
112
+ - `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.
113
+ - Missing-name fallbacks, exact step-URL preservation, all-choice word/phrase checks, clear opt-outs and a concise paid-link disclosure.
114
+ - 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.
115
+
116
+ ### Fixed
117
+
118
+ - Large piped JSON output is flushed before CLI exit so copy reviews cannot be silently truncated.
119
+
120
+ ## 0.1.72 - 2026-08-30
121
+
122
+ ### Added
123
+
124
+ - Affiliate runs now surface aggregate Hunter verification evidence alongside the existing Instantly verification health.
125
+
126
+ ### Changed
127
+
128
+ - 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.
129
+
130
+ ### Safety
131
+
132
+ - 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.
133
+
134
+ ## 0.1.71 - 2026-08-30
135
+
136
+ ### Added
137
+
138
+ - 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.
139
+
140
+ ## 0.1.70 - 2026-08-30
141
+
142
+ ### Added
143
+
144
+ - `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.
145
+
146
+ ### Safety
147
+
148
+ - 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.
149
+
150
+ ## 0.1.69 - 2026-08-26
151
+
152
+ ### Added
153
+
154
+ - 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.
155
+ - 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.
156
+
157
+ ### Safety
158
+
159
+ - 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.
160
+ - 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.
161
+
162
+ ## 0.1.68 - 2026-08-25
163
+
164
+ ### Added
165
+
166
+ - 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.
167
+ - Added an authenticated canonical audience readback before any Instantly draft is prepared.
168
+
169
+ ### Changed
170
+
171
+ - Affiliate people collection now retries a rejected saved session once with the latest extension-synced session and no longer retries deterministic `401`/`403` responses.
172
+ - Affiliate persistence removes within-batch and prior-workspace audience duplicates. Zero-net-new cohorts create no audience, enrichment job, or Instantly campaign.
173
+
174
+ ### Safety
175
+
176
+ - Session rejection and persistence-count drift fail closed before outreach preparation; activation remains explicit.
177
+
178
+ ## 0.1.67 - 2026-08-25
179
+
180
+ ### Added
181
+
182
+ - Added local-only `products:collect` / `linkedin-products:collect` for resumable, exact-order LinkedIn product-search collection through a loopback signed-in-browser relay.
183
+ - Added terminal-page proof, public-field allowlisting, contiguous first-seen ranks, query hashing, and a reproducible SHA-256 order checksum to complete artifacts.
184
+
185
+ ### Safety
186
+
187
+ - Bounded, interrupted, challenged, rate-limited, and identity-drift runs remain incomplete and cannot emit a complete artifact or upload data to Salesprompter.
188
+
189
+ ## 0.1.66 - 2026-08-13
190
+
191
+ ### Added
192
+
193
+ - 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.
194
+
195
+ ### Changed
196
+
197
+ - Kept the existing `leads:collect` behavior unchanged when the new flag is omitted, and added explicit `emailEnrichmentDeferred` and `outreachStarted` fields to collection output.
198
+
199
+ ## 0.1.65 - 2026-08-13
200
+
201
+ ### Fixed
202
+
203
+ - 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.
204
+
205
+ ## 0.1.64 - 2026-08-13
206
+
207
+ ### Added
208
+
209
+ - Added `affiliate:list` for safe workspace-scoped audience and outreach summaries.
210
+ - Added `affiliate:analytics <run-id>` for campaign totals plus step/variant reply and opportunity metrics; meetings and won deals remain campaign-level totals only.
211
+ - Exposed `affiliate:regenerate-sequence` in top-level help and the Outreach pack.
212
+
213
+ ### Changed
214
+
215
+ - Added `--timing-mode auto|custom` to `affiliate:run`; the default `custom` mode now makes `--daily-limit`, `--send-from`, and `--send-to` effective.
216
+ - Made the fixed three-email sequence contract explicit, rejecting every other `--steps` value before creating an audience or campaign.
217
+ - 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`.
218
+
219
+ ## 0.1.63 - 2026-08-13
220
+
221
+ ### Fixed
222
+
223
+ - Hardened browser login callbacks against speculative requests and persistent connections so a completed login returns control to the CLI reliably.
224
+
225
+ ## 0.1.62 - 2026-07-31
226
+
227
+ ### Added
228
+
229
+ - Added automatic per-query checkpoints for exhaustive Sales Navigator people collection.
230
+ - Resume completed slices and canonical people after interruption or rate limiting, then remove the checkpoint only after workspace persistence succeeds.
231
+
232
+ ### Fixed
233
+
234
+ - Restrict people normalization to the Sales Navigator response's actual result elements so unrelated `included` records and decorations cannot inflate an import.
235
+
236
+ ## 0.1.61 - 2026-07-31
237
+
238
+ ### Fixed
239
+
240
+ - 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.
241
+ - Record the exact `reportedCountDrift` and avoid redundant whole-root recovery passes after an exhaustive partition has completed.
242
+
243
+ ## 0.1.60 - 2026-07-31
244
+
245
+ ### Fixed
246
+
247
+ - 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.
248
+ - Keep larger gaps and every oversized aggregate fail-closed until adaptive slicing recovers the full deduplicated result set.
249
+ - Align the checkpointed Account Search collector and all packaged skill references with the 1,000-company native window.
250
+ - Upgrade the npm release workflow to the current checkout and Node setup action majors.
251
+
252
+ ## 0.1.59 - 2026-07-31
253
+
254
+ ### Improved
255
+
256
+ - 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.
257
+ - Preserved recursive splitting only for slices that genuinely exceed the applicable result window.
258
+
259
+ ## 0.1.58 - 2026-07-31
260
+
261
+ ### Fixed
262
+
263
+ - Added adaptive recovery for under-cap Sales Navigator searches whose paginated rows contain duplicate or unstable profile entries.
264
+ - Headcount-slice and deduplicate those short collections before persistence, while keeping the existing fail-closed completeness check.
265
+
266
+ ## 0.1.57 - 2026-07-31
267
+
268
+ ### Changed
269
+
270
+ - Raised the normal Sales Navigator people-search window to 2,500 while preserving the 1,000-result account and `Connections of` limits.
271
+ - Made unbounded `leads:collect` runs automatically split oversized searches by company headcount, recurse through safe dimensions when needed, and deduplicate by canonical profile URL.
272
+
273
+ ### Improved
274
+
275
+ - Persisted aggregate imports as one workspace run with per-slice evidence and fail-closed coverage checks.
276
+ - Documented the exhaustive historical-backfill flow and kept enrichment separate from outreach.
277
+
278
+ ## 0.1.56 - 2026-07-31
279
+
280
+ ### Changed
281
+
282
+ - 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.
283
+ - Aligned affiliate people imports with the app's automatic Phantombuster-to-Hunter email processing pipeline.
284
+
285
+ ### Improved
286
+
287
+ - Documented capped people imports and kept structured completion, truncation, and remaining-result reporting intact at the new limit.
288
+
289
+ ## 0.1.55 - 2026-07-31
290
+
291
+ ### Added
292
+
293
+ - Added `leads:download` / `leads:export-csv` to download stored leads from the active Salesprompter workspace as CSV.
294
+ - Added run, search, email-only, and output-path filters that match the app's CLI imports export.
295
+
296
+ ## 0.1.54 - 2026-07-29
297
+
298
+ ### Added
299
+
300
+ - Added `--retry-not-found-companies` for versioned, resumable retries of previous exact company misses without refreshing already enriched profiles.
301
+ - Added Hunter company-name fallback when no unambiguous official domain is available, plus `--no-hunter-company-fallback` for domain-only runs.
302
+ - Added `--retry-failed-emails` so transient or validation failures can be retried without rebilling previous Hunter `not_found` results.
303
+
304
+ ### Improved
305
+
306
+ - Retry Account Search with a cleaned legal company name while retaining the exact normalized-match requirement.
307
+ - Recover conservative name-formatting failures such as honorifics, credentials, underscores, and quoted names before a second Hunter lookup.
308
+ - Reuse an existing domain only when an exact normalized company name maps to one unique domain in the active organization.
309
+
310
+ ## 0.1.53 - 2026-07-28
311
+
312
+ ### Fixed
313
+
314
+ - 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.
315
+
316
+ ## 0.1.52 - 2026-07-28
317
+
318
+ ### Fixed
319
+
320
+ - Fall back to exact-name Sales Navigator Account Search when an imported company id returns a per-company `404`.
321
+ - Stop reusing stale company ids as shortcuts for name-only aliases, so recoverable companies can receive their official domains before Hunter enrichment.
322
+
323
+ ## 0.1.51 - 2026-07-28
324
+
325
+ ### Added
326
+
327
+ - Added `leads:enrich-import` for the explicit local Sales Navigator company -> official domain -> Hunter pipeline across one or more stored CLI imports.
328
+ - Added durable, organization-scoped company profile and email-enrichment persistence with staged company-only and Hunter-only operation.
329
+
330
+ ### Changed
331
+
332
+ - Kept this import-enrichment flow data-only: it never creates sequences, Instantly campaigns, or outreach and reports `outreachStarted = false`.
333
+
334
+ ## 0.1.50 - 2026-07-27
335
+
336
+ ### Fixed
337
+
338
+ - 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.
339
+ - Made capped people-search imports explicit with `collectionComplete`, `truncated`, and `remainingResults` in the structured CLI result.
340
+
341
+ ## 0.1.44 - 2026-07-20
342
+
343
+ ### Added
344
+
345
+ - Added the complete affiliate campaign journey: local Sales Navigator people collection, persisted audience runs, email enrichment, draft Instantly campaigns, status checks, and explicit activation.
346
+ - Added `affiliate:enrich <run-id>` to recover additional campaign emails in the background, deduplicate existing leads, and import only new contacts with verification enabled.
347
+ - Added durable Account Search collection, market membership persistence, and prefixed Salesprompter Supabase migrations.
348
+
349
+ ### Changed
350
+
351
+ - Affiliate email discovery now uses Hunter first and the configured Phantombuster Email Finder for unresolved people.
352
+ - Updated the packaged Salesprompter skill and CLI documentation to match the current local collection and outreach workflows.
353
+
354
+ ## 0.1.43 - 2026-07-01
355
+
356
+ ### Added
357
+
358
+ - Added `companies:scrape-linkedin` / `linkedin-companies:scrape-local` for locally captured LinkedIn company profile and insights enrichment with timestamped database history.
359
+ - Added `companies:scrape-dealroom` / `dealroom-companies:scrape-local` for locally captured Dealroom company enrichment with timestamped database history.
360
+
361
+ ### Changed
362
+
363
+ - Added local scrape history tables for LinkedIn company snapshots, LinkedIn company insight rows, and Dealroom company snapshots.
364
+ - Filtered invalid, generic, and image-less LinkedIn account-search profiles out of the reporting view used by the Data Studio account-search dashboard.
365
+
366
+ ## 0.1.42 - 2026-06-28
367
+
368
+ ### Fixed
369
+
370
+ - 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.
371
+
372
+ ## 0.1.36 - 2026-05-11
373
+
374
+ ### Changed
375
+
376
+ - Restored the repo-local Chrome extension compatibility copy and LinkedIn direct-strategy benchmark script.
377
+ - Added direct LinkedIn workflow updates for target-company inputs and workspace lead generation internals.
378
+ - Tightened Deel/direct-path company-size filtering to map Salesprompter size buckets into employee-count ranges.
379
+
380
+ ## 0.1.35 - 2026-05-11
381
+
382
+ ### Fixed
383
+
384
+ - 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.
385
+
386
+ ## 0.1.34 - 2026-05-10
387
+
388
+ ### Changed
389
+
390
+ - 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.
391
+ - Added `--workspace`, `--org-id`, and `--browser` options to `auth:workspace` for direct workspace switches and explicit browser fallback.
392
+ - Kept the browser chooser as a fallback when the app workspace API is unavailable or no cached CLI session exists.
393
+
394
+ ## 0.1.33 - 2026-05-10
395
+
396
+ ### Changed
397
+
398
+ - Added `auth:workspace` / `auth:switch` so operators can reopen the workspace chooser without restarting or clearing auth manually.
399
+ - Added a wizard-level `Switch workspace` option for changing workspaces before choosing a workflow.
400
+ - Made the product-market wizard detect pasted LinkedIn Sales Navigator people-search URLs and process them directly through the durable Sales Navigator crawl path.
401
+
402
+ ## 0.1.32 - 2026-05-10
403
+
404
+ ### Changed
405
+
406
+ - Refresh cached wizard sessions through the app before rendering workspace choices, so older tokens can pick up Clerk and Salesprompter workspace metadata.
407
+ - Display Salesprompter workspace client metadata in the wizard when the app returns it.
408
+
409
+ ## 0.1.31 - 2026-05-10
410
+
411
+ ### Changed
412
+
413
+ - Replaced the cached-workspace yes/no prompt with a workspace selector in the interactive wizard.
414
+ - Show workspace names, slugs, and ids when the cached token includes them, and offer a browser workspace chooser when it does not.
415
+
416
+ ## 0.1.30 - 2026-05-10
417
+
418
+ ### Changed
419
+
420
+ - Made the interactive wizard show and confirm the cached Salesprompter workspace before starting a workflow.
421
+ - 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.
422
+
423
+ ## 0.1.29 - 2026-04-02
424
+
425
+ ### Changed
426
+
427
+ - Fixed the durable Sales Navigator crawl loop so `--max-slices` does not keep retry-claiming distinct slices after a retryable failure.
428
+ - Hardened Sales Navigator CLI integration tests to bound subprocess lifetime while still verifying the JSON payloads they emit.
429
+
430
+ ## 0.1.28 - 2026-04-01
431
+
432
+ ### Added
433
+
434
+ - `companies:resolve-linkedin-urls` for resolving LinkedIn company URLs from pasted company lists.
435
+ - Serper-backed LinkedIn company lookup fallback when `SERPER_API_KEY` or `SALESPROMPTER_SERPER_API_KEY` is configured.
436
+ - Community and governance files: contributing guide, code of conduct, security policy, issue templates, PR template, and funding metadata.
437
+
438
+ ### Changed
439
+
440
+ - Improved company URL matching to reject weak LinkedIn company false positives with page-level validation.
441
+ - Expanded README and package metadata to better describe the public CLI surface and support channels.
442
+
443
+ ## 0.1.27 - 2026-03-25
444
+
445
+ ### Notes
446
+
447
+ - 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.
@@ -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, so data access follows your signed-in account and workspace permissions.
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. Salesprompter commands are not part of the published package.
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.