docs: clarify transport vs credentials; show engine+source in whoami
This commit is contained in:
@@ -41,8 +41,11 @@ bird tweet "hello from bird"
|
|||||||
bird replies https://x.com/user/status/1234567890123456789
|
bird replies https://x.com/user/status/1234567890123456789
|
||||||
```
|
```
|
||||||
|
|
||||||
Global engine switch:
|
Transport (engine) selection:
|
||||||
- `--engine graphql|sweetistics|auto` (default `auto`). `auto` uses Sweetistics when an API key is provided, otherwise falls back to direct GraphQL. `sweetistics` requires `--sweetistics-api-key` (or env) and uses Sweetistics for all commands. `graphql` forces direct Twitter cookies even if an API key is present.
|
- `--engine graphql|sweetistics|auto` (default `auto`).
|
||||||
|
- `sweetistics`: use Sweetistics API key, no browser cookies needed.
|
||||||
|
- `graphql`: use Twitter/X GraphQL with cookies (Chrome/Firefox/env/flags).
|
||||||
|
- `auto`: Sweetistics if an API key is available, otherwise GraphQL.
|
||||||
|
|
||||||
You can set persistent defaults via config files (JSON5):
|
You can set persistent defaults via config files (JSON5):
|
||||||
|
|
||||||
@@ -146,12 +149,14 @@ bird check
|
|||||||
- Requires Chrome to be logged into x.com
|
- Requires Chrome to be logged into x.com
|
||||||
- May prompt for keychain access on first run
|
- May prompt for keychain access on first run
|
||||||
|
|
||||||
### Browser cookie sources (macOS)
|
### Credential sources (macOS)
|
||||||
|
|
||||||
- **Chrome (default)**: reads `~/Library/Application Support/Google/Chrome/<Profile>/Cookies` (WAL/SHM copied too). Select with `--chrome-profile <name>`; defaults to `Default` or whatever you set in config.
|
Used only when transport resolves to **graphql**:
|
||||||
- **Firefox**: reads `~/Library/Application Support/Firefox/Profiles/<profile>/cookies.sqlite`. Select with `--firefox-profile <name>`; defaults to `*.default-release` if present. Use this when Chrome isn’t logged in.
|
- **Chrome (default)**: `~/Library/Application Support/Google/Chrome/<Profile>/Cookies` (WAL/SHM copied too). `--chrome-profile <name>`.
|
||||||
|
- **Firefox**: `~/Library/Application Support/Firefox/Profiles/<profile>/cookies.sqlite`. `--firefox-profile <name>` (defaults to `*.default-release` if present).
|
||||||
|
- **Env/flags** always override browser cookies.
|
||||||
|
|
||||||
Precedence still holds: CLI flags > env vars > project config > global config. So a one-off `--firefox-profile default-release` overrides any config defaults.
|
Precedence: CLI flags > env vars > project config > global config. Transport is chosen first; then, if transport is GraphQL, cookie source is chosen.
|
||||||
|
|
||||||
### Posting via Sweetistics (API key)
|
### Posting via Sweetistics (API key)
|
||||||
|
|
||||||
|
|||||||
@@ -629,6 +629,20 @@ program
|
|||||||
const engine = resolveEngineMode(opts.engine || config.engine);
|
const engine = resolveEngineMode(opts.engine || config.engine);
|
||||||
const useSweetistics = shouldUseSweetistics(engine, Boolean(sweetistics.apiKey));
|
const useSweetistics = shouldUseSweetistics(engine, Boolean(sweetistics.apiKey));
|
||||||
const resolvedEngine = useSweetistics ? 'sweetistics' : 'graphql';
|
const resolvedEngine = useSweetistics ? 'sweetistics' : 'graphql';
|
||||||
|
const credentialSource =
|
||||||
|
resolvedEngine === 'sweetistics'
|
||||||
|
? sweetistics.apiKey
|
||||||
|
? 'Sweetistics API key'
|
||||||
|
: 'none'
|
||||||
|
: opts.chromeProfile
|
||||||
|
? `Chrome profile "${opts.chromeProfile}"`
|
||||||
|
: opts.firefoxProfile
|
||||||
|
? `Firefox profile "${opts.firefoxProfile}"`
|
||||||
|
: config.chromeProfile
|
||||||
|
? `Chrome profile "${config.chromeProfile}"`
|
||||||
|
: config.firefoxProfile
|
||||||
|
? `Firefox profile "${config.firefoxProfile}"`
|
||||||
|
: 'env/auto-detected cookies';
|
||||||
|
|
||||||
if (useSweetistics) {
|
if (useSweetistics) {
|
||||||
if (!sweetistics.apiKey) {
|
if (!sweetistics.apiKey) {
|
||||||
@@ -648,6 +662,7 @@ program
|
|||||||
console.log(`📧 ${result.user.email}`);
|
console.log(`📧 ${result.user.email}`);
|
||||||
}
|
}
|
||||||
console.log(`⚙️ Engine: ${resolvedEngine}`);
|
console.log(`⚙️ Engine: ${resolvedEngine}`);
|
||||||
|
console.log(`🔑 Credentials: ${credentialSource}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -682,6 +697,7 @@ program
|
|||||||
console.log(`🙋 Logged in as @${result.user.username} (${result.user.name})`);
|
console.log(`🙋 Logged in as @${result.user.username} (${result.user.name})`);
|
||||||
console.log(`🪪 User ID: ${result.user.id}`);
|
console.log(`🪪 User ID: ${result.user.id}`);
|
||||||
console.log(`⚙️ Engine: ${resolvedEngine}`);
|
console.log(`⚙️ Engine: ${resolvedEngine}`);
|
||||||
|
console.log(`🔑 Credentials: ${credentialSource}`);
|
||||||
} else {
|
} else {
|
||||||
console.error(`❌ Failed to determine current user: ${result.error ?? 'Unknown error'}`);
|
console.error(`❌ Failed to determine current user: ${result.error ?? 'Unknown error'}`);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
|||||||
Reference in New Issue
Block a user