crypto-com / crypto-com/cdcx-cli

TUI: press Enter on book-cursor level to prefill place-order modal

Open
#34 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
25
Forks
9
PR merge metrics
No merged PRs in 30d

Description

## Context
#33 (merged as part of #26 Piece 2) added an interactive book-level cursor on Market Detail view. The cursor lets the user *inspect* a specific price level — but they can't yet *act* on it. The natural next step: pressing Enter on a selected level opens the place-order workflow prefilled with that price.

This is the punchline of the cursor work. Without it, Piece 2 is look-but-don't-touch.

## Proposed behavior

On Market Detail view with \`book_cursor\` active, pressing Enter:

1. Opens the existing place-order workflow (\`PlaceOrderWorkflow\`, same one \`t\` triggers).
2. Prefills:
- **instrument** = \`detail_instrument\`
- **side**: opposite of cursor side — \`BookCursor::Bid(_) → SELL\` (you're selling into the bid), \`BookCursor::Ask(_) → BUY\` (you're buying from the ask).
- **order type** = LIMIT (price-aware — MARKET wouldn't make sense given we're explicitly using the selected price).
- **price** = the selected level's price, formatted per the instrument's price tick.
- **qty** = the selected level's qty. User is free to override. Rationale: \"how much is at this level\" is a common starting quote; the user will almost always adjust.

3. Cursor clears on entry (consistent with how \`t\`, \`k\`, \`m\`, \`D\` already clear it).

## UX questions to resolve during implementation

- **Is prefilling *qty* the right default?** Alternatives: leave it empty (force user to type), or use the selected level's *cumulative* qty (i.e. \"sweep through this level\"). I lean empty or level-qty. Cumulative is a power-user ask; wait for demand.
- **LIMIT vs LIMIT_POST_ONLY?** Limit orders that cross the spread immediately become takers. For maker-intent users the POST_ONLY variant is safer. Propose: LIMIT by default, user can flip to POST_ONLY in the modal.
- **Paper mode?** Prefill must work in paper mode too (routes through \`paper_engine\` instead of REST). Already how \`t\` behaves; nothing new here, just don't forget to test it.

## Scope

**In scope:**
- Wire \`Enter\` on Detail view (only when \`book_cursor.is_some()\`).
- Prefill logic in \`PlaceOrderWorkflow::new_with_prefill\` or an equivalent constructor.
- Tests: prefill derivation is pure logic — cursor + book → workflow init params. Mutation-verify the side flip (ask → BUY, bid → SELL).
- Help overlay "Detail View" page updated with \`Enter: place limit @ level\`.
- Footer hint updated when cursor active: add \`Enter:trade@level\`.

**Out of scope:**
- Multi-level sweeps / aggregation.
- MARKET prefill (doesn't make semantic sense when the user explicitly picked a price).
- Stop / OCO / OTOCO prefill from the cursor — separate workflows, can extend later if demanded.
- Mouse-click on level to set cursor *then* Enter — separate UX polish (click-only trade would need a double-click or modifier to avoid accidents).

## Risk
- Low. Reuses \`PlaceOrderWorkflow\`; new code is the prefill constructor + one Enter branch.
- Biggest risk: wrong side flip (buying into a bid is not what the user meant). Tests and a clear footer label (\`SELL @ 78,550\` shown in the modal header) mitigate.

## Related
- #26 — parent feature (Pieces 1 + 2 now merged).
- #33 — Piece 2 PR; shipped the \`book_cursor\` state this issue builds on.
- #32 — session persistence; orthogonal but might eventually persist a "default prefill qty mode" (empty vs level-qty) if users have strong preferences.

## Agent-native parity
The equivalent agent action is \`cdcx trade limit --side SELL --price

--qty \` — already shipped. An MCP-side helper that reads the book and emits the corresponding trade params would cleanly mirror the TUI binding; file as a separate issue only if we hear demand.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.