Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
c2854e7
Add multi-identifier support for preference upload
JonnavithulaGirish Aug 7, 2025
6750f10
Add multi-identifier support for preference upload
JonnavithulaGirish Aug 7, 2025
c190974
rever lock changes
JonnavithulaGirish Aug 7, 2025
720d92c
clean up
JonnavithulaGirish Aug 7, 2025
7543ac4
add costco specific logic
JonnavithulaGirish Aug 7, 2025
2549be4
add columnsToIgnore
JonnavithulaGirish Aug 12, 2025
69bfa8e
remove transcendID prompt
JonnavithulaGirish Aug 13, 2025
9544327
try increasing concurrencey
JonnavithulaGirish Aug 14, 2025
1a5c785
revert to bluebird
JonnavithulaGirish Aug 14, 2025
2de8843
Rewrites how receipts are stored to file
michaelfarrell76 Aug 16, 2025
a57fbd1
Parrallel:
michaelfarrell76 Aug 16, 2025
fba8809
basically working
michaelfarrell76 Aug 16, 2025
b4a6a52
Working logs
michaelfarrell76 Aug 16, 2025
c0d20f1
mostly wokring
michaelfarrell76 Aug 16, 2025
41c509c
Working in parallel
michaelfarrell76 Aug 16, 2025
e8f7d2c
Working
michaelfarrell76 Aug 16, 2025
9ff89fd
better concurrency
michaelfarrell76 Aug 16, 2025
6379b4b
etter concurrency
michaelfarrell76 Aug 16, 2025
1df22f3
perfectly balanced
michaelfarrell76 Aug 16, 2025
fe40f17
working
michaelfarrell76 Aug 16, 2025
1f42f36
Mostly working
michaelfarrell76 Aug 16, 2025
20c8cdf
Merges
michaelfarrell76 Aug 16, 2025
497f2a5
Uses new function
michaelfarrell76 Aug 16, 2025
855df24
Merges
michaelfarrell76 Aug 16, 2025
1344aa9
rm
michaelfarrell76 Aug 16, 2025
ef0d0f9
adds docs to codecs
michaelfarrell76 Aug 16, 2025
41ceb8c
gitignore and bb
michaelfarrell76 Aug 16, 2025
84342d6
Refactors
michaelfarrell76 Aug 17, 2025
875fdb3
Merges
michaelfarrell76 Aug 17, 2025
ca37307
checkpoint
michaelfarrell76 Aug 17, 2025
4e11953
Exports
michaelfarrell76 Aug 17, 2025
451b1cc
Working
michaelfarrell76 Aug 17, 2025
5910ce9
refactor of pooling
michaelfarrell76 Aug 17, 2025
c2dbe77
More updates
michaelfarrell76 Aug 17, 2025
735bf8c
ud
michaelfarrell76 Aug 17, 2025
6ab7fb1
Mostly fixed
michaelfarrell76 Aug 17, 2025
d120efe
Mostly fixed
michaelfarrell76 Aug 17, 2025
e00075e
Fixes transform
michaelfarrell76 Aug 17, 2025
1fef12c
cleaned
michaelfarrell76 Aug 17, 2025
e920f7d
just nearly fully working
michaelfarrell76 Aug 17, 2025
54fdf05
Adds new commands
michaelfarrell76 Aug 17, 2025
80243c1
filter slashes
michaelfarrell76 Aug 17, 2025
0e239ba
ipdats
michaelfarrell76 Aug 17, 2025
5123089
MErges
michaelfarrell76 Aug 17, 2025
8296a3a
rm node corepack
michaelfarrell76 Aug 17, 2025
f6caaae
readme
michaelfarrell76 Aug 17, 2025
e6274f2
Delete src/lib/pooling/replayTail.ts
michaelfarrell76 Aug 17, 2025
5232589
MErges
michaelfarrell76 Aug 18, 2025
9671e92
TSC
michaelfarrell76 Aug 18, 2025
1ad7512
CSV split concurrency
michaelfarrell76 Aug 18, 2025
5bf5ac5
checkpoint on csv parse
michaelfarrell76 Aug 18, 2025
9532123
RefatoreD
michaelfarrell76 Aug 18, 2025
88ea848
Merges
michaelfarrell76 Aug 18, 2025
4de6597
Fixes
michaelfarrell76 Aug 18, 2025
50acd53
MergeS
michaelfarrell76 Aug 18, 2025
00c019e
MergeS
michaelfarrell76 Aug 19, 2025
0be1c91
merges main
michaelfarrell76 Aug 19, 2025
702709e
rm
michaelfarrell76 Aug 19, 2025
3563168
rm
michaelfarrell76 Aug 19, 2025
3a10ae2
Merges
michaelfarrell76 Aug 19, 2025
cb3c694
merg
michaelfarrell76 Aug 19, 2025
03b2659
changes eexport
michaelfarrell76 Aug 21, 2025
42be153
parquet splitter
michaelfarrell76 Aug 27, 2025
7371a2c
Merges
michaelfarrell76 Aug 27, 2025
1171cd8
fuxem
michaelfarrell76 Sep 3, 2025
65a208b
ud
michaelfarrell76 Oct 17, 2025
bc568eb
fixes tsc
michaelfarrell76 Oct 17, 2025
7ea87cf
Updates
michaelfarrell76 Oct 20, 2025
decb452
Rev
michaelfarrell76 Oct 20, 2025
25702de
Rev
michaelfarrell76 Oct 20, 2025
9f8bdb6
rev
michaelfarrell76 Oct 20, 2025
7d12a5b
ud
michaelfarrell76 Oct 30, 2025
f8a91f9
MergeS
michaelfarrell76 Nov 5, 2025
0402858
Ud
michaelfarrell76 Dec 16, 2025
6817f50
Reverts
michaelfarrell76 Dec 16, 2025
a4b1f31
Reverts
michaelfarrell76 Dec 16, 2025
5ff7810
ud
michaelfarrell76 Dec 16, 2025
f9c63b8
exact
michaelfarrell76 Dec 17, 2025
85abeeb
Delete src/trim-scripts.ts
michaelfarrell76 Jan 26, 2026
cbc1aca
bluebird
michaelfarrell76 Feb 23, 2026
7aa12b6
bluebird
michaelfarrell76 Feb 23, 2026
cf11f60
bluebird
michaelfarrell76 Feb 23, 2026
0ceb94a
merges
michaelfarrell76 Feb 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
## Table of Contents

