open-local-audit 0.76.0 → 0.77.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.
Files changed (47) hide show
  1. package/CHANGELOG.md +512 -497
  2. package/LICENSE +21 -21
  3. package/README.md +543 -538
  4. package/dist/audit.d.ts +2 -0
  5. package/dist/audit.js +13 -0
  6. package/dist/audit.js.map +1 -1
  7. package/dist/cli.js +37 -12
  8. package/dist/cli.js.map +1 -1
  9. package/dist/compare.d.ts +17 -1
  10. package/dist/compare.js +170 -6
  11. package/dist/compare.js.map +1 -1
  12. package/dist/contact.d.ts +7 -0
  13. package/dist/contact.js +106 -2
  14. package/dist/contact.js.map +1 -1
  15. package/dist/discovery.d.ts +1 -0
  16. package/dist/discovery.js +92 -6
  17. package/dist/discovery.js.map +1 -1
  18. package/dist/index.d.ts +4 -2
  19. package/dist/index.js +2 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/overture.js +28 -28
  22. package/dist/pdf.js +2 -1
  23. package/dist/pdf.js.map +1 -1
  24. package/dist/pitch-brief.d.ts +33 -0
  25. package/dist/pitch-brief.js +160 -0
  26. package/dist/pitch-brief.js.map +1 -0
  27. package/dist/report-pack.js +2 -1
  28. package/dist/report-pack.js.map +1 -1
  29. package/dist/reporters.js +4 -2
  30. package/dist/reporters.js.map +1 -1
  31. package/dist/rules.js +34 -0
  32. package/dist/rules.js.map +1 -1
  33. package/dist/shortlist-runner.d.ts +4 -0
  34. package/dist/shortlist-runner.js +10 -0
  35. package/dist/shortlist-runner.js.map +1 -1
  36. package/dist/tls-probe.d.ts +2 -0
  37. package/dist/tls-probe.js +46 -0
  38. package/dist/tls-probe.js.map +1 -0
  39. package/dist/types.d.ts +9 -0
  40. package/dist/website-enrichment.d.ts +3 -0
  41. package/dist/website-enrichment.js +27 -1
  42. package/dist/website-enrichment.js.map +1 -1
  43. package/dist/workflow.d.ts +1 -1
  44. package/dist/workflow.js +2 -2
  45. package/dist/workflow.js.map +1 -1
  46. package/docs/guides/free-discovery.md +151 -151
  47. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,497 +1,512 @@
