- claude-print.yaml: NEEDLE agent config with stdin input_method, needle-transform-claude output_transform, and invoke_template for subscription-billed claude-print runs - install.sh: download release binary from GitHub, backup existing, install mock_claude, install NEEDLE config if present, run --check to verify, print --version - src/check.rs: --check doctor subcommand with openpty probe, mkfifo probe, and optional mock_claude PTY round-trip (skipped if mock_claude not in PATH) - src/main.rs + src/lib.rs: wire up check::run() for --check flag - README.md: add Install, Usage, Flags table (matches --help exactly), Exit codes, and NEEDLE integration sections - test-fixtures/mock-claude: extend with all MOCK_* env var controls needed for integration tests (MOCK_SILENT, MOCK_EXIT_BEFORE_STOP, MOCK_TRUST_DIALOG, etc.) - tests/cli.rs, tests/hooks.rs, tests/version_compat.rs: Phase 10 unit test stubs claude-print --check passes: openpty PASS, mkfifo PASS, mock_claude PTY PASS bash -n install.sh: syntax OK Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2.4 KiB
claude-print
Drop-in replacement for claude -p (print/headless mode) that drives the Claude Code interactive TUI via PTY — preserving subscription billing after the June 15, 2026 Agent SDK credit split.
Why this exists
Starting June 15, 2026, Anthropic separates claude -p (headless) into a separate Agent SDK credit pool ($100–$200/month on Max plans). Only the interactive TUI (cc_entrypoint=cli) continues drawing from the unlimited subscription. claude-print wraps the interactive TUI in a PTY so callers get claude -p wire-compatible output while billing against the subscription.
Install
sh install.sh
Or set SKIP_MOCK_CLAUDE=1 to skip the mock_claude test fixture.
Usage
claude-print [OPTIONS] [PROMPT]
Reads prompt from positional argument, --input-file, or stdin (when not a TTY).
Flags
| Flag | Short | Default | Description |
|---|---|---|---|
[PROMPT] |
Prompt string (mutually exclusive with --input-file and stdin) |
||
--input-file <FILE> |
-f |
Read prompt from file | |
--model <MODEL> |
-m |
claude-sonnet-4-6 |
Model to use |
--max-turns <N> |
30 |
Maximum number of turns | |
--output-format <FORMAT> |
-o |
text |
Output format: text, json, stream-json |
--allowedTools <LIST> |
Comma-separated list of allowed tools | ||
--disallowedTools <LIST> |
Comma-separated list of disallowed tools | ||
--dangerously-skip-permissions |
Skip permission prompts (dangerous) | ||
--timeout <SECS> |
3600 |
Wall-clock timeout in seconds | |
--claude-binary <PATH> |
PATH lookup | Path to claude binary | |
--no-inherit-hooks |
Disable user hook inheritance | ||
--verbose |
Write timing traces to stderr | ||
--check |
Run installation self-test and exit | ||
--version |
-V |
Print version and exit | |
--help |
-h |
Print help |
Exit codes
| Code | Meaning |
|---|---|
0 |
Success |
1 |
Assistant error (is_error: true in transcript) |
2 |
Internal error (PTY spawn, hook setup, parse failure) |
124 |
Timeout exceeded |
130 |
Interrupted (SIGINT) |
NEEDLE integration
Copy claude-print.yaml to ~/.needle/agents/ (handled automatically by install.sh).
Structure
docs/notes/— design decisions, constraints, integration detailsdocs/plan/plan.md— complete implementation plan