finch-cli 0.1.1__py3-none-any.whl

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.
@@ -0,0 +1,140 @@
1
+ Metadata-Version: 2.4
2
+ Name: finch-cli
3
+ Version: 0.1.1
4
+ Summary: Tailor your resume to any job posting from your terminal.
5
+ Project-URL: Homepage, https://applyfinch.com
6
+ Project-URL: Repository, https://github.com/applyEasy/finch-cli
7
+ Project-URL: Issues, https://github.com/applyEasy/finch-cli/issues
8
+ Author-email: Carlos Luna-Pena <carlunpen@gmail.com>
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: ai,career,cli,deepseek,internship,job-search,openai,resume,textual,tui
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: End Users/Desktop
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Utilities
21
+ Requires-Python: >=3.10
22
+ Requires-Dist: click>=8.1.0
23
+ Requires-Dist: httpx>=0.27.0
24
+ Requires-Dist: openai>=1.30.0
25
+ Requires-Dist: rich>=13.0.0
26
+ Requires-Dist: textual>=0.83.0
27
+ Requires-Dist: trafilatura>=1.12.0
28
+ Provides-Extra: dev
29
+ Requires-Dist: pytest>=7.0; extra == 'dev'
30
+ Requires-Dist: ruff>=0.5; extra == 'dev'
31
+ Description-Content-Type: text/markdown
32
+
33
+ # finch-cli
34
+
35
+ a terminal client for job hunting. browse fresh internship + new-grad postings, tailor your resume to any of them, see an ats-style match score with matched + missing keywords, keep a library of the tailored versions.
36
+
37
+ ![jobs tab](docs/tui-jobs.svg)
38
+
39
+ ![tailor tab with match panel](docs/tui-tailor.svg)
40
+
41
+ ## install
42
+
43
+ ```
44
+ pip install finch-cli
45
+ export DEEPSEEK_API_KEY=sk-...
46
+ finch ui
47
+ ```
48
+
49
+ deepseek keys are cheap (currently around $0.27 / 1M input tokens, ~30x cheaper than claude). get one at https://platform.deepseek.com/api_keys.
50
+
51
+ other providers work too. any openai-compatible chat-completions endpoint: openai, together, groq, fireworks. pass `--base-url` and the matching `--api-key`, or set `FINCH_BASE_URL` and `OPENAI_API_KEY`. the same `finch_cli/tailor.py` runs against all of them.
52
+
53
+ ## what it does
54
+
55
+ three tabs, one keyboard.
56
+
57
+ **jobs** pulls the simplifyjobs internship and new-grad lists (the same two feeds the finch backend mirrors). 3000+ active postings, filterable by query, source, term. press T on a row, the job loads into the tailor tab pre-filled.
58
+
59
+ **library** is the list of tailored resumes you've saved. Markdown preview on the right.
60
+
61
+ **tailor** is the three-pane editor: base resume / job posting / tailored output. claude rewrites bullets and ordering to fit the posting. won't invent skills you don't have. a match-analysis panel at the bottom shows an ats-style score, which job keywords your resume covers, which ones it doesn't, and how much the tailored version moved the needle vs the base.
62
+
63
+ ## install (pure cli, no tui)
64
+
65
+ ```
66
+ finch tailor --resume resume.md --job https://jobs.example.com/swe-intern -o tailored.md
67
+ ```
68
+
69
+ if the job site is js-heavy (workday, some greenhouse iframes), the fetch fails clean and tells you to use `--job-file` with a pasted description:
70
+
71
+ ```
72
+ finch tailor -r resume.md --job-file pasted.txt -o tailored.md
73
+ ```
74
+
75
+ ## tui keys
76
+
77
+ | key | action |
78
+ |---|---|
79
+ | `1` / `2` / `3` | jump to jobs / library / tailor |
80
+ | `Ctrl+T` | tailor; on jobs tab loads the selected job first |
81
+ | `Ctrl+U` | paste a job url, fetches it into the tailor pane |
82
+ | `Ctrl+O` | open a resume file |
83
+ | `Ctrl+R` | refetch the job feeds |
84
+ | `Ctrl+L` | save the tailored output to the library |
85
+ | `Ctrl+S` | save the tailored output to a file |
86
+ | `Ctrl+D` | load the bundled demo |
87
+ | `Ctrl+Q` | quit |
88
+
89
+ filter inputs at the top of the jobs tab are live; type and the table updates.
90
+
91
+ ## cli flags
92
+
93
+ `finch tailor`
94
+
95
+ | flag | what |
96
+ |---|---|
97
+ | `-r, --resume PATH` | base resume in markdown or plain text (required) |
98
+ | `-j, --job URL` | job posting url |
99
+ | `--job-file PATH` | local file with the job description (use if `--job` won't extract) |
100
+ | `-o, --out PATH` | save tailored resume here, else stdout |
101
+ | `--model NAME` | model name (default `deepseek-chat`) |
102
+ | `--api-key KEY` | override `$DEEPSEEK_API_KEY` / `$FINCH_API_KEY` / `$OPENAI_API_KEY` |
103
+ | `--base-url URL` | override openai-compatible base url (default `https://api.deepseek.com`) |
104
+
105
+ `finch ui`
106
+
107
+ | flag | what |
108
+ |---|---|
109
+ | `--demo` | preload the bundled example into the tailor tab |
110
+ | `--model NAME` | model name |
111
+
112
+ ## where stuff lives
113
+
114
+ | | path |
115
+ |---|---|
116
+ | job feed cache (~6h ttl) | `~/.cache/finch-cli/{intern,newgrad}.json` |
117
+ | saved tailored resumes | `~/.local/share/finch-cli/resumes/` |
118
+ | bundled example resume + job | `examples/` in the repo |
119
+
120
+ ## why a cli
121
+
122
+ most of these tools are saas you have to sign up for. this is the opposite. install, run, the only thing leaving your machine is the llm call you control.
123
+
124
+ the autofill side - the part that actually fills out the application form - lives in the web app at applyfinch.com, free during beta.
125
+
126
+ ## known limits
127
+
128
+ - workday and some greenhouse iframe pages need js. the fetch fails clean and tells you to use `--job-file`.
129
+ - tailored output is markdown. pipe to pandoc for pdf, or paste into overleaf if you have a tex template.
130
+ - the model won't invent skills. if the base resume is thin, the tailored version is thin. fix the base first.
131
+
132
+ ## roadmap
133
+
134
+ - a built-in pdf renderer (drop the pandoc step)
135
+ - `finch apply` to autofill the application after tailoring, same engine as the web app
136
+ - optional sign-in to view your real applyfinch.com pipeline from the terminal
137
+
138
+ ## license
139
+
140
+ mit.
@@ -0,0 +1,17 @@
1
+ finch_cli/__init__.py,sha256=E-x2HVj5IgHjl7rO8-rwK4I2acfakiBACbl2yOFAahQ,99
2
+ finch_cli/__main__.py,sha256=MSmt_5Xg84uHqzTN38JwgseJK8rsJn_11A8WD99VtEo,61
3
+ finch_cli/cli.py,sha256=-ajh5D-zAjaWedxxO2i6nt57q4J2paSEPiX5-aNB4Yg,4490
4
+ finch_cli/fetch.py,sha256=2CgVHR2X-IYLSOwDbjjUJX-pUmnSnaQkec4WMoz5KU8,4663
5
+ finch_cli/jobs.py,sha256=qyb7ws7VylQASFN46M8vDCqZLCyHqc6RtdiWmrYAZDc,5236
6
+ finch_cli/output.py,sha256=43SjShhWQH2Z6oy9-8Mh01GBGf4oFWQ5log3SUEv4qM,531
7
+ finch_cli/score.py,sha256=PyGsdBrVlh2pbaOiJFb-3bVkI1CLPQ1k7Nf4w1Ax5Uk,7305
8
+ finch_cli/storage.py,sha256=1wVd2rwb7AY3Je8Mukl7wxsrRhpOfCXzWsKrqhYpkF4,2093
9
+ finch_cli/tailor.py,sha256=NjYENE2HXsoWto7Nzx0PbcFBvUih6qeoVLXjNzFAH74,5250
10
+ finch_cli/tui.py,sha256=LqIL-oO0do3Yr5qQIow_OARd0E8qXW4q0L_OXWfiO3E,31199
11
+ finch_cli/_data/base_resume.md,sha256=A2GF5jAARdOMC5sFXcftnFalUd-SL1qohjp18wr3-HU,1332
12
+ finch_cli/_data/job_post.txt,sha256=X_77NokuMNic8uksLb7BuRVBDa5WKwqphewe_gAOZXM,1488
13
+ finch_cli-0.1.1.dist-info/METADATA,sha256=Q8d4J73d76wOQgHsOiwcHmrVdZ8v0yWn6JUmYD43ORM,5491
14
+ finch_cli-0.1.1.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
15
+ finch_cli-0.1.1.dist-info/entry_points.txt,sha256=Jn4gSrMQg7KLH6iYWbEQcVLb40Lcl1I-_T361pEf9jk,45
16
+ finch_cli-0.1.1.dist-info/licenses/LICENSE,sha256=2Uiebzp_T4KjsLIPoTKBYa5wfITaCR-Bo5BND05DH14,1073
17
+ finch_cli-0.1.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ finch = finch_cli.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Carlos Luna-Pena
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.