fleece-cli 0.1.0__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.
- fleece_cli-0.1.0/.agents/skills/fleece/SKILL.md +115 -0
- fleece_cli-0.1.0/.claude/skills/fleece-card.md +38 -0
- fleece_cli-0.1.0/.claude/skills/fleece-compare.md +31 -0
- fleece_cli-0.1.0/.claude/skills/fleece-credits.md +26 -0
- fleece_cli-0.1.0/.claude/skills/fleece-news.md +28 -0
- fleece_cli-0.1.0/.claude/skills/fleece-partners.md +27 -0
- fleece_cli-0.1.0/.claude/skills/fleece-rates.md +29 -0
- fleece_cli-0.1.0/.claude/skills/fleece-recommend.md +32 -0
- fleece_cli-0.1.0/.claude/skills/fleece-roi.md +31 -0
- fleece_cli-0.1.0/.claude/skills/fleece-wallet.md +62 -0
- fleece_cli-0.1.0/.devcontainer/devcontainer.json +33 -0
- fleece_cli-0.1.0/.github/workflows/databricks-app-deploy.yml +40 -0
- fleece_cli-0.1.0/.github/workflows/publish.yml +39 -0
- fleece_cli-0.1.0/.gitignore +137 -0
- fleece_cli-0.1.0/.streamlit/config.toml +3 -0
- fleece_cli-0.1.0/Advertiser Disclosure.md +5 -0
- fleece_cli-0.1.0/CLAUDE.md +44 -0
- fleece_cli-0.1.0/KnowledgeCatalog.json +0 -0
- fleece_cli-0.1.0/LICENSE +21 -0
- fleece_cli-0.1.0/MyCards.json +0 -0
- fleece_cli-0.1.0/PKG-INFO +151 -0
- fleece_cli-0.1.0/README.md +127 -0
- fleece_cli-0.1.0/app.yaml +1 -0
- fleece_cli-0.1.0/assets/default_card.png +1 -0
- fleece_cli-0.1.0/assets/default_card.svg +10 -0
- fleece_cli-0.1.0/cli.py +391 -0
- fleece_cli-0.1.0/db.py +162 -0
- fleece_cli-0.1.0/fleece poc.ipynb +95 -0
- fleece_cli-0.1.0/fleece.py +239 -0
- fleece_cli-0.1.0/image_service.py +147 -0
- fleece_cli-0.1.0/install.sh +61 -0
- fleece_cli-0.1.0/migrate.py +38 -0
- fleece_cli-0.1.0/pages/credit_cards.py +348 -0
- fleece_cli-0.1.0/pages/my_credit_cards.py +334 -0
- fleece_cli-0.1.0/plan.md +175 -0
- fleece_cli-0.1.0/prompts/agent_system_prompt.py +22 -0
- fleece_cli-0.1.0/pyproject.toml +36 -0
- fleece_cli-0.1.0/reference/Analyzer.md +0 -0
- fleece_cli-0.1.0/requirements-test.txt +4 -0
- fleece_cli-0.1.0/requirements.txt +11 -0
- fleece_cli-0.1.0/style.css +81 -0
- fleece_cli-0.1.0/test_fleece.py +407 -0
- fleece_cli-0.1.0/tests/__init__.py +0 -0
- fleece_cli-0.1.0/tests/test_brave_client.py +121 -0
- fleece_cli-0.1.0/tests/test_cli.py +285 -0
- fleece_cli-0.1.0/tests/test_tools.py +186 -0
- fleece_cli-0.1.0/tools/__init__.py +3 -0
- fleece_cli-0.1.0/tools/brave_client.py +69 -0
- fleece_cli-0.1.0/tools/credit_card_tools.py +261 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fleece
|
|
3
|
+
description: Fleece credit card research CLI. Provides live US credit card data via Brave Search — full reports, earning rates, transfer partners, statement credits, recent news, card comparisons, portfolio analysis, ROI estimates, and profile-based recommendations. Use whenever you need current credit card information.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Fleece Credit Card Research
|
|
7
|
+
|
|
8
|
+
Live US credit card research backed by Brave Search. All commands output JSON for
|
|
9
|
+
programmatic use. Requires `BRAVE_API_KEY` in the environment.
|
|
10
|
+
|
|
11
|
+
## Prerequisites
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Set in environment or .env file
|
|
15
|
+
export BRAVE_API_KEY=<your_key>
|
|
16
|
+
|
|
17
|
+
# Run from the fleece project root
|
|
18
|
+
cd /path/to/fleece
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Commands
|
|
22
|
+
|
|
23
|
+
### Full card report
|
|
24
|
+
```bash
|
|
25
|
+
python cli.py card "<card name>" --json
|
|
26
|
+
```
|
|
27
|
+
Returns fees, welcome offer, earning rates, credits, benefits, and strategy.
|
|
28
|
+
|
|
29
|
+
### Earning rates
|
|
30
|
+
```bash
|
|
31
|
+
python cli.py rates "<card name>" --json
|
|
32
|
+
python cli.py rates "<card name>" --category "<dining|travel|groceries|gas>" --json
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Transfer partners
|
|
36
|
+
```bash
|
|
37
|
+
python cli.py partners "<card name>" --json
|
|
38
|
+
```
|
|
39
|
+
Returns airline and hotel partners with ratios and transfer timing.
|
|
40
|
+
|
|
41
|
+
### Statement credits
|
|
42
|
+
```bash
|
|
43
|
+
python cli.py credits "<card name>" --json
|
|
44
|
+
```
|
|
45
|
+
Returns all credits with amounts, cadence, and enrollment requirements.
|
|
46
|
+
|
|
47
|
+
### Recent news (past month)
|
|
48
|
+
```bash
|
|
49
|
+
python cli.py news "<card name>" --json
|
|
50
|
+
```
|
|
51
|
+
Freshness-filtered to the past month.
|
|
52
|
+
|
|
53
|
+
### Side-by-side comparison
|
|
54
|
+
```bash
|
|
55
|
+
python cli.py compare "<card A>" "<card B>" --json
|
|
56
|
+
python cli.py compare "<card A>" "<card B>" --aspects "fees,rewards,credits" --json
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Portfolio / wallet analysis
|
|
60
|
+
```bash
|
|
61
|
+
python cli.py wallet "<card 1>" "<card 2>" "<card 3>" --json
|
|
62
|
+
```
|
|
63
|
+
Returns coverage map, overlaps, gaps, and next-card suggestions.
|
|
64
|
+
|
|
65
|
+
### First-year ROI
|
|
66
|
+
```bash
|
|
67
|
+
python cli.py roi "<card name>" --travel <monthly $> --dining <monthly $> --other <monthly $> --json
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Profile-based recommendations
|
|
71
|
+
```bash
|
|
72
|
+
python cli.py recommend "<spending profile>" --json
|
|
73
|
+
python cli.py recommend "<spending profile>" --preferences "<preferences>" --json
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Output format
|
|
77
|
+
|
|
78
|
+
Every command with `--json` returns:
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"command": "card",
|
|
82
|
+
"query": "...",
|
|
83
|
+
"result": "...",
|
|
84
|
+
"ok": true,
|
|
85
|
+
"error": null
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
On error, `ok` is `false` and `error` contains the message. Always check `ok` before using `result`.
|
|
90
|
+
|
|
91
|
+
## Exit codes
|
|
92
|
+
|
|
93
|
+
| Code | Meaning |
|
|
94
|
+
|------|---------|
|
|
95
|
+
| `0` | Success |
|
|
96
|
+
| `1` | Search / tool error (Brave API failure) |
|
|
97
|
+
| `2` | `BRAVE_API_KEY` not set |
|
|
98
|
+
|
|
99
|
+
## Stdin piping
|
|
100
|
+
|
|
101
|
+
The primary argument on any single-card command accepts `-` to read from stdin:
|
|
102
|
+
```bash
|
|
103
|
+
echo "Chase Sapphire Preferred" | python cli.py card - --json
|
|
104
|
+
echo "high dining spend" | python cli.py recommend - --json
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
The `wallet` command accepts `-` as its sole argument to read newline-delimited card names:
|
|
108
|
+
```bash
|
|
109
|
+
printf "Amex Gold\nChase Freedom Unlimited\nBilt\n" | python cli.py wallet - --json
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Coverage
|
|
113
|
+
|
|
114
|
+
Supports all major US issuers: Amex, Bank of America, Barclays, Bilt, Capital One,
|
|
115
|
+
Chase, Citi, Discover, Robinhood, U.S. Bank, Wells Fargo.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fleece-card
|
|
3
|
+
description: Full credit card report — fees, welcome offer, earning rates, statement credits, benefits, and strategy. Use when asked about a specific card in detail.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /fleece-card
|
|
7
|
+
|
|
8
|
+
Fetches a comprehensive report for a US credit card using live Brave Search data.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- User asks about a specific card's details, benefits, or annual fee
|
|
12
|
+
- User wants to know if a card is worth it
|
|
13
|
+
- You need current card info (training data may be stale)
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python cli.py card "<card name>" --json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The `--json` flag returns a structured envelope your can parse:
|
|
22
|
+
```json
|
|
23
|
+
{ "command": "card", "query": "...", "result": "...", "ok": true, "error": null }
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Use `result` as your research context, then synthesize a natural answer.
|
|
27
|
+
|
|
28
|
+
## Exit codes
|
|
29
|
+
- `0` success
|
|
30
|
+
- `1` search error — tell the user and fall back to training data
|
|
31
|
+
- `2` `BRAVE_API_KEY` not configured
|
|
32
|
+
|
|
33
|
+
## Example
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
python cli.py card "Chase Sapphire Preferred" --json
|
|
37
|
+
python cli.py card "Amex Gold" --json
|
|
38
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fleece-compare
|
|
3
|
+
description: Side-by-side comparison of two credit cards across fees, rewards, welcome offers, credits, and transfer partners. Use when asked which card is better.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /fleece-compare
|
|
7
|
+
|
|
8
|
+
Searches live data for both cards and returns research for a structured comparison.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- User asks "which is better" between two specific cards
|
|
12
|
+
- User is deciding between two cards and wants a comparison
|
|
13
|
+
- User wants to see how two cards stack up on a specific dimension
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python cli.py compare "<card A>" "<card B>" --json
|
|
19
|
+
python cli.py compare "<card A>" "<card B>" --aspects "fees,rewards,credits" --json
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Default aspects: `fees,rewards,welcome_offer,credits,transfer_partners`
|
|
23
|
+
|
|
24
|
+
## Example
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
python cli.py compare "Amex Gold" "Chase Sapphire Preferred" --json
|
|
28
|
+
python cli.py compare "Capital One Venture X" "Chase Sapphire Reserve" --json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
After receiving the result, synthesize a clear recommendation based on the user's stated priorities.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fleece-credits
|
|
3
|
+
description: Statement credits and perks for a credit card — amounts, cadence, enrollment requirements. Use when asked how to offset the annual fee or what credits are available.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /fleece-credits
|
|
7
|
+
|
|
8
|
+
Fetches the full list of statement credits and perks for a card.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- User asks what credits a card offers
|
|
12
|
+
- User wants to know how to offset the annual fee
|
|
13
|
+
- User asks about dining, travel, streaming, or hotel credits
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python cli.py credits "<card name>" --json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Example
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
python cli.py credits "Amex Platinum" --json
|
|
25
|
+
python cli.py credits "Chase Sapphire Reserve" --json
|
|
26
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fleece-news
|
|
3
|
+
description: Recent changes to a credit card in the past month — benefit cuts, fee increases, new perks, or limited-time offers. Use when asked if anything changed recently.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /fleece-news
|
|
7
|
+
|
|
8
|
+
Searches for the latest news and changes for a card using freshness-filtered results.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- User asks if a card's benefits have changed recently
|
|
12
|
+
- User heard something changed and wants confirmation
|
|
13
|
+
- You want to verify your training data is still accurate
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python cli.py news "<card name>" --json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Results are filtered to the past month (`freshness=pm`).
|
|
22
|
+
|
|
23
|
+
## Example
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
python cli.py news "Amex Gold" --json
|
|
27
|
+
python cli.py news "Chase Sapphire Reserve" --json
|
|
28
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fleece-partners
|
|
3
|
+
description: Transfer partners for a credit card's rewards program — airlines and hotels, transfer ratios, and timing. Use when asked about moving points or miles.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /fleece-partners
|
|
7
|
+
|
|
8
|
+
Fetches transfer partner details for a card's rewards currency.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- User asks what airlines or hotels they can transfer points to
|
|
12
|
+
- User wants to know transfer ratios or how long transfers take
|
|
13
|
+
- User is planning a specific redemption and needs partner details
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python cli.py partners "<card name>" --json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Example
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
python cli.py partners "Chase Sapphire Preferred" --json
|
|
25
|
+
python cli.py partners "Capital One Venture X" --json
|
|
26
|
+
python cli.py partners "Amex Platinum" --json
|
|
27
|
+
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fleece-rates
|
|
3
|
+
description: Earning rates for a credit card by spend category — points, miles, or cash back per dollar. Optionally filter to a specific category like dining or travel.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /fleece-rates
|
|
7
|
+
|
|
8
|
+
Looks up earning rates for a credit card, with optional category filtering.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- User asks how many points/miles/cash back a card earns
|
|
12
|
+
- User wants to know the best card for a specific spend category
|
|
13
|
+
- You need to compare multipliers across categories
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python cli.py rates "<card name>" --json
|
|
19
|
+
python cli.py rates "<card name>" --category "<category>" --json
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Categories: `dining`, `travel`, `groceries`, `gas`, `streaming`, `drugstores`, etc.
|
|
23
|
+
|
|
24
|
+
## Example
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
python cli.py rates "Chase Sapphire Preferred" --json
|
|
28
|
+
python cli.py rates "Amex Gold" --category dining --json
|
|
29
|
+
```
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fleece-recommend
|
|
3
|
+
description: Card recommendations matched to a spending profile and preferences. Use when the user asks for the best card for their situation without naming a specific card.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /fleece-recommend
|
|
7
|
+
|
|
8
|
+
Searches for best-match US credit cards for a given spending profile.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- User asks "what's the best card for me?"
|
|
12
|
+
- User describes their spending habits and wants recommendations
|
|
13
|
+
- User states a preference (no annual fee, travel perks, cash back, etc.)
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python cli.py recommend "<spending profile>" --json
|
|
19
|
+
python cli.py recommend "<spending profile>" --preferences "<extra preferences>" --json
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Keep the profile concise: categories + rough amounts or priorities.
|
|
23
|
+
|
|
24
|
+
## Example
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
python cli.py recommend "high dining and travel spend, $500/mo dining, $300/mo travel" --json
|
|
28
|
+
python cli.py recommend "everyday spending, mostly groceries and gas" --preferences "no annual fee" --json
|
|
29
|
+
python cli.py recommend "frequent international traveler" --preferences "priority pass lounge access" --json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
After receiving results, present 2–3 top recommendations with a brief rationale for each.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fleece-roi
|
|
3
|
+
description: First-year ROI estimate for a credit card given monthly spend on travel, dining, and other. Calculates welcome bonus value + earn + credits minus annual fee.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /fleece-roi
|
|
7
|
+
|
|
8
|
+
Estimates first-year return on investment for a card based on the user's spending.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- User asks if a card is worth it for them specifically
|
|
12
|
+
- User provides their spending habits and wants a value estimate
|
|
13
|
+
- User wants to compare first-year value across cards
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python cli.py roi "<card name>" --travel <monthly $> --dining <monthly $> --other <monthly $> --json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
All spend flags are optional and default to `0`. Omit any category the user didn't mention.
|
|
22
|
+
|
|
23
|
+
## Example
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
python cli.py roi "Chase Sapphire Preferred" --travel 500 --dining 300 --other 1000 --json
|
|
27
|
+
python cli.py roi "Amex Gold" --dining 800 --other 500 --json
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The result includes annual spend totals, an assumed cents-per-point value, and live research context.
|
|
31
|
+
Present the math clearly and note that exact welcome bonus amounts should be verified with the issuer.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fleece-wallet
|
|
3
|
+
description: Portfolio analysis for a set of cards the user holds — category coverage map, overlaps, gaps, and next-card suggestions. Use when asked how to maximize an existing wallet.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /fleece-wallet
|
|
7
|
+
|
|
8
|
+
Analyzes a multi-card portfolio and identifies optimization opportunities.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- User asks how many cards they have
|
|
12
|
+
- User lists their current cards and asks how to maximize
|
|
13
|
+
- User asks what category gaps exist in their wallet
|
|
14
|
+
- User asks which card to use for a specific purchase given what they hold
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
**If the user has a saved profile (most common)** — no args needed; the CLI auto-loads from `fleece.db`:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
python cli.py wallet
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**To pass cards explicitly:**
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
python cli.py wallet "Amex Platinum" "Chase Freedom Unlimited" "Bilt"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Agent-friendly JSON output:**
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
python cli.py wallet --json
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Cards can come from three sources (in priority order):
|
|
37
|
+
1. Arguments passed directly on the command line
|
|
38
|
+
2. `--from-profile` / `-p` flag (reads `user_cards.json`)
|
|
39
|
+
3. No args + saved profile exists → auto-loads from `fleece.db`
|
|
40
|
+
|
|
41
|
+
> **Do not query `fleece.db` directly with SQLite.** The CLI fetches live data via
|
|
42
|
+
> Brave Search and returns a richer analysis (category rates, transfer partners,
|
|
43
|
+
> recent benefit changes). Raw DB queries only give you stored card names and
|
|
44
|
+
> cannot surface live earning rates or gaps.
|
|
45
|
+
|
|
46
|
+
## Output
|
|
47
|
+
|
|
48
|
+
The result includes:
|
|
49
|
+
- **Category coverage map** — which card wins each spend category and at what rate
|
|
50
|
+
- **Overlaps** — redundant benefits across cards (e.g., two dining multipliers in different currencies)
|
|
51
|
+
- **Gaps** — categories earning only 1x with no bonus card
|
|
52
|
+
- **1–2 complementary card suggestions** to plug the biggest gaps
|
|
53
|
+
|
|
54
|
+
## Example
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Auto-load saved wallet (preferred)
|
|
58
|
+
python cli.py wallet
|
|
59
|
+
|
|
60
|
+
# Explicit cards
|
|
61
|
+
python cli.py wallet "Amex Gold" "Chase Sapphire Preferred" "Citi Double Cash"
|
|
62
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Python 3",
|
|
3
|
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
|
4
|
+
"image": "mcr.microsoft.com/devcontainers/python:1-3.11-bullseye",
|
|
5
|
+
"customizations": {
|
|
6
|
+
"codespaces": {
|
|
7
|
+
"openFiles": [
|
|
8
|
+
"README.md",
|
|
9
|
+
"fleece.py"
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"vscode": {
|
|
13
|
+
"settings": {},
|
|
14
|
+
"extensions": [
|
|
15
|
+
"ms-python.python",
|
|
16
|
+
"ms-python.vscode-pylance"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"updateContentCommand": "[ -f packages.txt ] && sudo apt update && sudo apt upgrade -y && sudo xargs apt install -y <packages.txt; [ -f requirements.txt ] && pip3 install --user -r requirements.txt; pip3 install --user streamlit; echo '✅ Packages installed and Requirements met'",
|
|
21
|
+
"postAttachCommand": {
|
|
22
|
+
"server": "streamlit run fleece.py --server.enableCORS false --server.enableXsrfProtection false"
|
|
23
|
+
},
|
|
24
|
+
"portsAttributes": {
|
|
25
|
+
"8501": {
|
|
26
|
+
"label": "Application",
|
|
27
|
+
"onAutoForward": "openPreview"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"forwardPorts": [
|
|
31
|
+
8501
|
|
32
|
+
]
|
|
33
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Deploy Databricks App
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
env:
|
|
9
|
+
DATABRICKS_HOST: ${{ secrets.DATABRICKS_HOST }}
|
|
10
|
+
DATABRICKS_TOKEN: ${{ secrets.DATABRICKS_TOKEN }}
|
|
11
|
+
APP_NAME: ${{ vars.DATABRICKS_APP_NAME || 'fleece' }}
|
|
12
|
+
WORKSPACE_USER: ${{ vars.DATABRICKS_WORKSPACE_USER }}
|
|
13
|
+
SOURCE_CODE_PATH: /Workspace/Users/${{ vars.DATABRICKS_WORKSPACE_USER }}/fleece
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
deploy:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout
|
|
20
|
+
uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Set up Python
|
|
23
|
+
uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.12"
|
|
26
|
+
|
|
27
|
+
- name: Install Databricks CLI
|
|
28
|
+
uses: databricks/setup-cli@main
|
|
29
|
+
|
|
30
|
+
- name: Sync source code to workspace
|
|
31
|
+
run: |
|
|
32
|
+
databricks sync . "$SOURCE_CODE_PATH" --exclude ".git"
|
|
33
|
+
|
|
34
|
+
- name: Create app if missing
|
|
35
|
+
run: |
|
|
36
|
+
databricks apps create "$APP_NAME" || true
|
|
37
|
+
|
|
38
|
+
- name: Deploy app
|
|
39
|
+
run: |
|
|
40
|
+
databricks apps deploy "$APP_NAME" --source-code-path "$SOURCE_CODE_PATH"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: "3.12"
|
|
17
|
+
|
|
18
|
+
- run: pip install build
|
|
19
|
+
|
|
20
|
+
- run: python -m build
|
|
21
|
+
|
|
22
|
+
- uses: actions/upload-artifact@v4
|
|
23
|
+
with:
|
|
24
|
+
name: dist
|
|
25
|
+
path: dist/
|
|
26
|
+
|
|
27
|
+
publish:
|
|
28
|
+
needs: build
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
environment: pypi
|
|
31
|
+
permissions:
|
|
32
|
+
id-token: write
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/download-artifact@v4
|
|
35
|
+
with:
|
|
36
|
+
name: dist
|
|
37
|
+
path: dist/
|
|
38
|
+
|
|
39
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
pip-wheel-metadata/
|
|
24
|
+
share/python-wheels/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.installed.cfg
|
|
27
|
+
*.egg
|
|
28
|
+
MANIFEST
|
|
29
|
+
|
|
30
|
+
# PyInstaller
|
|
31
|
+
# Usually these files are written by a python script from a template
|
|
32
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
33
|
+
*.manifest
|
|
34
|
+
*.spec
|
|
35
|
+
|
|
36
|
+
# Installer logs
|
|
37
|
+
pip-log.txt
|
|
38
|
+
pip-delete-this-directory.txt
|
|
39
|
+
|
|
40
|
+
# Unit test / coverage reports
|
|
41
|
+
htmlcov/
|
|
42
|
+
.tox/
|
|
43
|
+
.nox/
|
|
44
|
+
.coverage
|
|
45
|
+
.coverage.*
|
|
46
|
+
.cache
|
|
47
|
+
nosetests.xml
|
|
48
|
+
coverage.xml
|
|
49
|
+
*.cover
|
|
50
|
+
*.py,cover
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
target/
|
|
76
|
+
|
|
77
|
+
# Jupyter Notebook
|
|
78
|
+
.ipynb_checkpoints
|
|
79
|
+
|
|
80
|
+
# IPython
|
|
81
|
+
profile_default/
|
|
82
|
+
ipython_config.py
|
|
83
|
+
|
|
84
|
+
# pyenv
|
|
85
|
+
.python-version
|
|
86
|
+
|
|
87
|
+
# pipenv
|
|
88
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
89
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
90
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
91
|
+
# install all needed dependencies.
|
|
92
|
+
#Pipfile.lock
|
|
93
|
+
|
|
94
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
|
95
|
+
__pypackages__/
|
|
96
|
+
|
|
97
|
+
# Celery stuff
|
|
98
|
+
celerybeat-schedule
|
|
99
|
+
celerybeat.pid
|
|
100
|
+
|
|
101
|
+
# SageMath parsed files
|
|
102
|
+
*.sage.py
|
|
103
|
+
|
|
104
|
+
# Environments
|
|
105
|
+
.env
|
|
106
|
+
.venv
|
|
107
|
+
env/
|
|
108
|
+
venv/
|
|
109
|
+
ENV/
|
|
110
|
+
env.bak/
|
|
111
|
+
venv.bak/
|
|
112
|
+
|
|
113
|
+
# Spyder project settings
|
|
114
|
+
.spyderproject
|
|
115
|
+
.spyproject
|
|
116
|
+
|
|
117
|
+
# Rope project settings
|
|
118
|
+
.ropeproject
|
|
119
|
+
|
|
120
|
+
# mkdocs documentation
|
|
121
|
+
/site
|
|
122
|
+
|
|
123
|
+
# mypy
|
|
124
|
+
.mypy_cache/
|
|
125
|
+
.dmypy.json
|
|
126
|
+
dmypy.json
|
|
127
|
+
|
|
128
|
+
# Pyre type checker
|
|
129
|
+
.pyre/
|
|
130
|
+
|
|
131
|
+
.idea
|
|
132
|
+
.env
|
|
133
|
+
user_cards.json
|
|
134
|
+
user_cards.json.bak
|
|
135
|
+
fleece.db
|
|
136
|
+
|
|
137
|
+
user_cards.json
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
Advertiser Disclosure:
|
|
2
|
+
Some of the card links and other products that appear on this website are from companies which AskSebby will earn an affiliate commission or referral bonus. AskSebby is part of an affiliate sales network and receives compensation for sending traffic to partner sites, such as CreditCards.com. This compensation may impact how and where products appear on this site (including, for example, the order in which they appear). This site does not include all credit card companies or all available credit card offers.
|
|
3
|
+
|
|
4
|
+
Editorial Note:
|
|
5
|
+
Opinions expressed here are the author's alone, not those of any bank, credit card issuer, airlines or hotel chain, vendors or companies, and have not been reviewed, approved, or otherwise endorsed by any of these entities.
|