1
- # Changelog
2
-
3
- All notable changes to Open Local Audit will be documented here.
4
-
5
- ## v0.76.0 - 2026-10-09
6
-
7
- - `discover --provider overture` now accepts `lawyer`, `solicitor`, and `attorney` (Overture `attorney_or_law_firm`, including practice-area subcategories) and `legal` (`legal_service`). The older category names `legal_services` and `attorney_and_law_services`, which matched nothing in the current Overture taxonomy, now map to the same identifiers.
8
- - Overture discovery in the UK now flags leads that list the same locality as most leads with the search's common landline area code but have a different landline area code, such as a Weston-super-Mare `01934` clinic listed in Leeds. The lead gets a location reason, a "Confirm the business location" next action, and at most medium priority; it is never removed.
9
-
10
- ## v0.75.0 - 2026-10-09
11
-
12
- - Added an operator-only `dotnetStack` field to JSON audit reports. It fingerprints ASP.NET Web Forms, MVC, .NET Framework, ASP.NET Core, and Blazor from the response headers, `Set-Cookie` names, and page HTML the audit already fetched, with a `legacyFramework` flag, confidence, optional .NET Framework version from `X-AspNet-Version`, and matched evidence. IIS or `X-Powered-By: ASP.NET` alone stays `aspnet-unknown` with low confidence. Standard batch and discovery CSV exports gain `dotnetStack` and `dotnetLegacyFramework` columns. Findings, scores, and Markdown, HTML, and PDF reports are unchanged.
13
- - Exported `detectDotnetStack` and the `DotnetStack` and `DotnetStackEvidence` types from the public API.
14
- - Static audits now keep every `Set-Cookie` response header instead of only the last one.
15
- - The `single-h1` finding now says when the only H1 has no text, for example when it wraps just a logo image, instead of reporting "1 H1 elements".
16
- - Maintenance and parked or for-sale pages now produce a single `website-placeholder` finding with all scores at 0 instead of a full SEO audit of the placeholder. Discovery ranks those leads as website-build opportunities with opportunity score 95 and high priority. Only pages with at most 600 characters of title and visible text, whose copy says the website itself is down or opens with a maintenance notice, are treated as placeholders.
17
-
18
- ## v0.74.0 - 2026-10-08
19
-
20
- - Added the `compare` command. It reads an earlier and a later JSON report for the same site, from files or report directories, and writes a progress report listing fixed, still open, and new findings with category and overall score changes, as Markdown, JSON, or HTML with optional report branding. Reports for different sites or profiles, or given in reverse order, are rejected.
21
- - Exported `compareReports`, `readComparisonReport`, and the comparison renderers from the public API.
22
- - Added the `mixed-content-absent` audit rule. On pages served over HTTPS it flags scripts, stylesheets, icons, images (including `srcset` candidates), media, iframes, and embeds loaded over plain HTTP, listing up to five URLs as evidence. Plain HTTP links are not flagged.
23
-
24
- ## v0.73.0 - 2026-10-07
25
-
26
- - Added the `page-indexable` audit rule. It flags pages that tell search engines not to index them through a `noindex` or `none` directive in a `robots` or `googlebot` meta tag or in the `X-Robots-Tag` response header, listing each directive as evidence. Directives aimed only at other crawlers are ignored.
27
- - Updated the locked `source-map-js` development dependency to a patched release after the release audit reported a high-severity event-loop denial-of-service advisory.
28
-
29
- ## v0.72.0 - 2026-10-05
30
-
31
- - Added the `redirect-chain-short` audit rule. It records each redirect hop (URL and status) while fetching the audited page and flags pages reached through more than one redirect, showing the full chain as evidence. A single redirect, such as plain HTTP to HTTPS, is not flagged, and rendered audits without redirect data are left unchecked.
32
-
33
- ## v0.71.0 - 2026-10-04
34
-
35
- - Added the `localbusiness-schema-nap-consistency` audit rule. It flags LocalBusiness structured data whose `telephone` or `streetAddress` does not match the phone numbers or address visible on the page, comparing phones as parsed international numbers and street addresses within the page element that shows them, while tolerating formatting differences, national trunk prefixes, common street abbreviations, and diacritics. Pages without a visible phone or address are left to the existing presence rules.
36
-
37
- ## v0.70.0 - 2026-10-03
38
-
39
- - Added evidence-based Overture business-to-website identity checks using structured names, valid phone numbers, and addresses. Missing or mixed evidence remains uncertain; conflicting sites cannot supply business contacts or audit scores.
40
- - Added identity status, reasons, and field evidence to standard CSV and JSON/Markdown/HTML/PDF reports. Uncertain identity requires manual review and caps contact confidence at Low.
41
- - Added `--audit-priority missing-contact`, guided priority selection in `start`, and optional workflow `auditPriority`. Source order remains the default; selected candidates fill missing source email first, then phone, while exports retain their original order.
42
- - Preserved candidate identity when businesses share a website and added regression coverage for branch differences and conflicting identities across fetched pages.
43
- - Added a bounded comparison script using frozen candidate pools and shared website observations. Small live samples do not establish a contact-yield or identity-accuracy improvement.
44
-
45
- ## v0.69.0 - 2026-10-02
46
-
47
- - Added a seven-day local cache for repeated Overture searches in `discover` and `start`, keyed by source release, category, bounds, and result limit while preserving the original retrieval time.
48
- - Added `--cache-dir`, `--refresh-cache`, and `--no-cache`; cache failures fall back to fresh discovery and website audits are always rerun.
49
- - Added interactive `start` prompts with input validation, a confirmation summary, cancellation, and protection against overwriting existing output directories.
50
- - Added explicit cache controls and cache-state reporting to the benchmark, including discovery-only measurements with `--max-audits 0`.
51
- - Added cache integrity, filesystem safety, guided-input, and packaged CLI coverage. Existing programmatic discovery remains uncached unless a cache directory is provided.
52
-
53
- ## v0.68.0 - 2026-09-29
54
-
55
- - Added keyless worldwide business discovery using Overture Places, with GeoNames city/country lookup and bounded geographic queries.
56
- - Added source business details and provenance to standard prospect exports, preserving unknown website availability instead of assuming a website-build opportunity.
57
- - Added bounded, robots-aware website contact enrichment with public-address validation; social profiles and known short links are not audited as business websites.
58
- - Integrated Overture with workflow configuration, offline preflight, and plan output while preserving manual CSV and explicit Google Places discovery.
59
- - Added a reproducible benchmark for Türkiye, the USA, Germany, and the UK across eight cities and three categories.
60
- - Updated Lighthouse and affected dependencies to patched versions. **Compatibility: Node.js 22.19 or newer is now required** by Lighthouse 13; Node.js 20 is no longer supported.
61
-
62
- ## v0.67.0 - 2026-08-09
63
-
64
- - Added an atomic workflow-state lifecycle manifest with trusted stage visibility.
65
- - Added read-only `workflow --status` terminal and JSON modes with defined exit semantics.
66
- - Added checkpoint hash correlation, legacy v1 compatibility, and conservative resume guidance.
67
- - Added independent package-source integrity markers and lead packaging isolation.
68
- - Added public API, fresh-install, and documentation coverage.
69
- - Patched transitive audit resolutions.
70
-
71
- ## v0.66.0 - 2026-08-02
72
-
73
- - Added all 21 shortlist filter fields to the workflow configuration schema, including `minScore`, `segment`, `profile`, `priority`, `contactConfidence`, `minContactConfidence`, `preferredContactChannel`, `source`, `auditStatus`, `hasWebsite`, `topFinding`, `reviewStatus`, `excludeReviewStatus`, `unreviewed`, `reviewedBefore`, `requireWebsite`, `missingWebsite`, `requireContact`, `missingContact`, `requireReport`, and `missingReport`.
74
- - Added new shortlist settings to workflow plan output for operator visibility.
75
- - Kept workflow configuration local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
76
-
77
- ## v0.65.0 - 2026-07-30
78
-
79
- - Added explicit `workflow --config <path> --resume` recovery from the latest verified stage checkpoint.
80
- - Added strict configuration fingerprint, managed artifact, report source, and checkpoint state validation before resumed work begins.
81
- - Kept existing workflow summary, preflight, and plan output contracts stable while rerunning incomplete packaging as a complete stage.
82
- - Updated the locked PostCSS development dependency to a patched release after the release audit reported a high-severity source map path traversal advisory.
83
-
84
- ## v0.64.0 - 2026-07-21
85
-
86
- - Added `workflow --config <path> --plan` for a read-only explanation of readiness, execution order, effective settings, network capability, and managed artifacts.
87
- - Added stable terminal output and a versioned JSON workflow plan for operators and automation.
88
- - Kept planning free of network calls and output mutation while preserving existing preflight and workflow execution behavior.
89
-
90
- ## v0.63.0 - 2026-07-19
91
-
92
- - Added `workflow --config <path> --check` to validate workflow readiness before execution.
93
- - Added stable terminal output and a versioned JSON preflight report for operator and automation use.
94
- - Kept preflight read-only and local: no network calls or output mutation, with advisory filesystem readiness checks and managed-path safety validation.
95
-
96
- ## v0.62.0 - 2026-07-16
97
-
98
- - Added `workflow --config <path>` to run versioned discovery, shortlist, optional review summary, and optional report packaging from one strict JSON configuration.
99
- - Added deterministic managed workflow outputs with fail-fast stage summaries and independent package failure reporting.
100
- - Kept workflows operator-controlled and local-only, with no outreach sending or CRM synchronization; Google Places remains opt-in and requires its existing API key and billing acknowledgement.
101
-
102
- ## v0.61.0 - 2026-07-14
103
-
104
- - Added batch `--summary-json <path>` output using the existing aggregate batch index JSON contract independently of report format.
105
- - Kept explicit batch summary output local-only and additive to standard batch index files.
106
-
107
- ## v0.60.0 - 2026-07-12
108
-
109
- - Added `source`, `auditStatus`, and `hasWebsite` columns to batch standard and CRM prospect CSV exports.
110
- - Kept batch CSV rendering local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
111
-
112
- ## v0.59.0 - 2026-07-11
113
-
114
- - Added `--source`, `--audit-status`, and `--has-website` batch index filters to the main audit command.
115
- - Applied batch index filtering before sorting and top-N selection.
116
- - Kept batch filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
117
-
118
- ## v0.58.0 - 2026-07-10
119
-
120
- - Added `actionableLeads` to `review --summary-json` output with deduplicated lead keys and their `unreviewed`, `invalid-reviewed-at`, or `stale` reasons.
121
- - Preserved `actionableLeadKeys` for existing consumers and kept review summaries read-only.
122
-
123
- ## v0.57.0 - 2026-07-09
124
-
125
- - Added `actionableLeadKeys` to `review --summary-json` output as a deduplicated unreviewed, invalid-date, and stale review queue.
126
- - Kept actionable review summaries read-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
127
-
128
- ## v0.56.0 - 2026-07-08
129
-
130
- - Added `unreviewedLeadKeys` to `review --summary-json` output when unreviewed rows have lead keys.
131
- - Kept unreviewed queue summaries read-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
132
-
133
- ## v0.55.0 - 2026-07-07
134
-
135
- - Added `invalidReviewedAtLeadKeys` to `review --summary-json` output when invalid review date rows have lead keys.
136
- - Kept invalid review date summaries read-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
137
-
138
- ## v0.54.0 - 2026-07-06
139
-
140
- - Added `staleLeadKeys` to `review --summary-json` output when stale review rows have lead keys.
141
- - Kept stale review summaries read-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
142
-
143
- ## v0.53.0 - 2026-07-05
144
-
145
- - Added `contact-confidence-desc`, `priority-desc`, and `source-asc` sort modes to `shortlist --sort`.
146
- - Kept shortlist sorting local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
147
-
148
- ## v0.52.0 - 2026-07-04
149
-
150
- - Added a fresh consumer install audit to `npm run release-check`.
151
- - Verified release tarballs install as the current package version before publish.
152
- - Kept the release gate local and dependency-free by using npm and Node standard library only.
153
-
154
- ## v0.51.0 - 2026-07-03
155
-
156
- - Added `review --stale-before YYYY-MM-DD` for read-only stale review counts in local review CSV summaries.
157
- - Included stale review counts in `review --summary-json` output.
158
- - Kept stale review summary checks local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
159
-
160
- ## v0.50.0 - 2026-07-01
161
-
162
- - Added `review --summary` for local review CSV queue counts by status, review coverage, invalid review dates, and oldest/newest review timestamps.
163
- - Added `review --summary-json <path>` for automation-friendly review queue summaries.
164
- - Kept review summaries read-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
165
-
166
- ## v0.49.0 - 2026-06-30
167
-
168
- - Removed the default `--no-sandbox` Chrome launch flag from Lighthouse audits.
169
- - Raised the Cheerio dependency floor so fresh installs resolve a patched `undici` transitive dependency.
170
- - Documented the upgrade path for old consuming projects that still have vulnerable transitive dependency locks.
171
-
172
- ## v0.48.0 - 2026-06-30
173
-
174
- - Added bulk `review --input <path>` updates from shortlist CSV and JSON files.
175
- - Added `review --dry-run` previews for bulk review CSV updates.
176
- - Kept bulk review updates local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
177
-
178
- ## v0.47.0 - 2026-06-29
179
-
180
- - Added `source`, `auditStatus`, and `hasWebsite` columns to shortlist CSV and Markdown reports.
181
- - Kept shortlist rendering local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
182
-
183
- ## v0.46.0 - 2026-06-29
184
-
185
- - Added `shortlist --top-finding <finding>` for local top-finding shortlist filtering.
186
- - Applied top-finding filtering after review suppression and before sorting and top-N selection.
187
- - Kept top-finding filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
188
-
189
- ## v0.45.0 - 2026-06-29
190
-
191
- - Added `shortlist --has-website <status>` for local website-presence shortlist filtering.
192
- - Applied has-website filtering after review suppression and before sorting and top-N selection.
193
- - Kept has-website filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
194
-
195
- ## v0.44.0 - 2026-06-28
196
-
197
- - Added `shortlist --min-contact-confidence <level>` for local ordinal contact-confidence shortlist filtering.
198
- - Applied min-contact-confidence filtering after review suppression and before sorting and top-N selection.
199
- - Kept min-contact-confidence filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
200
-
201
- ## v0.43.0 - 2026-06-27
202
-
203
- - Added `shortlist --audit-status <status>` for local audit-status shortlist filtering.
204
- - Applied audit-status filtering after review suppression and before sorting and top-N selection.
205
- - Kept audit-status filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
206
-
207
- ## v0.42.0 - 2026-06-24
208
-
209
- - Added `shortlist --min-score <score>` for local audit-score shortlist filtering.
210
- - Applied min-score filtering after review suppression and before sorting and top-N selection.
211
- - Kept min-score filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
212
-
213
- ## v0.41.0 - 2026-06-24
214
-
215
- - Added `review --review-csv <path> --lead-key <key> --status <status>` for local review CSV upserts.
216
- - Preserved existing review CSV columns while adding missing review-state columns and writing ISO review timestamps.
217
- - Kept review updates local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
218
-
219
- ## v0.40.0 - 2026-06-23
220
-
221
- - Added `shortlist --source <source>` for local discovery-source shortlist filtering.
222
- - Applied source filtering after review suppression and before sorting and top-N selection.
223
- - Kept source filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
224
-
225
- ## v0.39.0 - 2026-06-20
226
-
227
- - Added `shortlist --reviewed-before <date>` for local re-review shortlist queues.
228
- - Added strict `YYYY-MM-DD` threshold validation and strictly-earlier review-date filtering.
229
- - Kept reviewed-before filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
230
-
231
- ## v0.38.0 - 2026-06-19
232
-
233
- - Added `shortlist --unreviewed` for local first-review shortlist queues.
234
- - Applied unreviewed filtering after review suppression and before sorting and top-N selection.
235
- - Kept unreviewed filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
236
-
237
- ## v0.37.0 - 2026-06-17
238
-
239
- - Added `shortlist --missing-website` for local website-backlog shortlist filtering.
240
- - Applied missing-website filtering after review suppression and before sorting and top-N selection.
241
- - Kept missing-website filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
242
-
243
- ## v0.36.0 - 2026-06-16
244
-
245
- - Added `shortlist --missing-contact` for local contact-backlog shortlist filtering.
246
- - Applied missing-contact filtering after review suppression and before sorting and top-N selection.
247
- - Kept missing-contact filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
248
-
249
- ## v0.35.0 - 2026-06-15
250
-
251
- - Added `shortlist --missing-report` for local report-backlog shortlist filtering.
252
- - Applied missing-report filtering after review suppression and before sorting and top-N selection.
253
- - Kept missing-report filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
254
-
255
- ## v0.34.0 - 2026-06-14
256
-
257
- - Added `shortlist --preferred-contact-channel <channel>` for local outreach-channel shortlist filtering.
258
- - Applied preferred-contact-channel filtering after review suppression and before sorting and top-N selection.
259
- - Kept preferred-contact-channel filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
260
-
261
- ## v0.33.0 - 2026-06-13
262
-
263
- - Added `shortlist --require-report` for local report-ready shortlist filtering.
264
- - Applied report-required filtering after review suppression and before sorting and top-N selection.
265
- - Kept report-required filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
266
-
267
- ## v0.32.0 - 2026-06-12
268
-
269
- - Added `shortlist --require-contact` for local contact-ready shortlist filtering.
270
- - Applied contact-required filtering after review suppression and before sorting and top-N selection.
271
- - Kept contact-required filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
272
-
273
- ## v0.31.0 - 2026-06-11
274
-
275
- - Added `shortlist --require-website` for local website-present shortlist filtering.
276
- - Applied website-required filtering after review suppression and before sorting and top-N selection.
277
- - Kept website-required filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
278
-
279
- ## v0.30.0 - 2026-06-09
280
-
281
- - Added `shortlist --exclude-review-status <status>` for local active-review-status exclusion.
282
- - Applied review-status exclusion after review suppression and before sorting and top-N selection.
283
- - Kept exclusion filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
284
-
285
- ## v0.29.0 - 2026-06-08
286
-
287
- - Added `shortlist --summary-json <path>` for separate local automation summary output.
288
- - Added `renderShortlistSummaryJson` for package consumers.
289
- - Kept summary output local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
290
-
291
- ## v0.28.0 - 2026-06-07
292
-
293
- - Added `shortlist --sort <sort>` for local shortlist ranking control.
294
- - Supported `opportunity-desc`, `score-desc`, `company-asc`, and `last-reviewed-asc` sort modes.
295
- - Kept sorting local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
296
-
297
- ## v0.27.0 - 2026-06-06
298
-
299
- - Added `shortlist --review-status <status>` for active review-state filtering.
300
- - Applied review-status filtering after review-state suppression and before ranking and top-N selection.
301
- - Kept review-status filtering local-only with no review CSV mutation, source CSV mutation, API calls, outreach sending, or CRM sync.
302
-
303
- ## v0.26.0 - 2026-06-05
304
-
305
- - Added `shortlist` focus filters for segment, profile, priority, and contact confidence.
306
- - Combined supplied focus filters with case-insensitive `AND` matching.
307
- - Applied focus filters after review suppression and before ranking and top-N selection.
308
- - Kept focus filtering local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
309
-
310
- ## v0.25.0 - 2026-06-04
311
-
312
- - Added `shortlist --min-opportunity-score <score>` for local shortlist filtering.
313
- - Filtered low-opportunity shortlist leads after review-state suppression and before top-N ranking.
314
- - Reported filtered row counts in CLI output, Markdown summaries, and JSON results.
315
- - Kept shortlist filtering local-only with no API calls, outreach sending, review CSV mutation, or CRM sync.
316
-
317
- ## v0.24.0 - 2026-06-03
318
-
319
- - Added `shortlist --format csv` for spreadsheet-ready local shortlist output.
320
- - Included rank, scoring, contact handoff, review context, lead key, and report path columns in CSV shortlist reports.
321
- - Reused existing CSV cell hardening so formula-like shortlist values are neutralized before spreadsheet review.
322
- - Kept CSV shortlist generation local-only with no API calls, outreach sending, review CSV mutation, or CRM sync.
323
-
324
- ## v0.23.0 - 2026-06-01
325
-
326
- - Added `shortlist --review-csv <path>` for local review-state aware shortlist runs.
327
- - Suppressed already handled shortlist leads marked `rejected`, `contacted`, `not-fit`, `not_a_fit`, `do-not-contact`, or `suppressed`.
328
- - Carried active review status, review reason, and last-reviewed date into Markdown and JSON shortlist reports.
329
- - Kept shortlist review handling local-only with no review CSV mutation, API calls, outreach sending, or CRM sync.
330
-
331
- ## v0.22.0 - 2026-05-31
332
-
333
- - Added `shortlist --input <path> --out <path>` for local lead shortlist reports.
334
- - Added Markdown and JSON shortlist output for discovery and CRM CSV exports.
335
- - Ranked leads by opportunity score, priority, contact confidence, audit score, and company name.
336
- - Kept shortlist generation local-only with no API calls, outreach sending, or CRM sync.
337
-
338
- ## v0.21.0 - 2026-05-28
339
-
340
- - Added `package-report --input <path> --out <path>` for local customer-shareable report packs.
341
- - Added report-pack `README.md`, `next-actions.md`, and `manifest.json` generation from existing single-site JSON reports.
342
- - Copied available JSON, Markdown, HTML, and PDF report artifacts into the local package.
343
- - Kept report packaging local-only with no uploads, outreach sending, or CRM sync.
344
-
345
- ## v0.20.0 - 2026-05-27
346
-
347
- - Added `validate-export --input <path> --preset crm` for local CRM CSV import checks.
348
- - Added Markdown and JSON validation reports with row counts, errors, warnings, and issue details.
349
- - Flagged missing CRM columns, missing company or website fields, duplicate lead keys, low contact confidence, and manual-review handoffs.
350
- - Kept validation local-only with no CRM API sync, remote import, or outreach sending.
351
-
352
- ## v0.19.0 - 2026-05-26
353
-
354
- - Added `--export-preset standard|crm` for batch and discovery CSV exports.
355
- - Added CRM-ready local import columns for company identity, website, scoring, contact handoff, source, lead key, and report path.
356
- - Preserved existing standard CSV export behavior as the default.
357
- - Kept CRM export local-only with no CRM API sync or outreach sending.
358
-
359
- ## v0.18.0 - 2026-05-23
360
-
361
- - Added batch index contact rollups for public contact coverage and confidence.
362
- - Added batch outreach rollups for preferred manual contact channels.
363
- - Added per-entry batch index contact and outreach metadata for successful audits.
364
- - Added batch CSV export columns for contact confidence, preferred contact channel, and contactability reason.
365
-
366
- ## v0.17.0 - 2026-05-22
367
-
368
- - Added advisory fuzzy duplicate candidate groups to discovery duplicate JSON output.
369
- - Added duplicate review reasons for likely business-label and website-domain similarity.
370
- - Preserved exact duplicate reporting while keeping fuzzy matching manual-review only.
371
- - Confirmed fuzzy duplicate review does not auto-suppress leads, send outreach, or sync to a CRM.
372
-
373
- ## v0.16.0 - 2026-05-20
374
-
375
- - Added discovery outreach handoff fields: `preferredContactChannel`, `outreachAction`, and `contactabilityReason`.
376
- - Added deterministic channel selection for email, WhatsApp, phone, contact-page, and manual-review discovery leads.
377
- - Preserved CSV formula hardening for the new outreach handoff fields.
378
-
379
- ## v0.15.0 - 2026-05-19
380
-
381
- - Added public contact extraction for audited pages, including email, phone, WhatsApp, contact-page, and social-profile signals.
382
- - Added Contact Readiness sections to Markdown, HTML, and PDF reports.
383
- - Added contact enrichment columns to discovery CSV exports while preserving CSV formula hardening.
384
-
385
- ## v0.14.0 - 2026-05-16
386
-
387
- - Added `--brand-config` for JSON-driven report branding across Markdown, HTML, and PDF outputs.
388
- - Added Executive Summary sections with business impact, top issues, and a recommended first fix.
389
- - Added lead export enrichment columns: `pitchAngle`, `recommendedOffer`, `estimatedNeed`, and `outreachPriorityReason`.
390
-
391
- ## v0.13.0 - 2026-05-15
392
-
393
- - Added opt-in Lighthouse category scoring with `--lighthouse`.
394
- - Added branded PDF report output with `--format pdf`.
395
- - Added `opportunityReasons` to discovery CSV exports so operators can explain lead scores.
396
- - Added Lighthouse sections to JSON, Markdown, HTML, and PDF reports.
397
-
398
- ## v0.12.0 - 2026-05-14
399
-
400
- - Added discovery suppression lists with `--suppression-list` to skip previously reviewed leads.
401
- - Added `leadKey`, `reviewStatus`, `reviewReason`, and `lastReviewedAt` columns to discovery CSV exports for local review workflows.
402
- - Added `--min-opportunity-score` for filtering discovery exports to higher-value opportunities.
403
- - Added `--review-csv` for merging local operator review decisions across discovery reruns.
404
- - Added `--duplicates-json` for reporting duplicate lead groups.
405
- - Added lawyer, clinic, gym, hotel, and auto-service industry profiles.
406
- - Polished HTML reports with a branded shell, summary cards, and stronger visual hierarchy.
407
- - Added Windows user-environment fallback for `GOOGLE_MAPS_API_KEY`.
408
-
409
- ## v0.11.0 - 2026-05-13
410
-
411
- - Added discovery controls: `--limit`, `--max-audits`, and `--summary-json`.
412
- - Added terminal discovery summary output for website, audit, priority, and average-score counts.
413
- - Added `opportunityScore` to discovery prospect CSV exports.
414
- - Added CSV formula-injection hardening for exported CSV cells.
415
- - Added a Google Maps Platform billing warning when `--provider google-places` is used.
416
-
417
- ## v0.10.0 - 2026-05-12
418
-
419
- - Added an opt-in `google-places` provider for `discover`.
420
- - Added `GOOGLE_MAPS_API_KEY` support for official Google Places Text Search requests.
421
- - Resolved official place website URLs through `websiteUri` where available.
422
- - Kept Google Places storage conservative: no Google Maps scraping, no reviews/photos/ratings collection, and no long-term raw Places data store.
423
- - Fed resolved Google Places websites into the existing audit pipeline and prospect CSV export.
424
-
425
- ## v0.9.0 - 2026-05-12
426
-
427
- - Added `discover --input places.csv --provider manual-csv` for operator-prepared lead discovery.
428
- - Added `leads.csv` prospect exports with website presence, audit status, priority, next action, report path, and error columns.
429
- - Reused the existing batch audit pipeline for website-present discovery rows.
430
- - Added `--dry-run` discovery mode for local prospect triage without website audits.
431
- - Documented the discovery boundary: no Google Maps scraping, no `google-places` provider calls, and no outreach sending in this release.
432
-
433
- ## v0.8.0 - 2026-05-12
434
-
435
- - Added `--concurrency` for controlled parallel batch audits.
436
- - Added batch index insights with average score, profile breakdown, segment breakdown, and frequent findings.
437
- - Added profile-specific findings for dental, beauty, restaurant, and contractor audits.
438
- - Expanded profile tests to cover missing and satisfied vertical conversion/trust signals.
439
-
440
- ## v0.7.0 - 2026-05-11
441
-
442
- - Added industry profiles with `--profile generic|dental|beauty|restaurant|contractor`.
443
- - Added optional `profile` CSV input column for batch audits.
444
- - Added profile metadata to JSON, Markdown, HTML, and batch index outputs.
445
- - Added `--export-csv` for batch prospect exports with score, top finding, report path, and error columns.
446
-
447
- ## v0.6.0 - 2026-05-10
448
-
449
- - Added `--screenshot` for rendered homepage screenshot capture.
450
- - Added visual evidence metadata to JSON reports.
451
- - Added Visual Evidence sections to Markdown and HTML reports.
452
- - Added batch screenshot artifact paths for per-site report folders.
453
-
454
- ## v0.5.0 - 2026-05-09
455
-
456
- - Added opt-in Playwright-rendered audits with `--render`.
457
- - Added batch triage controls with `--segment`, `--min-score`, `--top`, and `--sort`.
458
- - Added trust and conversion checks for current date signals, review cues, service detail depth, brand icons, and placeholder social profile links.
459
-
460
- ## v0.4.0 - 2026-05-09
461
-
462
- - Added resilient batch runs that keep auditing after individual URL failures.
463
- - Added aggregate batch index reports in JSON, Markdown, and HTML.
464
- - Added CSV batch input with `url`, `label`, and `segment` columns.
465
- - Added `@graph` JSON-LD support for structured-data checks.
466
- - Added LocalBusiness contact-field, Organization schema, visible address, opening-hours, service-location copy, primary CTA, and placeholder-copy checks.
467
-
468
- ## v0.3.0 - 2026-05-09
469
-
470
- - Added standalone HTML report rendering.
471
- - Added `--format html`.
472
- - Expanded `--format all` to write JSON, Markdown, and HTML reports.
473
- - Added `--input <path>` for batch audits from text files.
474
- - Added safe per-site output folders for batch reports.
475
-
476
- ## v0.2.0 - 2026-05-08
477
-
478
- - Added optional same-origin internal link scanning with `--check-links` and `--max-pages`.
479
- - Added a high-severity finding for broken internal links.
480
- - Added `--fail-on none|high|medium|low` for CI-friendly exit codes.
481
- - Added compact terminal summaries when reports are written to files.
482
- - Added integration tests for link scanning and CLI behavior helpers.
483
-
484
- ## v0.1.1 - 2026-05-08
485
-
486
- - Added `robots.txt`, `sitemap.xml`, Open Graph, and invalid JSON-LD checks.
487
- - Added `--format all --out-dir <path>` for writing JSON and Markdown reports together.
488
- - Added fixture-based rule tests and report output tests.
489
- - Added `npm run release-check` for local and CI release verification.
490
-
491
- ## v0.1.0 - 2026-05-08
492
-
493
- - Project documentation and release planning created.
494
- - Initial TypeScript CLI scaffold added.
495
- - JSON and Markdown report generation added.
496
- - Initial audit rule set and Vitest coverage added.
497
- - Example report artifacts added.
1
+ # Changelog
2
+
3
+ All notable changes to Open Local Audit will be documented here.
4
+
5
+ ## v0.77.0 - 2026-10-10
6
+
7
+ - Discovery now flags leads that look like a chain branch or public body, such as `mydentist.co.uk` branch pages, Rodericks practice pages, and `nhs.uk` listings: a public-sector website domain, a website host shared by two or more differently named leads in the same search, or a branch page URL with two or more path segments. Social, link-in-bio, directory, site-builder, and booking-platform pages such as `facebook.com`, `linktr.ee`, `sites.google.com`, Treatwell, and Fresha are never treated as chains. Flagged leads stay in the export with the reason in `opportunityReasons` and a new standard CSV `chainReason` column, low priority, an opportunity score of at most 20, and a "Skip unless you are targeting the head office" next action. This applies to every discovery source; the CRM preset is unchanged.
8
+ - Added the `contact-form-present` audit rule (trust-contact, medium). It flags pages with no enquiry form, no same-site contact or booking page link, no off-site booking link, and no `mailto:` link, and says when the only form is a newsletter signup. Off-site links count when their text or path mentions booking, appointments, or reservations, or when they point to a known booking platform such as Dentally, Calendly, Setmore, Fresha, Treatwell, Booksy, SimplyBook, Acuity, Mindbody, ResDiary, or OpenTable. An off-site link that only says "contact", such as a web agency footer credit, does not count.
9
+ - Public contact extraction now returns `contactFormUrl` when the audited page has an enquiry form: a form with a message box, or at least two contact-detail fields, or an embedded Google Forms, Typeform, Jotform, Formstack, HubSpot, Wufoo, Cognito Forms, or Tally form. Search forms and newsletter signups are not counted. Contact confidence is unchanged. Markdown, HTML, and PDF Contact Readiness sections and the report pack's `next-actions.md` show the contact form. Website enrichment keeps the first fetched page with an enquiry form, including on sites whose only contact path is a form.
10
+ - For `contact-form-present`, same-site contact links also match `get-in-touch`, `enquire`/`enquiry`/`enquiries`, `book`, and `appointments` paths, paths with a file extension such as `/contact.html`, and "Get in touch", "Enquire", and "Book" link text. Contact extraction, contact confidence, and the preferred outreach channel keep their previous contact page patterns, so a booking link is never offered as an outreach channel.
11
+ - Added the `tls-certificate-valid` audit rule. Audits whose final URL is HTTPS open one extra TLS connection to read the site's certificate and flag it when it is not trusted, has expired, or has fewer than 14 days left, with evidence such as "Certificate expires 2026-10-19 (9 days); issuer R11". Discovery reads the homepage certificate during website enrichment, connecting to an address that passed enrichment's public-address check. The rule is skipped for HTTP pages and when the connection fails. Static audits and discovery stop earlier on a certificate that is already invalid (see below), so in practice they report certificates that are about to expire, while rendered audits also report untrusted or expired ones.
12
+ - Static audits of a site with an invalid certificate now fail with a clear message such as "TLS certificate error (CERT_HAS_EXPIRED) for https://example.com/" instead of "fetch failed".
13
+ - `compare` now writes PDF progress reports (`--format pdf --out <path>`). When the compared audits include homepage screenshots (`--screenshot`), the HTML and PDF outputs show them side by side under "Before and After", with the HTML embedding the images; Markdown says whether each screenshot was captured and JSON lists the paths. Screenshot paths are resolved relative to each report's directory, and files outside that directory are ignored.
14
+ - Exported `loadComparisonScreenshots`, `renderComparisonPdf`, and the `ComparisonRenderOptions` and `ComparisonScreenshot` types from the public API.
15
+ - Added `shortlist --pitch-brief <path>` with an optional `--reports-dir` (by default the `reports` folder next to `--input`, or the input's own folder for `start` output). It writes Markdown pitch notes for each shortlisted lead from its JSON audit report: up to three owner-visible findings in a fixed priority order, one per reason, each with a plain-language explanation, evidence, and fix; a suggested offer; the lead's shortlist reasons and contact channel; and a pre-contact checklist covering live re-checks, identity and chain or location flags, local email rules such as UK PECR, and an opt-out. Nothing is sent.
16
+ - Exported `buildPitchBrief`, `readLeadReport`, `renderPitchBriefsMarkdown`, and the `PitchBrief`, `PitchPoint`, and `PitchReportStatus` types from the public API.
17
+ - The new `contact-form-present` and `tls-certificate-valid` rules can lower trust-contact and technical-health scores for affected pages, so `compare` shows them as new issues against reports from earlier versions.
18
+ - The CLI starts faster for `--help`, option errors, `workflow --status`, and other commands that do not audit or discover sites. The audit, discovery, report output, and workflow run modules, along with cheerio, libphonenumber-js metadata, and pdfkit, now load only when a command needs them.
19
+
20
+ ## v0.76.0 - 2026-10-09
21
+
22
+ - `discover --provider overture` now accepts `lawyer`, `solicitor`, and `attorney` (Overture `attorney_or_law_firm`, including practice-area subcategories) and `legal` (`legal_service`). The older category names `legal_services` and `attorney_and_law_services`, which matched nothing in the current Overture taxonomy, now map to the same identifiers.
23
+ - Overture discovery in the UK now flags leads that list the same locality as most leads with the search's common landline area code but have a different landline area code, such as a Weston-super-Mare `01934` clinic listed in Leeds. The lead gets a location reason, a "Confirm the business location" next action, and at most medium priority; it is never removed.
24
+
25
+ ## v0.75.0 - 2026-10-09
26
+
27
+ - Added an operator-only `dotnetStack` field to JSON audit reports. It fingerprints ASP.NET Web Forms, MVC, .NET Framework, ASP.NET Core, and Blazor from the response headers, `Set-Cookie` names, and page HTML the audit already fetched, with a `legacyFramework` flag, confidence, optional .NET Framework version from `X-AspNet-Version`, and matched evidence. IIS or `X-Powered-By: ASP.NET` alone stays `aspnet-unknown` with low confidence. Standard batch and discovery CSV exports gain `dotnetStack` and `dotnetLegacyFramework` columns. Findings, scores, and Markdown, HTML, and PDF reports are unchanged.
28
+ - Exported `detectDotnetStack` and the `DotnetStack` and `DotnetStackEvidence` types from the public API.
29
+ - Static audits now keep every `Set-Cookie` response header instead of only the last one.
30
+ - The `single-h1` finding now says when the only H1 has no text, for example when it wraps just a logo image, instead of reporting "1 H1 elements".
31
+ - Maintenance and parked or for-sale pages now produce a single `website-placeholder` finding with all scores at 0 instead of a full SEO audit of the placeholder. Discovery ranks those leads as website-build opportunities with opportunity score 95 and high priority. Only pages with at most 600 characters of title and visible text, whose copy says the website itself is down or opens with a maintenance notice, are treated as placeholders.
32
+
33
+ ## v0.74.0 - 2026-10-08
34
+
35
+ - Added the `compare` command. It reads an earlier and a later JSON report for the same site, from files or report directories, and writes a progress report listing fixed, still open, and new findings with category and overall score changes, as Markdown, JSON, or HTML with optional report branding. Reports for different sites or profiles, or given in reverse order, are rejected.
36
+ - Exported `compareReports`, `readComparisonReport`, and the comparison renderers from the public API.
37
+ - Added the `mixed-content-absent` audit rule. On pages served over HTTPS it flags scripts, stylesheets, icons, images (including `srcset` candidates), media, iframes, and embeds loaded over plain HTTP, listing up to five URLs as evidence. Plain HTTP links are not flagged.
38
+
39
+ ## v0.73.0 - 2026-10-07
40
+
41
+ - Added the `page-indexable` audit rule. It flags pages that tell search engines not to index them through a `noindex` or `none` directive in a `robots` or `googlebot` meta tag or in the `X-Robots-Tag` response header, listing each directive as evidence. Directives aimed only at other crawlers are ignored.
42
+ - Updated the locked `source-map-js` development dependency to a patched release after the release audit reported a high-severity event-loop denial-of-service advisory.
43
+
44
+ ## v0.72.0 - 2026-10-05
45
+
46
+ - Added the `redirect-chain-short` audit rule. It records each redirect hop (URL and status) while fetching the audited page and flags pages reached through more than one redirect, showing the full chain as evidence. A single redirect, such as plain HTTP to HTTPS, is not flagged, and rendered audits without redirect data are left unchecked.
47
+
48
+ ## v0.71.0 - 2026-10-04
49
+
50
+ - Added the `localbusiness-schema-nap-consistency` audit rule. It flags LocalBusiness structured data whose `telephone` or `streetAddress` does not match the phone numbers or address visible on the page, comparing phones as parsed international numbers and street addresses within the page element that shows them, while tolerating formatting differences, national trunk prefixes, common street abbreviations, and diacritics. Pages without a visible phone or address are left to the existing presence rules.
51
+
52
+ ## v0.70.0 - 2026-10-03
53
+
54
+ - Added evidence-based Overture business-to-website identity checks using structured names, valid phone numbers, and addresses. Missing or mixed evidence remains uncertain; conflicting sites cannot supply business contacts or audit scores.
55
+ - Added identity status, reasons, and field evidence to standard CSV and JSON/Markdown/HTML/PDF reports. Uncertain identity requires manual review and caps contact confidence at Low.
56
+ - Added `--audit-priority missing-contact`, guided priority selection in `start`, and optional workflow `auditPriority`. Source order remains the default; selected candidates fill missing source email first, then phone, while exports retain their original order.
57
+ - Preserved candidate identity when businesses share a website and added regression coverage for branch differences and conflicting identities across fetched pages.
58
+ - Added a bounded comparison script using frozen candidate pools and shared website observations. Small live samples do not establish a contact-yield or identity-accuracy improvement.
59
+
60
+ ## v0.69.0 - 2026-10-02
61
+
62
+ - Added a seven-day local cache for repeated Overture searches in `discover` and `start`, keyed by source release, category, bounds, and result limit while preserving the original retrieval time.
63
+ - Added `--cache-dir`, `--refresh-cache`, and `--no-cache`; cache failures fall back to fresh discovery and website audits are always rerun.
64
+ - Added interactive `start` prompts with input validation, a confirmation summary, cancellation, and protection against overwriting existing output directories.
65
+ - Added explicit cache controls and cache-state reporting to the benchmark, including discovery-only measurements with `--max-audits 0`.
66
+ - Added cache integrity, filesystem safety, guided-input, and packaged CLI coverage. Existing programmatic discovery remains uncached unless a cache directory is provided.
67
+
68
+ ## v0.68.0 - 2026-09-29
69
+
70
+ - Added keyless worldwide business discovery using Overture Places, with GeoNames city/country lookup and bounded geographic queries.
71
+ - Added source business details and provenance to standard prospect exports, preserving unknown website availability instead of assuming a website-build opportunity.
72
+ - Added bounded, robots-aware website contact enrichment with public-address validation; social profiles and known short links are not audited as business websites.
73
+ - Integrated Overture with workflow configuration, offline preflight, and plan output while preserving manual CSV and explicit Google Places discovery.
74
+ - Added a reproducible benchmark for Türkiye, the USA, Germany, and the UK across eight cities and three categories.
75
+ - Updated Lighthouse and affected dependencies to patched versions. **Compatibility: Node.js 22.19 or newer is now required** by Lighthouse 13; Node.js 20 is no longer supported.
76
+
77
+ ## v0.67.0 - 2026-08-09
78
+
79
+ - Added an atomic workflow-state lifecycle manifest with trusted stage visibility.
80
+ - Added read-only `workflow --status` terminal and JSON modes with defined exit semantics.
81
+ - Added checkpoint hash correlation, legacy v1 compatibility, and conservative resume guidance.
82
+ - Added independent package-source integrity markers and lead packaging isolation.
83
+ - Added public API, fresh-install, and documentation coverage.
84
+ - Patched transitive audit resolutions.
85
+
86
+ ## v0.66.0 - 2026-08-02
87
+
88
+ - Added all 21 shortlist filter fields to the workflow configuration schema, including `minScore`, `segment`, `profile`, `priority`, `contactConfidence`, `minContactConfidence`, `preferredContactChannel`, `source`, `auditStatus`, `hasWebsite`, `topFinding`, `reviewStatus`, `excludeReviewStatus`, `unreviewed`, `reviewedBefore`, `requireWebsite`, `missingWebsite`, `requireContact`, `missingContact`, `requireReport`, and `missingReport`.
89
+ - Added new shortlist settings to workflow plan output for operator visibility.
90
+ - Kept workflow configuration local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
91
+
92
+ ## v0.65.0 - 2026-07-30
93
+
94
+ - Added explicit `workflow --config <path> --resume` recovery from the latest verified stage checkpoint.
95
+ - Added strict configuration fingerprint, managed artifact, report source, and checkpoint state validation before resumed work begins.
96
+ - Kept existing workflow summary, preflight, and plan output contracts stable while rerunning incomplete packaging as a complete stage.
97
+ - Updated the locked PostCSS development dependency to a patched release after the release audit reported a high-severity source map path traversal advisory.
98
+
99
+ ## v0.64.0 - 2026-07-21
100
+
101
+ - Added `workflow --config <path> --plan` for a read-only explanation of readiness, execution order, effective settings, network capability, and managed artifacts.
102
+ - Added stable terminal output and a versioned JSON workflow plan for operators and automation.
103
+ - Kept planning free of network calls and output mutation while preserving existing preflight and workflow execution behavior.
104
+
105
+ ## v0.63.0 - 2026-07-19
106
+
107
+ - Added `workflow --config <path> --check` to validate workflow readiness before execution.
108
+ - Added stable terminal output and a versioned JSON preflight report for operator and automation use.
109
+ - Kept preflight read-only and local: no network calls or output mutation, with advisory filesystem readiness checks and managed-path safety validation.
110
+
111
+ ## v0.62.0 - 2026-07-16
112
+
113
+ - Added `workflow --config <path>` to run versioned discovery, shortlist, optional review summary, and optional report packaging from one strict JSON configuration.
114
+ - Added deterministic managed workflow outputs with fail-fast stage summaries and independent package failure reporting.
115
+ - Kept workflows operator-controlled and local-only, with no outreach sending or CRM synchronization; Google Places remains opt-in and requires its existing API key and billing acknowledgement.
116
+
117
+ ## v0.61.0 - 2026-07-14
118
+
119
+ - Added batch `--summary-json <path>` output using the existing aggregate batch index JSON contract independently of report format.
120
+ - Kept explicit batch summary output local-only and additive to standard batch index files.
121
+
122
+ ## v0.60.0 - 2026-07-12
123
+
124
+ - Added `source`, `auditStatus`, and `hasWebsite` columns to batch standard and CRM prospect CSV exports.
125
+ - Kept batch CSV rendering local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
126
+
127
+ ## v0.59.0 - 2026-07-11
128
+
129
+ - Added `--source`, `--audit-status`, and `--has-website` batch index filters to the main audit command.
130
+ - Applied batch index filtering before sorting and top-N selection.
131
+ - Kept batch filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
132
+
133
+ ## v0.58.0 - 2026-07-10
134
+
135
+ - Added `actionableLeads` to `review --summary-json` output with deduplicated lead keys and their `unreviewed`, `invalid-reviewed-at`, or `stale` reasons.
136
+ - Preserved `actionableLeadKeys` for existing consumers and kept review summaries read-only.
137
+
138
+ ## v0.57.0 - 2026-07-09
139
+
140
+ - Added `actionableLeadKeys` to `review --summary-json` output as a deduplicated unreviewed, invalid-date, and stale review queue.
141
+ - Kept actionable review summaries read-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
142
+
143
+ ## v0.56.0 - 2026-07-08
144
+
145
+ - Added `unreviewedLeadKeys` to `review --summary-json` output when unreviewed rows have lead keys.
146
+ - Kept unreviewed queue summaries read-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
147
+
148
+ ## v0.55.0 - 2026-07-07
149
+
150
+ - Added `invalidReviewedAtLeadKeys` to `review --summary-json` output when invalid review date rows have lead keys.
151
+ - Kept invalid review date summaries read-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
152
+
153
+ ## v0.54.0 - 2026-07-06
154
+
155
+ - Added `staleLeadKeys` to `review --summary-json` output when stale review rows have lead keys.
156
+ - Kept stale review summaries read-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
157
+
158
+ ## v0.53.0 - 2026-07-05
159
+
160
+ - Added `contact-confidence-desc`, `priority-desc`, and `source-asc` sort modes to `shortlist --sort`.
161
+ - Kept shortlist sorting local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
162
+
163
+ ## v0.52.0 - 2026-07-04
164
+
165
+ - Added a fresh consumer install audit to `npm run release-check`.
166
+ - Verified release tarballs install as the current package version before publish.
167
+ - Kept the release gate local and dependency-free by using npm and Node standard library only.
168
+
169
+ ## v0.51.0 - 2026-07-03
170
+
171
+ - Added `review --stale-before YYYY-MM-DD` for read-only stale review counts in local review CSV summaries.
172
+ - Included stale review counts in `review --summary-json` output.
173
+ - Kept stale review summary checks local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
174
+
175
+ ## v0.50.0 - 2026-07-01
176
+
177
+ - Added `review --summary` for local review CSV queue counts by status, review coverage, invalid review dates, and oldest/newest review timestamps.
178
+ - Added `review --summary-json <path>` for automation-friendly review queue summaries.
179
+ - Kept review summaries read-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
180
+
181
+ ## v0.49.0 - 2026-06-30
182
+
183
+ - Removed the default `--no-sandbox` Chrome launch flag from Lighthouse audits.
184
+ - Raised the Cheerio dependency floor so fresh installs resolve a patched `undici` transitive dependency.
185
+ - Documented the upgrade path for old consuming projects that still have vulnerable transitive dependency locks.
186
+
187
+ ## v0.48.0 - 2026-06-30
188
+
189
+ - Added bulk `review --input <path>` updates from shortlist CSV and JSON files.
190
+ - Added `review --dry-run` previews for bulk review CSV updates.
191
+ - Kept bulk review updates local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
192
+
193
+ ## v0.47.0 - 2026-06-29
194
+
195
+ - Added `source`, `auditStatus`, and `hasWebsite` columns to shortlist CSV and Markdown reports.
196
+ - Kept shortlist rendering local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
197
+
198
+ ## v0.46.0 - 2026-06-29
199
+
200
+ - Added `shortlist --top-finding <finding>` for local top-finding shortlist filtering.
201
+ - Applied top-finding filtering after review suppression and before sorting and top-N selection.
202
+ - Kept top-finding filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
203
+
204
+ ## v0.45.0 - 2026-06-29
205
+
206
+ - Added `shortlist --has-website <status>` for local website-presence shortlist filtering.
207
+ - Applied has-website filtering after review suppression and before sorting and top-N selection.
208
+ - Kept has-website filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
209
+
210
+ ## v0.44.0 - 2026-06-28
211
+
212
+ - Added `shortlist --min-contact-confidence <level>` for local ordinal contact-confidence shortlist filtering.
213
+ - Applied min-contact-confidence filtering after review suppression and before sorting and top-N selection.
214
+ - Kept min-contact-confidence filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
215
+
216
+ ## v0.43.0 - 2026-06-27
217
+
218
+ - Added `shortlist --audit-status <status>` for local audit-status shortlist filtering.
219
+ - Applied audit-status filtering after review suppression and before sorting and top-N selection.
220
+ - Kept audit-status filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
221
+
222
+ ## v0.42.0 - 2026-06-24
223
+
224
+ - Added `shortlist --min-score <score>` for local audit-score shortlist filtering.
225
+ - Applied min-score filtering after review suppression and before sorting and top-N selection.
226
+ - Kept min-score filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
227
+
228
+ ## v0.41.0 - 2026-06-24
229
+
230
+ - Added `review --review-csv <path> --lead-key <key> --status <status>` for local review CSV upserts.
231
+ - Preserved existing review CSV columns while adding missing review-state columns and writing ISO review timestamps.
232
+ - Kept review updates local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
233
+
234
+ ## v0.40.0 - 2026-06-23
235
+
236
+ - Added `shortlist --source <source>` for local discovery-source shortlist filtering.
237
+ - Applied source filtering after review suppression and before sorting and top-N selection.
238
+ - Kept source filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
239
+
240
+ ## v0.39.0 - 2026-06-20
241
+
242
+ - Added `shortlist --reviewed-before <date>` for local re-review shortlist queues.
243
+ - Added strict `YYYY-MM-DD` threshold validation and strictly-earlier review-date filtering.
244
+ - Kept reviewed-before filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
245
+
246
+ ## v0.38.0 - 2026-06-19
247
+
248
+ - Added `shortlist --unreviewed` for local first-review shortlist queues.
249
+ - Applied unreviewed filtering after review suppression and before sorting and top-N selection.
250
+ - Kept unreviewed filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
251
+
252
+ ## v0.37.0 - 2026-06-17
253
+
254
+ - Added `shortlist --missing-website` for local website-backlog shortlist filtering.
255
+ - Applied missing-website filtering after review suppression and before sorting and top-N selection.
256
+ - Kept missing-website filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
257
+
258
+ ## v0.36.0 - 2026-06-16
259
+
260
+ - Added `shortlist --missing-contact` for local contact-backlog shortlist filtering.
261
+ - Applied missing-contact filtering after review suppression and before sorting and top-N selection.
262
+ - Kept missing-contact filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
263
+
264
+ ## v0.35.0 - 2026-06-15
265
+
266
+ - Added `shortlist --missing-report` for local report-backlog shortlist filtering.
267
+ - Applied missing-report filtering after review suppression and before sorting and top-N selection.
268
+ - Kept missing-report filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
269
+
270
+ ## v0.34.0 - 2026-06-14
271
+
272
+ - Added `shortlist --preferred-contact-channel <channel>` for local outreach-channel shortlist filtering.
273
+ - Applied preferred-contact-channel filtering after review suppression and before sorting and top-N selection.
274
+ - Kept preferred-contact-channel filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
275
+
276
+ ## v0.33.0 - 2026-06-13
277
+
278
+ - Added `shortlist --require-report` for local report-ready shortlist filtering.
279
+ - Applied report-required filtering after review suppression and before sorting and top-N selection.
280
+ - Kept report-required filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
281
+
282
+ ## v0.32.0 - 2026-06-12
283
+
284
+ - Added `shortlist --require-contact` for local contact-ready shortlist filtering.
285
+ - Applied contact-required filtering after review suppression and before sorting and top-N selection.
286
+ - Kept contact-required filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
287
+
288
+ ## v0.31.0 - 2026-06-11
289
+
290
+ - Added `shortlist --require-website` for local website-present shortlist filtering.
291
+ - Applied website-required filtering after review suppression and before sorting and top-N selection.
292
+ - Kept website-required filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
293
+
294
+ ## v0.30.0 - 2026-06-09
295
+
296
+ - Added `shortlist --exclude-review-status <status>` for local active-review-status exclusion.
297
+ - Applied review-status exclusion after review suppression and before sorting and top-N selection.
298
+ - Kept exclusion filtering local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
299
+
300
+ ## v0.29.0 - 2026-06-08
301
+
302
+ - Added `shortlist --summary-json <path>` for separate local automation summary output.
303
+ - Added `renderShortlistSummaryJson` for package consumers.
304
+ - Kept summary output local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
305
+
306
+ ## v0.28.0 - 2026-06-07
307
+
308
+ - Added `shortlist --sort <sort>` for local shortlist ranking control.
309
+ - Supported `opportunity-desc`, `score-desc`, `company-asc`, and `last-reviewed-asc` sort modes.
310
+ - Kept sorting local-only with no source CSV mutation, review CSV mutation, API calls, outreach sending, or CRM sync.
311
+
312
+ ## v0.27.0 - 2026-06-06
313
+
314
+ - Added `shortlist --review-status <status>` for active review-state filtering.
315
+ - Applied review-status filtering after review-state suppression and before ranking and top-N selection.
316
+ - Kept review-status filtering local-only with no review CSV mutation, source CSV mutation, API calls, outreach sending, or CRM sync.
317
+
318
+ ## v0.26.0 - 2026-06-05
319
+
320
+ - Added `shortlist` focus filters for segment, profile, priority, and contact confidence.
321
+ - Combined supplied focus filters with case-insensitive `AND` matching.
322
+ - Applied focus filters after review suppression and before ranking and top-N selection.
323
+ - Kept focus filtering local-only with no source CSV mutation, API calls, outreach sending, or CRM sync.
324
+
325
+ ## v0.25.0 - 2026-06-04
326
+
327
+ - Added `shortlist --min-opportunity-score <score>` for local shortlist filtering.
328
+ - Filtered low-opportunity shortlist leads after review-state suppression and before top-N ranking.
329
+ - Reported filtered row counts in CLI output, Markdown summaries, and JSON results.
330
+ - Kept shortlist filtering local-only with no API calls, outreach sending, review CSV mutation, or CRM sync.
331
+
332
+ ## v0.24.0 - 2026-06-03
333
+
334
+ - Added `shortlist --format csv` for spreadsheet-ready local shortlist output.
335
+ - Included rank, scoring, contact handoff, review context, lead key, and report path columns in CSV shortlist reports.
336
+ - Reused existing CSV cell hardening so formula-like shortlist values are neutralized before spreadsheet review.
337
+ - Kept CSV shortlist generation local-only with no API calls, outreach sending, review CSV mutation, or CRM sync.
338
+
339
+ ## v0.23.0 - 2026-06-01
340
+
341
+ - Added `shortlist --review-csv <path>` for local review-state aware shortlist runs.
342
+ - Suppressed already handled shortlist leads marked `rejected`, `contacted`, `not-fit`, `not_a_fit`, `do-not-contact`, or `suppressed`.
343
+ - Carried active review status, review reason, and last-reviewed date into Markdown and JSON shortlist reports.
344
+ - Kept shortlist review handling local-only with no review CSV mutation, API calls, outreach sending, or CRM sync.
345
+
346
+ ## v0.22.0 - 2026-05-31
347
+
348
+ - Added `shortlist --input <path> --out <path>` for local lead shortlist reports.
349
+ - Added Markdown and JSON shortlist output for discovery and CRM CSV exports.
350
+ - Ranked leads by opportunity score, priority, contact confidence, audit score, and company name.
351
+ - Kept shortlist generation local-only with no API calls, outreach sending, or CRM sync.
352
+
353
+ ## v0.21.0 - 2026-05-28
354
+
355
+ - Added `package-report --input <path> --out <path>` for local customer-shareable report packs.
356
+ - Added report-pack `README.md`, `next-actions.md`, and `manifest.json` generation from existing single-site JSON reports.
357
+ - Copied available JSON, Markdown, HTML, and PDF report artifacts into the local package.
358
+ - Kept report packaging local-only with no uploads, outreach sending, or CRM sync.
359
+
360
+ ## v0.20.0 - 2026-05-27
361
+
362
+ - Added `validate-export --input <path> --preset crm` for local CRM CSV import checks.
363
+ - Added Markdown and JSON validation reports with row counts, errors, warnings, and issue details.
364
+ - Flagged missing CRM columns, missing company or website fields, duplicate lead keys, low contact confidence, and manual-review handoffs.
365
+ - Kept validation local-only with no CRM API sync, remote import, or outreach sending.
366
+
367
+ ## v0.19.0 - 2026-05-26
368
+
369
+ - Added `--export-preset standard|crm` for batch and discovery CSV exports.
370
+ - Added CRM-ready local import columns for company identity, website, scoring, contact handoff, source, lead key, and report path.
371
+ - Preserved existing standard CSV export behavior as the default.
372
+ - Kept CRM export local-only with no CRM API sync or outreach sending.
373
+
374
+ ## v0.18.0 - 2026-05-23
375
+
376
+ - Added batch index contact rollups for public contact coverage and confidence.
377
+ - Added batch outreach rollups for preferred manual contact channels.
378
+ - Added per-entry batch index contact and outreach metadata for successful audits.
379
+ - Added batch CSV export columns for contact confidence, preferred contact channel, and contactability reason.
380
+
381
+ ## v0.17.0 - 2026-05-22
382
+
383
+ - Added advisory fuzzy duplicate candidate groups to discovery duplicate JSON output.
384
+ - Added duplicate review reasons for likely business-label and website-domain similarity.
385
+ - Preserved exact duplicate reporting while keeping fuzzy matching manual-review only.
386
+ - Confirmed fuzzy duplicate review does not auto-suppress leads, send outreach, or sync to a CRM.
387
+
388
+ ## v0.16.0 - 2026-05-20
389
+
390
+ - Added discovery outreach handoff fields: `preferredContactChannel`, `outreachAction`, and `contactabilityReason`.
391
+ - Added deterministic channel selection for email, WhatsApp, phone, contact-page, and manual-review discovery leads.
392
+ - Preserved CSV formula hardening for the new outreach handoff fields.
393
+
394
+ ## v0.15.0 - 2026-05-19
395
+
396
+ - Added public contact extraction for audited pages, including email, phone, WhatsApp, contact-page, and social-profile signals.
397
+ - Added Contact Readiness sections to Markdown, HTML, and PDF reports.
398
+ - Added contact enrichment columns to discovery CSV exports while preserving CSV formula hardening.
399
+
400
+ ## v0.14.0 - 2026-05-16
401
+
402
+ - Added `--brand-config` for JSON-driven report branding across Markdown, HTML, and PDF outputs.
403
+ - Added Executive Summary sections with business impact, top issues, and a recommended first fix.
404
+ - Added lead export enrichment columns: `pitchAngle`, `recommendedOffer`, `estimatedNeed`, and `outreachPriorityReason`.
405
+
406
+ ## v0.13.0 - 2026-05-15
407
+
408
+ - Added opt-in Lighthouse category scoring with `--lighthouse`.
409
+ - Added branded PDF report output with `--format pdf`.
410
+ - Added `opportunityReasons` to discovery CSV exports so operators can explain lead scores.
411
+ - Added Lighthouse sections to JSON, Markdown, HTML, and PDF reports.
412
+
413
+ ## v0.12.0 - 2026-05-14
414
+
415
+ - Added discovery suppression lists with `--suppression-list` to skip previously reviewed leads.
416
+ - Added `leadKey`, `reviewStatus`, `reviewReason`, and `lastReviewedAt` columns to discovery CSV exports for local review workflows.
417
+ - Added `--min-opportunity-score` for filtering discovery exports to higher-value opportunities.
418
+ - Added `--review-csv` for merging local operator review decisions across discovery reruns.
419
+ - Added `--duplicates-json` for reporting duplicate lead groups.
420
+ - Added lawyer, clinic, gym, hotel, and auto-service industry profiles.
421
+ - Polished HTML reports with a branded shell, summary cards, and stronger visual hierarchy.
422
+ - Added Windows user-environment fallback for `GOOGLE_MAPS_API_KEY`.
423
+
424
+ ## v0.11.0 - 2026-05-13
425
+
426
+ - Added discovery controls: `--limit`, `--max-audits`, and `--summary-json`.
427
+ - Added terminal discovery summary output for website, audit, priority, and average-score counts.
428
+ - Added `opportunityScore` to discovery prospect CSV exports.
429
+ - Added CSV formula-injection hardening for exported CSV cells.
430
+ - Added a Google Maps Platform billing warning when `--provider google-places` is used.
431
+
432
+ ## v0.10.0 - 2026-05-12
433
+
434
+ - Added an opt-in `google-places` provider for `discover`.
435
+ - Added `GOOGLE_MAPS_API_KEY` support for official Google Places Text Search requests.
436
+ - Resolved official place website URLs through `websiteUri` where available.
437
+ - Kept Google Places storage conservative: no Google Maps scraping, no reviews/photos/ratings collection, and no long-term raw Places data store.
438
+ - Fed resolved Google Places websites into the existing audit pipeline and prospect CSV export.
439
+
440
+ ## v0.9.0 - 2026-05-12
441
+
442
+ - Added `discover --input places.csv --provider manual-csv` for operator-prepared lead discovery.
443
+ - Added `leads.csv` prospect exports with website presence, audit status, priority, next action, report path, and error columns.
444
+ - Reused the existing batch audit pipeline for website-present discovery rows.
445
+ - Added `--dry-run` discovery mode for local prospect triage without website audits.
446
+ - Documented the discovery boundary: no Google Maps scraping, no `google-places` provider calls, and no outreach sending in this release.
447
+
448
+ ## v0.8.0 - 2026-05-12
449
+
450
+ - Added `--concurrency` for controlled parallel batch audits.
451
+ - Added batch index insights with average score, profile breakdown, segment breakdown, and frequent findings.
452
+ - Added profile-specific findings for dental, beauty, restaurant, and contractor audits.
453
+ - Expanded profile tests to cover missing and satisfied vertical conversion/trust signals.
454
+
455
+ ## v0.7.0 - 2026-05-11
456
+
457
+ - Added industry profiles with `--profile generic|dental|beauty|restaurant|contractor`.
458
+ - Added optional `profile` CSV input column for batch audits.
459
+ - Added profile metadata to JSON, Markdown, HTML, and batch index outputs.
460
+ - Added `--export-csv` for batch prospect exports with score, top finding, report path, and error columns.
461
+
462
+ ## v0.6.0 - 2026-05-10
463
+
464
+ - Added `--screenshot` for rendered homepage screenshot capture.
465
+ - Added visual evidence metadata to JSON reports.
466
+ - Added Visual Evidence sections to Markdown and HTML reports.
467
+ - Added batch screenshot artifact paths for per-site report folders.
468
+
469
+ ## v0.5.0 - 2026-05-09
470
+
471
+ - Added opt-in Playwright-rendered audits with `--render`.
472
+ - Added batch triage controls with `--segment`, `--min-score`, `--top`, and `--sort`.
473
+ - Added trust and conversion checks for current date signals, review cues, service detail depth, brand icons, and placeholder social profile links.
474
+
475
+ ## v0.4.0 - 2026-05-09
476
+
477
+ - Added resilient batch runs that keep auditing after individual URL failures.
478
+ - Added aggregate batch index reports in JSON, Markdown, and HTML.
479
+ - Added CSV batch input with `url`, `label`, and `segment` columns.
480
+ - Added `@graph` JSON-LD support for structured-data checks.
481
+ - Added LocalBusiness contact-field, Organization schema, visible address, opening-hours, service-location copy, primary CTA, and placeholder-copy checks.
482
+
483
+ ## v0.3.0 - 2026-05-09
484
+
485
+ - Added standalone HTML report rendering.
486
+ - Added `--format html`.
487
+ - Expanded `--format all` to write JSON, Markdown, and HTML reports.
488
+ - Added `--input <path>` for batch audits from text files.
489
+ - Added safe per-site output folders for batch reports.
490
+
491
+ ## v0.2.0 - 2026-05-08
492
+
493
+ - Added optional same-origin internal link scanning with `--check-links` and `--max-pages`.
494
+ - Added a high-severity finding for broken internal links.
495
+ - Added `--fail-on none|high|medium|low` for CI-friendly exit codes.
496
+ - Added compact terminal summaries when reports are written to files.
497
+ - Added integration tests for link scanning and CLI behavior helpers.
498
+
499
+ ## v0.1.1 - 2026-05-08
500
+
501
+ - Added `robots.txt`, `sitemap.xml`, Open Graph, and invalid JSON-LD checks.
502
+ - Added `--format all --out-dir <path>` for writing JSON and Markdown reports together.
503
+ - Added fixture-based rule tests and report output tests.
504
+ - Added `npm run release-check` for local and CI release verification.
505
+
506
+ ## v0.1.0 - 2026-05-08
507
+
508
+ - Project documentation and release planning created.
509
+ - Initial TypeScript CLI scaffold added.
510
+ - JSON and Markdown report generation added.
511
+ - Initial audit rule set and Vitest coverage added.
512
+ - Example report artifacts added.