letz-cli 0.3.0__tar.gz → 0.3.1__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.
- {letz_cli-0.3.0 → letz_cli-0.3.1}/PKG-INFO +7 -5
- {letz_cli-0.3.0 → letz_cli-0.3.1}/README.md +6 -4
- {letz_cli-0.3.0 → letz_cli-0.3.1}/letz/__init__.py +1 -1
- {letz_cli-0.3.0 → letz_cli-0.3.1}/letz/__main__.py +4 -3
- {letz_cli-0.3.0 → letz_cli-0.3.1}/letz/api.py +4 -1
- {letz_cli-0.3.0 → letz_cli-0.3.1}/.gitignore +0 -0
- {letz_cli-0.3.0 → letz_cli-0.3.1}/LICENSE +0 -0
- {letz_cli-0.3.0 → letz_cli-0.3.1}/letz/gauntlet.py +0 -0
- {letz_cli-0.3.0 → letz_cli-0.3.1}/pyproject.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: letz-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: Letz Brain CLI - pull campaigns from the Letz platform, draft email sequences locally with Claude, and push them back staged for review.
|
|
5
5
|
Project-URL: Homepage, https://sam.weareletz.com
|
|
6
6
|
Author: Letz
|
|
@@ -28,13 +28,15 @@ the [Letz](https://sam.weareletz.com) platform staged for review, and let the cl
|
|
|
28
28
|
## 60-second start
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
pip install letz-cli
|
|
32
|
-
export LETZ_API_URL="https://your-letz-instance.example.com"
|
|
31
|
+
pip install letz-cli # or: pipx install letz-cli
|
|
33
32
|
export LETZ_API_KEY="letz_sk_..." # create one in Settings → Claude Code Tools → API Keys
|
|
34
|
-
letz campaigns
|
|
35
|
-
letz prompt <CAMPAIGN_ID>
|
|
33
|
+
letz campaigns # list your campaigns + ids
|
|
34
|
+
letz prompt <CAMPAIGN_ID> # print the playbook for Claude
|
|
36
35
|
```
|
|
37
36
|
|
|
37
|
+
The CLI talks to the Letz cloud by default. Self-hosted or local instance? Point it
|
|
38
|
+
elsewhere with `export LETZ_API_URL="https://your-instance.example.com"` or `--api`.
|
|
39
|
+
|
|
38
40
|
Paste the output of `letz prompt` into a [Claude Code](https://docs.claude.com/en/docs/claude-code/overview)
|
|
39
41
|
session signed in with a **Claude Pro or Max subscription** (not a metered API key — the
|
|
40
42
|
subscription is what makes generation free). Claude runs the whole loop below for you,
|
|
@@ -7,13 +7,15 @@ the [Letz](https://sam.weareletz.com) platform staged for review, and let the cl
|
|
|
7
7
|
## 60-second start
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
pip install letz-cli
|
|
11
|
-
export LETZ_API_URL="https://your-letz-instance.example.com"
|
|
10
|
+
pip install letz-cli # or: pipx install letz-cli
|
|
12
11
|
export LETZ_API_KEY="letz_sk_..." # create one in Settings → Claude Code Tools → API Keys
|
|
13
|
-
letz campaigns
|
|
14
|
-
letz prompt <CAMPAIGN_ID>
|
|
12
|
+
letz campaigns # list your campaigns + ids
|
|
13
|
+
letz prompt <CAMPAIGN_ID> # print the playbook for Claude
|
|
15
14
|
```
|
|
16
15
|
|
|
16
|
+
The CLI talks to the Letz cloud by default. Self-hosted or local instance? Point it
|
|
17
|
+
elsewhere with `export LETZ_API_URL="https://your-instance.example.com"` or `--api`.
|
|
18
|
+
|
|
17
19
|
Paste the output of `letz prompt` into a [Claude Code](https://docs.claude.com/en/docs/claude-code/overview)
|
|
18
20
|
session signed in with a **Claude Pro or Max subscription** (not a metered API key — the
|
|
19
21
|
subscription is what makes generation free). Claude runs the whole loop below for you,
|
|
@@ -23,12 +23,12 @@ import sys
|
|
|
23
23
|
|
|
24
24
|
try:
|
|
25
25
|
from . import __version__
|
|
26
|
-
from .api import LetzAPI, LetzAPIError
|
|
26
|
+
from .api import DEFAULT_API_URL, LetzAPI, LetzAPIError
|
|
27
27
|
from .gauntlet import audit_sequence
|
|
28
28
|
except ImportError: # allow running as a plain script: python cli/letz/__main__.py
|
|
29
29
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
30
30
|
from letz import __version__
|
|
31
|
-
from letz.api import LetzAPI, LetzAPIError
|
|
31
|
+
from letz.api import DEFAULT_API_URL, LetzAPI, LetzAPIError
|
|
32
32
|
from letz.gauntlet import audit_sequence
|
|
33
33
|
|
|
34
34
|
|
|
@@ -239,7 +239,8 @@ def cmd_status(args):
|
|
|
239
239
|
def main(argv=None):
|
|
240
240
|
p = argparse.ArgumentParser(prog="letz", description="Letz Brain CLI — off-platform generation, persist, click send.")
|
|
241
241
|
p.add_argument("--version", action="version", version=f"%(prog)s {__version__}")
|
|
242
|
-
p.add_argument("--api", default=os.environ.get("LETZ_API_URL"
|
|
242
|
+
p.add_argument("--api", default=os.environ.get("LETZ_API_URL") or DEFAULT_API_URL,
|
|
243
|
+
help="platform base URL (default: the Letz cloud; override via $LETZ_API_URL)")
|
|
243
244
|
p.add_argument("--key", default=os.environ.get("LETZ_API_KEY", ""), help="API key (or $LETZ_API_KEY) — create one in Settings → API Keys")
|
|
244
245
|
p.add_argument("--work", default=None, help="work dir (default ./letz_work)")
|
|
245
246
|
sub = p.add_subparsers(dest="cmd", required=True)
|
|
@@ -16,8 +16,11 @@ class LetzAPIError(Exception):
|
|
|
16
16
|
super().__init__(f"HTTP {status}: {str(body)[:300]}")
|
|
17
17
|
|
|
18
18
|
|
|
19
|
+
DEFAULT_API_URL = "https://letz-auto-sdr-production.up.railway.app"
|
|
20
|
+
|
|
21
|
+
|
|
19
22
|
class LetzAPI:
|
|
20
|
-
def __init__(self, base_url: str =
|
|
23
|
+
def __init__(self, base_url: str = DEFAULT_API_URL, timeout: int = 120,
|
|
21
24
|
api_key: str = ""):
|
|
22
25
|
self.base = base_url.rstrip("/")
|
|
23
26
|
self.timeout = timeout
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|