fere-cli 0.4.0.dev45__tar.gz → 0.4.0.dev49__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/.gitignore +26 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/PKG-INFO +3 -3
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/pyproject.toml +2 -2
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/earn.py +9 -2
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/limit_order.py +5 -1
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/perp.py +25 -6
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/spot_hl.py +17 -4
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/swap.py +5 -2
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/README.md +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/install.sh +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/__init__.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/async_util.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/banner.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/__init__.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/auth.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/chat.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/hooks.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/portfolio.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/commands/utility.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/config.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/main.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/output.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/src/fere_cli/update.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/tests/test_install_sh.py +0 -0
- {fere_cli-0.4.0.dev45 → fere_cli-0.4.0.dev49}/tests/test_update.py +0 -0
|
@@ -15,6 +15,14 @@ __pycache__
|
|
|
15
15
|
# Bruno gateway collection (GATEWAY_AGENT_ID / GATEWAY_PRIVATE_KEY_B64)
|
|
16
16
|
bruno_specs/gateway-service/.env
|
|
17
17
|
|
|
18
|
+
# Vultr self-hosted provision (API key + SSH ids)
|
|
19
|
+
devops/self-hosted/.env
|
|
20
|
+
|
|
21
|
+
# Box env plaintext (Secret Manager is the remote store). age.key leftover.
|
|
22
|
+
devops/self-hosted/secrets/age.key
|
|
23
|
+
devops/self-hosted/secrets/plaintext/
|
|
24
|
+
devops/self-hosted/inventory/plaintext/
|
|
25
|
+
|
|
18
26
|
# Gateway k6 load tests (secrets + local output from make setup)
|
|
19
27
|
devops/loadtests/k6/.env.local
|
|
20
28
|
devops/loadtests/k6/users.csv
|
|
@@ -47,12 +55,25 @@ dev/logs/*
|
|
|
47
55
|
# Poetry local venv preference (in-project .venv) — dev-only, per-service
|
|
48
56
|
**/poetry.toml
|
|
49
57
|
|
|
58
|
+
# Ralph Loop plugin runtime state (scratchpad + done flag)
|
|
59
|
+
.cursor/ralph/
|
|
60
|
+
|
|
50
61
|
# Cursor SEO skill — regenerated report JSON (not source)
|
|
51
62
|
.cursor/skills/seo-agent/artifacts/
|
|
52
63
|
.claude/skills/seo-agent/artifacts/
|
|
53
64
|
.cursor/skills/docker-images-cve-scan/artifacts/
|
|
54
65
|
docs/plans/artifacts/
|
|
55
66
|
|
|
67
|
+
# Impeccable local consent / detector cache (shared hook-off config is committed)
|
|
68
|
+
.impeccable/config.local.json
|
|
69
|
+
.impeccable/*.cache
|
|
70
|
+
.impeccable/cache/
|
|
71
|
+
# Session output: critiques, browser evidence and mock renders. Matches the
|
|
72
|
+
# rule above — shared config is tracked, per-run artifacts are not.
|
|
73
|
+
.impeccable/critique/
|
|
74
|
+
.impeccable/critique-evidence/
|
|
75
|
+
webapp/.impeccable/
|
|
76
|
+
|
|
56
77
|
# Skills installed locally by the skills package manager (see skills-lock.json)
|
|
57
78
|
.claude/skills/stripe-best-practices
|
|
58
79
|
.claude/skills/stripe-projects
|
|
@@ -63,6 +84,11 @@ docs/plans/artifacts/
|
|
|
63
84
|
.agentmemory/data/
|
|
64
85
|
.devcontainer/agentmemory-mcp/node_modules/
|
|
65
86
|
|
|
87
|
+
# Local GLASS mock / design reference (not in git). Tokens: webapp/DESIGN.md + app/globals.css
|
|
88
|
+
Fere Glass Design System (Space Grotesk).html
|
|
89
|
+
fere-onboarding-zero-states/
|
|
90
|
+
fereonboardingzerostates.zip
|
|
91
|
+
|
|
66
92
|
# Local GEO upstream reference (optional clone; not part of the product tree)
|
|
67
93
|
geo-seo/
|
|
68
94
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: fere-cli
|
|
3
|
-
Version: 0.4.0.
|
|
3
|
+
Version: 0.4.0.dev49
|
|
4
4
|
Summary: Terminal CLI for FereAI crypto trading and research
|
|
5
5
|
Author-email: Fere AI <hello@fereai.xyz>
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Requires-Python: >=3.10
|
|
8
8
|
Requires-Dist: click>=8.1
|
|
9
|
-
Requires-Dist: fere-sdk>=0.4.0.
|
|
9
|
+
Requires-Dist: fere-sdk>=0.4.0.dev49
|
|
10
10
|
Requires-Dist: httpx>=0.27
|
|
11
11
|
Requires-Dist: rich>=13.0
|
|
12
12
|
Provides-Extra: dev
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fere-cli"
|
|
3
|
-
version = "0.4.0.
|
|
3
|
+
version = "0.4.0.dev49"
|
|
4
4
|
description = "Terminal CLI for FereAI crypto trading and research"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
7
7
|
license = "MIT"
|
|
8
8
|
authors = [{ name = "Fere AI", email = "hello@fereai.xyz" }]
|
|
9
9
|
dependencies = [
|
|
10
|
-
"fere-sdk>=0.4.0.
|
|
10
|
+
"fere-sdk>=0.4.0.dev49",
|
|
11
11
|
"httpx>=0.27",
|
|
12
12
|
"click>=8.1",
|
|
13
13
|
"rich>=13.0",
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
|
+
from fere_sdk.timeouts import DEFAULT_TIMEOUT
|
|
6
7
|
from rich.console import Console
|
|
7
8
|
|
|
8
9
|
from ..async_util import async_command, get_client, is_tty
|
|
@@ -48,7 +49,10 @@ async def info(ctx):
|
|
|
48
49
|
help="Existing position ID to add to.",
|
|
49
50
|
)
|
|
50
51
|
@click.option(
|
|
51
|
-
"--timeout",
|
|
52
|
+
"--timeout",
|
|
53
|
+
default=DEFAULT_TIMEOUT,
|
|
54
|
+
type=int,
|
|
55
|
+
help="Wait timeout (seconds).",
|
|
52
56
|
)
|
|
53
57
|
@click.option("-y", "--yes", is_flag=True, help="Skip confirmation.")
|
|
54
58
|
@click.pass_context
|
|
@@ -92,7 +96,10 @@ async def deposit(ctx, amount, position_id, timeout, yes):
|
|
|
92
96
|
help="USDC amount to withdraw.",
|
|
93
97
|
)
|
|
94
98
|
@click.option(
|
|
95
|
-
"--timeout",
|
|
99
|
+
"--timeout",
|
|
100
|
+
default=DEFAULT_TIMEOUT,
|
|
101
|
+
type=int,
|
|
102
|
+
help="Wait timeout (seconds).",
|
|
96
103
|
)
|
|
97
104
|
@click.option("-y", "--yes", is_flag=True, help="Skip confirmation.")
|
|
98
105
|
@click.pass_context
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
|
+
from fere_sdk.timeouts import DEFAULT_TIMEOUT
|
|
6
7
|
from rich.console import Console
|
|
7
8
|
|
|
8
9
|
from ..async_util import async_command, get_client, is_tty
|
|
@@ -57,7 +58,10 @@ def limit_order():
|
|
|
57
58
|
)
|
|
58
59
|
@click.option("--slippage-bps", default=50, type=int, help="Slippage (bps).")
|
|
59
60
|
@click.option(
|
|
60
|
-
"--timeout",
|
|
61
|
+
"--timeout",
|
|
62
|
+
default=DEFAULT_TIMEOUT,
|
|
63
|
+
type=int,
|
|
64
|
+
help="Wait timeout (seconds).",
|
|
61
65
|
)
|
|
62
66
|
@click.option("-y", "--yes", is_flag=True, help="Skip confirmation.")
|
|
63
67
|
@click.pass_context
|
|
@@ -7,6 +7,7 @@ Venue-neutral perpetual futures. ``size`` is in contracts.
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
9
|
import click
|
|
10
|
+
from fere_sdk.timeouts import DEFAULT_TIMEOUT
|
|
10
11
|
from rich.console import Console
|
|
11
12
|
|
|
12
13
|
from ..async_util import async_command, get_client, is_tty
|
|
@@ -59,7 +60,10 @@ async def status(ctx):
|
|
|
59
60
|
@perp.command()
|
|
60
61
|
@click.option("--force", is_flag=True, help="Re-run setup even if complete.")
|
|
61
62
|
@click.option(
|
|
62
|
-
"--timeout",
|
|
63
|
+
"--timeout",
|
|
64
|
+
default=DEFAULT_TIMEOUT,
|
|
65
|
+
type=int,
|
|
66
|
+
help="Wait timeout (seconds).",
|
|
63
67
|
)
|
|
64
68
|
@click.pass_context
|
|
65
69
|
@async_command
|
|
@@ -115,7 +119,10 @@ async def orders(ctx):
|
|
|
115
119
|
@click.option("--tp-price", default=None, type=float, help="Take-profit.")
|
|
116
120
|
@click.option("--sl-price", default=None, type=float, help="Stop-loss.")
|
|
117
121
|
@click.option(
|
|
118
|
-
"--timeout",
|
|
122
|
+
"--timeout",
|
|
123
|
+
default=DEFAULT_TIMEOUT,
|
|
124
|
+
type=int,
|
|
125
|
+
help="Wait timeout (seconds).",
|
|
119
126
|
)
|
|
120
127
|
@click.option("-y", "--yes", is_flag=True, help="Skip confirmation.")
|
|
121
128
|
@click.pass_context
|
|
@@ -173,7 +180,10 @@ async def open(
|
|
|
173
180
|
)
|
|
174
181
|
@click.option("--slippage-pct", default=0.5, type=float)
|
|
175
182
|
@click.option(
|
|
176
|
-
"--timeout",
|
|
183
|
+
"--timeout",
|
|
184
|
+
default=DEFAULT_TIMEOUT,
|
|
185
|
+
type=int,
|
|
186
|
+
help="Wait timeout (seconds).",
|
|
177
187
|
)
|
|
178
188
|
@click.option("-y", "--yes", is_flag=True, help="Skip confirmation.")
|
|
179
189
|
@click.pass_context
|
|
@@ -209,7 +219,10 @@ async def close(ctx, asset, size, slippage_pct, timeout, yes):
|
|
|
209
219
|
"--order-id", required=True, type=int, help="Venue order id (oid)."
|
|
210
220
|
)
|
|
211
221
|
@click.option(
|
|
212
|
-
"--timeout",
|
|
222
|
+
"--timeout",
|
|
223
|
+
default=DEFAULT_TIMEOUT,
|
|
224
|
+
type=int,
|
|
225
|
+
help="Wait timeout (seconds).",
|
|
213
226
|
)
|
|
214
227
|
@click.pass_context
|
|
215
228
|
@async_command
|
|
@@ -252,7 +265,10 @@ async def cancel(ctx, asset, order_id, timeout):
|
|
|
252
265
|
help="USD amount the user entered.",
|
|
253
266
|
)
|
|
254
267
|
@click.option(
|
|
255
|
-
"--timeout",
|
|
268
|
+
"--timeout",
|
|
269
|
+
default=DEFAULT_TIMEOUT,
|
|
270
|
+
type=int,
|
|
271
|
+
help="Wait timeout (seconds).",
|
|
256
272
|
)
|
|
257
273
|
@click.option("-y", "--yes", is_flag=True, help="Skip confirmation.")
|
|
258
274
|
@click.pass_context
|
|
@@ -306,7 +322,10 @@ async def fund(
|
|
|
306
322
|
help="ERC-20/mint; omit for native token.",
|
|
307
323
|
)
|
|
308
324
|
@click.option(
|
|
309
|
-
"--timeout",
|
|
325
|
+
"--timeout",
|
|
326
|
+
default=DEFAULT_TIMEOUT,
|
|
327
|
+
type=int,
|
|
328
|
+
help="Wait timeout (seconds).",
|
|
310
329
|
)
|
|
311
330
|
@click.option("-y", "--yes", is_flag=True, help="Skip confirmation.")
|
|
312
331
|
@click.pass_context
|
|
@@ -7,6 +7,7 @@ USDC-quoted); ``size`` is the base-token amount.
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
9
|
import click
|
|
10
|
+
from fere_sdk.timeouts import DEFAULT_TIMEOUT
|
|
10
11
|
from rich.console import Console
|
|
11
12
|
|
|
12
13
|
from ..async_util import async_command, get_client, is_tty
|
|
@@ -69,7 +70,10 @@ async def orders(ctx):
|
|
|
69
70
|
@click.option("--tp-price", default=None, type=float, help="Take-profit.")
|
|
70
71
|
@click.option("--sl-price", default=None, type=float, help="Stop-loss.")
|
|
71
72
|
@click.option(
|
|
72
|
-
"--timeout",
|
|
73
|
+
"--timeout",
|
|
74
|
+
default=DEFAULT_TIMEOUT,
|
|
75
|
+
type=int,
|
|
76
|
+
help="Wait timeout (seconds).",
|
|
73
77
|
)
|
|
74
78
|
@click.option("-y", "--yes", is_flag=True, help="Skip confirmation.")
|
|
75
79
|
@click.pass_context
|
|
@@ -129,7 +133,10 @@ async def buy(
|
|
|
129
133
|
@click.option("--limit-price", default=None, type=float)
|
|
130
134
|
@click.option("--slippage-pct", default=0.5, type=float)
|
|
131
135
|
@click.option(
|
|
132
|
-
"--timeout",
|
|
136
|
+
"--timeout",
|
|
137
|
+
default=DEFAULT_TIMEOUT,
|
|
138
|
+
type=int,
|
|
139
|
+
help="Wait timeout (seconds).",
|
|
133
140
|
)
|
|
134
141
|
@click.option("-y", "--yes", is_flag=True, help="Skip confirmation.")
|
|
135
142
|
@click.pass_context
|
|
@@ -174,7 +181,10 @@ async def sell(
|
|
|
174
181
|
help="Base amount; omit for the full held balance.",
|
|
175
182
|
)
|
|
176
183
|
@click.option(
|
|
177
|
-
"--timeout",
|
|
184
|
+
"--timeout",
|
|
185
|
+
default=DEFAULT_TIMEOUT,
|
|
186
|
+
type=int,
|
|
187
|
+
help="Wait timeout (seconds).",
|
|
178
188
|
)
|
|
179
189
|
@click.pass_context
|
|
180
190
|
@async_command
|
|
@@ -208,7 +218,10 @@ async def tp_sl(ctx, asset, tp_price, sl_price, size, timeout):
|
|
|
208
218
|
"--order-id", required=True, type=int, help="Venue order id (oid)."
|
|
209
219
|
)
|
|
210
220
|
@click.option(
|
|
211
|
-
"--timeout",
|
|
221
|
+
"--timeout",
|
|
222
|
+
default=DEFAULT_TIMEOUT,
|
|
223
|
+
type=int,
|
|
224
|
+
help="Wait timeout (seconds).",
|
|
212
225
|
)
|
|
213
226
|
@click.pass_context
|
|
214
227
|
@async_command
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
|
+
from fere_sdk.timeouts import DEFAULT_TIMEOUT
|
|
6
7
|
from rich.console import Console
|
|
7
8
|
|
|
8
9
|
from ..async_util import async_command, get_client, is_tty
|
|
@@ -53,9 +54,11 @@ console = Console()
|
|
|
53
54
|
)
|
|
54
55
|
@click.option(
|
|
55
56
|
"--timeout",
|
|
56
|
-
default=
|
|
57
|
+
default=DEFAULT_TIMEOUT,
|
|
57
58
|
type=int,
|
|
58
|
-
help=
|
|
59
|
+
help=(
|
|
60
|
+
f"Max seconds to wait for completion (default: {DEFAULT_TIMEOUT})."
|
|
61
|
+
),
|
|
59
62
|
)
|
|
60
63
|
@click.option(
|
|
61
64
|
"-y",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|