
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
@pleaseai/cli-toolkit
Advanced tools
Shared CLI utilities for LLM-focused command-line tools.
bun add @pleaseai/cli-toolkit
Format command output as JSON or TOON with optional field filtering:
import { outputData, parseFields } from '@pleaseai/cli-toolkit/output'
const data = [
{ number: 123, title: 'Feature request', state: 'OPEN' },
{ number: 124, title: 'Bug fix', state: 'CLOSED' },
]
// JSON output with all fields
outputData(data, 'json')
// TOON output for LLM consumption (58.9% token savings vs JSON)
outputData(data, 'toon')
// JSON output with field filtering
const fields = parseFields('number,title')
outputData(data, 'json', fields)
// Output: [{"number": 123, "title": "Feature request"}, ...]
Manage multilingual messages for your CLI:
import { detectSystemLanguage, I18nManager } from '@pleaseai/cli-toolkit/i18n'
const i18n = new I18nManager()
// Register messages
i18n.register('myapp.issues', 'en', {
creating: 'Creating issue...',
created: (number: number) => `Issue #${number} created!`,
})
i18n.register('myapp.issues', 'ko', {
creating: '이슈 생성 중...',
created: (number: number) => `이슈 #${number}가 생성되었습니다!`,
})
// Auto-detect language and get messages
const lang = detectSystemLanguage() // 'ko' or 'en' based on LANG env var
const msg = i18n.get('myapp.issues', lang)
console.log(msg.creating) // 'Creating issue...' or '이슈 생성 중...'
console.log(msg.created(123)) // 'Issue #123 created!' or '이슈 #123가 생성되었습니다!'
Display user-friendly progress indicators:
import { createProgressIndicator } from '@pleaseai/cli-toolkit/progress'
const progress = createProgressIndicator()
progress.start('Fetching data...') // 📡 Fetching data...
progress.update('Processing records...') // ⏳ Processing records...
progress.success('Operation completed!') // ✅ Operation completed!
progress.error('Operation failed') // ❌ Operation failed
progress.info('Additional info') // ℹ️ Additional info
Validate user inputs with clear error messages:
import {
validateNonEmptyString,
validatePattern,
validatePositiveInteger,
} from '@pleaseai/cli-toolkit/validation'
// Validate positive integers
const id = validatePositiveInteger('123', 'Issue ID') // 123
// validatePositiveInteger('0', 'Issue ID') → throws "Issue ID must be a positive integer"
// Validate non-empty strings
const body = validateNonEmptyString('Hello world', 'Comment body') // 'Hello world' (trimmed)
// validateNonEmptyString('', 'Comment body') → throws "Comment body cannot be empty"
// Validate patterns
const username = validatePattern('user123', /^[a-z0-9]+$/, 'Username', 'alphanumeric only')
// validatePattern('user-123', /^[a-z0-9]+$/, 'Username') → throws "Username must be alphanumeric only"
outputData(data, format, fields?) - Output data in JSON or TOON formatoutputJson(data) - Output as JSONoutputToon(data) - Output as TOON (58.9% token savings)parseFields(fieldString) - Parse comma-separated field listfilterFields(data, fields) - Filter object/array to specified fieldsisStructuredOutput(options) - Check if structured output is requestedvalidateFormat(format) - Validate output formatdetectSystemLanguage() - Detect language from environment variablesI18nManager - Message registry and manager
register(domain, lang, messages) - Register message dictionaryget(domain, lang) - Get messages for domain and languagehas(domain) - Check if domain is registeredhasLanguage(domain, lang) - Check if language is registeredgetCommonMessages(lang) - Get built-in common messagescreateProgressIndicator() - Create console-based progress indicatorformatSuccess(message) - Format success message with ✅formatError(message) - Format error message with ❌formatInfo(message) - Format info message with ℹ️formatWarning(message) - Format warning message with ⚠️formatProgress(message) - Format progress message with ⏳Numeric:
validatePositiveInteger(value, fieldName?) - Validate positive integer stringvalidateNumericId(value, fieldName?) - Validate positive integer (string or number)validateRange(value, min, max, fieldName?) - Validate number within rangeText:
validateNonEmptyString(value, fieldName?) - Validate non-empty stringvalidateMaxLength(value, maxLength, fieldName?) - Validate string lengthvalidateString(value, maxLength, fieldName?) - Validate non-empty + max lengthvalidatePattern(value, pattern, fieldName?, description?) - Validate regex patternAll modules are fully typed with TypeScript. Import types directly:
import type { Language, OutputFormat, ProgressIndicator } from '@pleaseai/cli-toolkit'
bun test
bun test --coverage
MIT
PleaseAI
FAQs
Shared CLI utilities for LLM-focused command-line tools
The npm package @pleaseai/cli-toolkit receives a total of 11 weekly downloads. As such, @pleaseai/cli-toolkit popularity was classified as not popular.
We found that @pleaseai/cli-toolkit demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.