- [Changelog](#changelog)
- [[9.0.0] - 2025-08-15](#900---2025-08-15)
- [[8.1.0] - 2025-08-18](#810---2025-08-18)
- [Added](#added)
- [[8.0.0] - 2025-08-13](#800---2025-08-13)
Expand Down Expand Up @@ -34,6 +35,10 @@ All notable changes to the Transcend CLI tools will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [9.0.0] - 2025-08-15

FIXME
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FIXME placeholder committed in changelog

Medium Severity

The version 9.0.0 changelog entry contains only "FIXME" as placeholder text instead of actual release notes. This placeholder was committed and will be visible to users.

Fix in Cursor Fix in Web


## [8.1.0] - 2025-08-18

### Added
Expand Down
61 changes: 40 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2182,7 +2182,7 @@ transcend consent upload-data-flows-from-csv \

```txt
USAGE
transcend consent upload-preferences (--auth value) (--partition value) [--sombraAuth value] [--transcendUrl value] [--file value] [--directory value] [--dryRun] [--skipExistingRecordCheck] [--receiptFileDir value] [--skipWorkflowTriggers] [--forceTriggerWorkflows] [--skipConflictUpdates] [--isSilent] [--attributes value] [--receiptFilepath value] [--concurrency value]
transcend consent upload-preferences (--auth value) (--partition value) [--sombraAuth value] [--transcendUrl value] (--directory value) [--dryRun] [--skipExistingRecordCheck] [--receiptFileDir value] [--schemaFilePath value] [--skipWorkflowTriggers] [--forceTriggerWorkflows] [--skipConflictUpdates] [--isSilent] [--attributes value] [--receiptFilepath value] [--concurrency value] [--uploadConcurrency value] [--maxChunkSize value] [--rateLimitRetryDelay value] [--uploadLogInterval value] [--downloadIdentifierConcurrency value] [--maxRecordsToReceipt value] (--allowedIdentifierNames value) (--identifierColumns value) [--columnsToIgnore value] [--skipMetadata] [--viewerMode]
transcend consent upload-preferences --help

Upload preference management data to your Preference Store.
Expand All @@ -2191,24 +2191,43 @@ This command prompts you to map the shape of the CSV to the shape of the Transce

The script will also produce a JSON cache file that allows for the mappings to be preserved between runs.

Parallel preference uploader (Node 22+ ESM/TS)
-----------------------------------------------------------------------------
- Spawns a pool of child *processes* (not threads) to run uploads in parallel.
- Shows a live dashboard in the parent terminal with progress per worker.
- Creates per-worker log files and (optionally) opens OS terminals to tail them.
- Uses the same module as both parent and child; the child mode is toggled
by the presence of a CLI flag ('--as-child').

FLAGS
--auth The Transcend API key. Requires scopes: "Modify User Stored Preferences", "View Managed Consent Database Admin API", "View Preference Store Settings"
--partition The partition key to download consent preferences to
[--sombraAuth] The Sombra internal key, use for additional authentication when self-hosting Sombra
[--transcendUrl] URL of the Transcend backend. Use https://api.us.transcend.io for US hosting [default = https://api.transcend.io]
[--file] Path to the CSV file to load preferences from
[--directory] Path to the directory of CSV files to load preferences from
[--dryRun] Whether to do a dry run only - will write results to receiptFilepath without updating Transcend [default = false]
[--skipExistingRecordCheck] Whether to skip the check for existing records. SHOULD ONLY BE USED FOR INITIAL UPLOAD [default = false]
[--receiptFileDir] Directory path where the response receipts should be saved [default = ./receipts]
[--skipWorkflowTriggers] Whether to skip workflow triggers when uploading to preference store [default = false]
[--forceTriggerWorkflows] Whether to force trigger workflows for existing consent records [default = false]
[--skipConflictUpdates] Whether to skip uploading of any records where the preference store and file have a hard conflict [default = false]
[--isSilent/--noIsSilent] Whether to skip sending emails in workflows [default = true]
[--attributes] Attributes to add to any DSR request if created. Comma-separated list of key:value pairs. [default = Tags:transcend-cli,Source:transcend-cli]
[--receiptFilepath] Store resulting, continuing where left off [default = ./preference-management-upload-receipts.json]
[--concurrency] The concurrency to use when uploading in parallel [default = 10]
-h --help Print help information and exit
--auth The Transcend API key. Requires scopes: "Modify User Stored Preferences", "View Managed Consent Database Admin API", "View Preference Store Settings", "View Identity Verification Settings"
--partition The partition key to download consent preferences to
[--sombraAuth] The Sombra internal key, use for additional authentication when self-hosting Sombra
[--transcendUrl] URL of the Transcend backend. Use https://api.us.transcend.io for US hosting [default = https://api.transcend.io]
--directory Path to the directory of CSV files to load preferences from
[--dryRun] Whether to do a dry run only - will write results to receiptFilepath without updating Transcend [default = false]
[--skipExistingRecordCheck] Whether to skip the check for existing records. SHOULD ONLY BE USED FOR INITIAL UPLOAD [default = false]
[--receiptFileDir] Directory path where the response receipts should be saved. Defaults to ./receipts if a "file" is provided, or <directory>/../receipts if a "directory" is provided.
[--schemaFilePath] The path to where the schema for the file should be saved. If file is provided, it will default to ./<filePrefix>-preference-upload-schema.json If directory is provided, it will default to <directory>/../preference-upload-schema.json
[--skipWorkflowTriggers] Whether to skip workflow triggers when uploading to preference store [default = false]
[--forceTriggerWorkflows] Whether to force trigger workflows for existing consent records [default = false]
[--skipConflictUpdates] Whether to skip uploading of any records where the preference store and file have a hard conflict [default = false]
[--isSilent/--noIsSilent] Whether to skip sending emails in workflows [default = true]
[--attributes] Attributes to add to any DSR request if created. Comma-separated list of key:value pairs. [default = Tags:transcend-cli,Source:transcend-cli]
[--receiptFilepath] Store resulting, continuing where left off [default = ./preference-management-upload-receipts.json]
[--concurrency] The number of concurrent processes to use to upload the files. When this is not set, it defaults to the number of CPU cores available on the machine. e.g. if there are 5 concurrent processes for 15 files, each parallel job would get 3 files to process.
[--uploadConcurrency] When uploading preferences to v1/preferences - this is the number of concurrent requests made at any given time by a single process.This is NOT the batch size—it's how many batch *tasks* run in parallel. The number of total concurrent requests is maxed out at concurrency * uploadConcurrency. [default = 75]
[--maxChunkSize] When uploading preferences to v1/preferences - this is the maximum number of records to put in a single request.The number of total concurrent records being put in at any one time is is maxed out at maxChunkSize * concurrency * uploadConcurrency. [default = 25]
[--rateLimitRetryDelay] When uploading preferences to v1/preferences - this is the number of milliseconds to wait before retrying a request that was rate limited. This is only used if the request is rate limited by the Transcend API. If the request fails for any other reason, it will not be retried. [default = 3000]
[--uploadLogInterval] When uploading preferences to v1/preferences - this is the number of records after which to log progress. Output will be logged to console and also to the receipt file. Setting this value lower will allow for you to more easily pick up where you left off. Setting this value higher can avoid excessive i/o operations slowing down the upload. Default is a good optimization for most cases. [default = 1000]
[--downloadIdentifierConcurrency] When downloading identifiers for the upload - this is the number of concurrent requests to make. This is only used if the records are not already cached in the preference store. [default = 30]
[--maxRecordsToReceipt] When writing out successful and pending records to the receipt file - this is the maximum number of records to write out. This is to avoid the receipt file getting too large for JSON.parse/stringify. [default = 10]
--allowedIdentifierNames Identifiers configured for the run. Comma-separated list of identifier names.
--identifierColumns Columns in the CSV that should be used as identifiers. Comma-separated list of column names.
[--columnsToIgnore] Columns in the CSV that should be ignored. Comma-separated list of column names.
[--skipMetadata] Whether to skip uploading metadata fields. Use this for subsequent batch uploads to avoid replacing existing metadata. [default = false]
[--viewerMode] Run in non-interactive viewer mode (no attach UI, auto-artifacts) [default = false]
-h --help Print help information and exit
```

A sample CSV can be found [here](./examples/cli-upload-preferences-example.csv). In this example, `Sales` and `Marketing` are two custom Purposes, and `SalesCommunications` and `MarketingCommunications` are Preference Topics. During the interactive CLI prompt, you can map these columns to the slugs stored in Transcend!
Expand All @@ -2220,7 +2239,7 @@ A sample CSV can be found [here](./examples/cli-upload-preferences-example.csv).
```sh
transcend consent upload-preferences \
--auth="$TRANSCEND_API_KEY" \
--file=./preferences.csv \
--directory=./ \
--partition=4d1c5daa-90b7-4d18-aa40-f86a43d2c726
```

Expand All @@ -2230,7 +2249,7 @@ transcend consent upload-preferences \
transcend consent upload-preferences \
--auth="$TRANSCEND_API_KEY" \
--partition=4d1c5daa-90b7-4d18-aa40-f86a43d2c726 \
--file=./preferences.csv \
--directory=./csvs \
--dryRun \
--skipWorkflowTriggers \
--skipConflictUpdates \
Expand All @@ -2245,7 +2264,7 @@ transcend consent upload-preferences \
transcend consent upload-preferences \
--auth="$TRANSCEND_API_KEY" \
--partition=4d1c5daa-90b7-4d18-aa40-f86a43d2c726 \
--file=./preferences.csv \
--directory=./folder \
--transcendUrl=https://api.us.transcend.io
```

Expand Down
5 changes: 5 additions & 0 deletions examples/pm-test/cli-upload-preferences-example.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
email_id,person_id,member_id,timestamp,Sales,source_system
test-acme10@gmail.com,p1,m1,2025-08-07T05:09:40.317Z,true,
test-acme11@gmail.com,p2,m2,2025-08-07T17:49:21.192Z,true,
test-acme12@gmail.com,p3,m3,2025-08-07T18:49:21.192Z,false,
test-acme13@gmail.com,p4,m4,2025-08-07T17:49:21.192Z,false,
5 changes: 5 additions & 0 deletions examples/pm-test/cli-upload-preferences-example2.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
email_id,person_id,member_id,timestamp,Sales,source_system
,p5,m5,2025-08-07T05:09:40.317Z,true,
test-acme14@gmail.com,p6,m6,2025-08-07T17:49:21.192Z,true,
test-acme15@gmail.com,p7,m7,2025-08-07T18:49:21.192Z,false,
test-acme16@gmail.com,p8,m8,2025-08-07T17:49:21.192Z,false,
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"author": "Transcend Inc.",
"name": "@transcend-io/cli",
"description": "A command line interface for programmatic operations across Transcend.",
"version": "8.34.1",
"version": "9.0.0",
"homepage": "https://github.com/transcend-io/cli",
"repository": {
"type": "git",
Expand Down
31 changes: 25 additions & 6 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export * from './readFailingUpdatesFromReceipt';
export * from './summarizeReceipt';
export * from './receiptsState';
export * from './resolveReceiptPath';
export * from './applyReceiptSummary';
Loading
Loading