launchline 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.
- launchline-0.1.0/.generated-go-semantic-release-changelog.md +46 -0
- launchline-0.1.0/.github/workflows/ci.yml +40 -0
- launchline-0.1.0/.github/workflows/release.yml +66 -0
- launchline-0.1.0/.gitignore +259 -0
- launchline-0.1.0/.markdownlint.json +4 -0
- launchline-0.1.0/.python-version +1 -0
- launchline-0.1.0/.semrel/linux_amd64/changelog-generator-default/1.15.0/changelog-generator-default_v1.15.0_linux_amd64 +0 -0
- launchline-0.1.0/.semrel/linux_amd64/commit-analyzer-default/1.15.0/commit-analyzer-cz_v1.15.0_linux_amd64 +0 -0
- launchline-0.1.0/.semrel/linux_amd64/condition-github/1.11.0/condition-github_v1.11.0_linux_amd64 +0 -0
- launchline-0.1.0/.semrel/linux_amd64/files-updater-npm/1.11.0/files-updater-npm_v1.11.0_linux_amd64 +0 -0
- launchline-0.1.0/.semrel/linux_amd64/provider-github/1.19.0/provider-github_v1.19.0_linux_amd64 +0 -0
- launchline-0.1.0/CHANGELOG.md +25 -0
- launchline-0.1.0/LICENSE +21 -0
- launchline-0.1.0/PKG-INFO +215 -0
- launchline-0.1.0/README.md +193 -0
- launchline-0.1.0/assets/launchline.ico +0 -0
- launchline-0.1.0/assets/launchline.png +0 -0
- launchline-0.1.0/assets/launchline.svg +10 -0
- launchline-0.1.0/docs/images/demo.gif +0 -0
- launchline-0.1.0/docs/images/hero.png +0 -0
- launchline-0.1.0/docs/images/navigate.png +0 -0
- launchline-0.1.0/docs/images/search.png +0 -0
- launchline-0.1.0/pyproject.toml +104 -0
- launchline-0.1.0/src/launchline/__init__.py +3 -0
- launchline-0.1.0/src/launchline/__main__.py +104 -0
- launchline-0.1.0/src/launchline/assets/launchline.ico +0 -0
- launchline-0.1.0/src/launchline/cli.py +70 -0
- launchline-0.1.0/src/launchline/config.py +257 -0
- launchline-0.1.0/src/launchline/exceptions.py +39 -0
- launchline-0.1.0/src/launchline/fuzzy.py +59 -0
- launchline-0.1.0/src/launchline/keys.py +319 -0
- launchline-0.1.0/src/launchline/runner.py +100 -0
- launchline-0.1.0/src/launchline/ui.py +699 -0
- launchline-0.1.0/tests/__init__.py +3 -0
- launchline-0.1.0/tests/conftest.py +62 -0
- launchline-0.1.0/tests/test_cli.py +110 -0
- launchline-0.1.0/tests/test_config.py +263 -0
- launchline-0.1.0/tests/test_cross_platform.py +495 -0
- launchline-0.1.0/tests/test_runner.py +156 -0
- launchline-0.1.0/tests/test_ui.py +929 -0
- launchline-0.1.0/tools/generate_icon.py +119 -0
- launchline-0.1.0/tools/generate_screenshots.py +538 -0
- launchline-0.1.0/uv.lock +427 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
## 0.1.0 (2026-03-30)
|
|
2
|
+
|
|
3
|
+
#### Feature
|
|
4
|
+
|
|
5
|
+
* replace entry icon with title_prefix and bundle icon in package (10583207)
|
|
6
|
+
* add icon assets, entry icon config, fix URLs and changelog (b29358bb)
|
|
7
|
+
* enable ghost_text by default, restore original screenshots (470ff45e)
|
|
8
|
+
* add ghost_text and instant_numeric_launch feature flags, cross-platform classifier (b1d412c4)
|
|
9
|
+
* initial LaunchLine implementation (df1e8602)
|
|
10
|
+
|
|
11
|
+
#### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* sync icon generator gray color with latest SVG (#94A3B8) (1aae2dc7)
|
|
14
|
+
* regenerate icons with proper rendering, add generate_icon tool (4e3410b1)
|
|
15
|
+
* make tests and mypy cross-platform for Linux CI (cd5accfa)
|
|
16
|
+
|
|
17
|
+
#### Documentation
|
|
18
|
+
|
|
19
|
+
* add screenshot/GIF generation tool and README images (4bc81d70)
|
|
20
|
+
* fix markdown table alignment for MD060 (59b5ab59)
|
|
21
|
+
* update AI disclaimer to info block with simplified text (89de06d1)
|
|
22
|
+
* add workflow status badges to README (ff5890e0)
|
|
23
|
+
* add AI-generated project disclaimer to README (49ba23c6)
|
|
24
|
+
|
|
25
|
+
#### Tests
|
|
26
|
+
|
|
27
|
+
* add CLI and cross-platform tests, improve suite quality (3dc2fd6e)
|
|
28
|
+
|
|
29
|
+
#### Code Refactoring
|
|
30
|
+
|
|
31
|
+
* remove title_prefix feature from entry configuration (b2fcce7b)
|
|
32
|
+
* rename instant_numeric_launch to numeric_trigger, reorder settings (898cf209)
|
|
33
|
+
* improve source documentation and organize code into classes (8dedef8c)
|
|
34
|
+
|
|
35
|
+
#### Chores
|
|
36
|
+
|
|
37
|
+
* set v0.1.0 release date (a70d982b)
|
|
38
|
+
* add pytest-cov and enforce 85% coverage threshold (dc5616b5)
|
|
39
|
+
* add PyPI publish job to release workflow (92df1a40)
|
|
40
|
+
* add MIT license (1cc39ec2)
|
|
41
|
+
|
|
42
|
+
#### Build
|
|
43
|
+
|
|
44
|
+
* consolidate release into single workflow with dry-run safety (22314e02)
|
|
45
|
+
* switch to hatch-vcs for dynamic version from git tags (f03de3d3)
|
|
46
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
lint:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- uses: astral-sh/setup-uv@v6
|
|
18
|
+
- run: uv sync --group dev
|
|
19
|
+
- run: uv run ruff check .
|
|
20
|
+
- run: uv run ruff format --check .
|
|
21
|
+
- run: uv run mypy src
|
|
22
|
+
|
|
23
|
+
test:
|
|
24
|
+
runs-on: ${{ matrix.os }}
|
|
25
|
+
strategy:
|
|
26
|
+
matrix:
|
|
27
|
+
os: [ubuntu-latest, windows-latest]
|
|
28
|
+
python-version: ["3.12", "3.13"]
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v4
|
|
31
|
+
- uses: astral-sh/setup-uv@v6
|
|
32
|
+
- run: uv python install ${{ matrix.python-version }}
|
|
33
|
+
- run: uv sync --group dev --python ${{ matrix.python-version }}
|
|
34
|
+
- run: uv run pytest
|
|
35
|
+
|
|
36
|
+
markdown:
|
|
37
|
+
runs-on: ubuntu-latest
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v4
|
|
40
|
+
- uses: DavidAnson/markdownlint-cli2-action@v20
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
|
|
6
|
+
permissions:
|
|
7
|
+
contents: write
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
release:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
with:
|
|
15
|
+
fetch-depth: 0
|
|
16
|
+
|
|
17
|
+
- name: Determine next version
|
|
18
|
+
id: semrel
|
|
19
|
+
uses: go-semantic-release/action@v1
|
|
20
|
+
with:
|
|
21
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
22
|
+
allow-initial-development-versions: true
|
|
23
|
+
dry: true
|
|
24
|
+
|
|
25
|
+
- name: Require new version
|
|
26
|
+
if: steps.semrel.outputs.version == ''
|
|
27
|
+
run: |
|
|
28
|
+
echo "::error::No new version to release. Ensure there are unreleased commits with conventional commit messages."
|
|
29
|
+
exit 1
|
|
30
|
+
|
|
31
|
+
- name: Create local tag
|
|
32
|
+
run: git tag "v${{ steps.semrel.outputs.version }}"
|
|
33
|
+
|
|
34
|
+
- uses: astral-sh/setup-uv@v6
|
|
35
|
+
- run: uv sync --group dev
|
|
36
|
+
- run: uv run pytest
|
|
37
|
+
- run: uv build
|
|
38
|
+
|
|
39
|
+
- uses: actions/upload-artifact@v4
|
|
40
|
+
with:
|
|
41
|
+
name: dist
|
|
42
|
+
path: dist/
|
|
43
|
+
|
|
44
|
+
- name: Push tag
|
|
45
|
+
run: git push origin "v${{ steps.semrel.outputs.version }}"
|
|
46
|
+
|
|
47
|
+
- name: Create GitHub Release
|
|
48
|
+
uses: softprops/action-gh-release@v2
|
|
49
|
+
with:
|
|
50
|
+
tag_name: "v${{ steps.semrel.outputs.version }}"
|
|
51
|
+
generate_release_notes: true
|
|
52
|
+
files: dist/*
|
|
53
|
+
|
|
54
|
+
pypi:
|
|
55
|
+
needs: release
|
|
56
|
+
runs-on: ubuntu-latest
|
|
57
|
+
environment: pypi
|
|
58
|
+
permissions:
|
|
59
|
+
id-token: write
|
|
60
|
+
steps:
|
|
61
|
+
- uses: actions/download-artifact@v4
|
|
62
|
+
with:
|
|
63
|
+
name: dist
|
|
64
|
+
path: dist/
|
|
65
|
+
|
|
66
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
### Base Template
|
|
2
|
+
# This template covers universal patterns only. Language and framework-specific
|
|
3
|
+
# patterns should be appended to this template based on specific project needs:
|
|
4
|
+
# https://github.com/github/gitignore
|
|
5
|
+
|
|
6
|
+
# Agent and Developer Temporary Files
|
|
7
|
+
.tmp/
|
|
8
|
+
|
|
9
|
+
# Environment and Secrets
|
|
10
|
+
.env
|
|
11
|
+
.env.*
|
|
12
|
+
!.env.example
|
|
13
|
+
|
|
14
|
+
# OS-Generated Files
|
|
15
|
+
Thumbs.db
|
|
16
|
+
Desktop.ini
|
|
17
|
+
.DS_Store
|
|
18
|
+
._*
|
|
19
|
+
|
|
20
|
+
# Editor and IDE
|
|
21
|
+
*.swp
|
|
22
|
+
*.swo
|
|
23
|
+
*~
|
|
24
|
+
.idea/
|
|
25
|
+
*.iml
|
|
26
|
+
.vscode/*
|
|
27
|
+
!.vscode/settings.json
|
|
28
|
+
!.vscode/tasks.json
|
|
29
|
+
!.vscode/launch.json
|
|
30
|
+
!.vscode/extensions.json
|
|
31
|
+
*.code-workspace
|
|
32
|
+
|
|
33
|
+
# Build Artifacts
|
|
34
|
+
dist/
|
|
35
|
+
build/
|
|
36
|
+
out/
|
|
37
|
+
|
|
38
|
+
### Python Template
|
|
39
|
+
# Byte-compiled / optimized / DLL files
|
|
40
|
+
__pycache__/
|
|
41
|
+
*.py[codz]
|
|
42
|
+
*$py.class
|
|
43
|
+
|
|
44
|
+
# C extensions
|
|
45
|
+
*.so
|
|
46
|
+
|
|
47
|
+
# Distribution / packaging
|
|
48
|
+
.Python
|
|
49
|
+
build/
|
|
50
|
+
develop-eggs/
|
|
51
|
+
dist/
|
|
52
|
+
downloads/
|
|
53
|
+
eggs/
|
|
54
|
+
.eggs/
|
|
55
|
+
lib/
|
|
56
|
+
lib64/
|
|
57
|
+
parts/
|
|
58
|
+
sdist/
|
|
59
|
+
var/
|
|
60
|
+
wheels/
|
|
61
|
+
share/python-wheels/
|
|
62
|
+
*.egg-info/
|
|
63
|
+
.installed.cfg
|
|
64
|
+
*.egg
|
|
65
|
+
MANIFEST
|
|
66
|
+
|
|
67
|
+
# PyInstaller
|
|
68
|
+
# Usually these files are written by a python script from a template
|
|
69
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
70
|
+
*.manifest
|
|
71
|
+
*.spec
|
|
72
|
+
|
|
73
|
+
# Installer logs
|
|
74
|
+
pip-log.txt
|
|
75
|
+
pip-delete-this-directory.txt
|
|
76
|
+
|
|
77
|
+
# Unit test / coverage reports
|
|
78
|
+
htmlcov/
|
|
79
|
+
.tox/
|
|
80
|
+
.nox/
|
|
81
|
+
.coverage
|
|
82
|
+
.coverage.*
|
|
83
|
+
.cache
|
|
84
|
+
nosetests.xml
|
|
85
|
+
coverage.xml
|
|
86
|
+
*.cover
|
|
87
|
+
*.py.cover
|
|
88
|
+
.hypothesis/
|
|
89
|
+
.pytest_cache/
|
|
90
|
+
cover/
|
|
91
|
+
|
|
92
|
+
# Translations
|
|
93
|
+
*.mo
|
|
94
|
+
*.pot
|
|
95
|
+
|
|
96
|
+
# Django stuff:
|
|
97
|
+
*.log
|
|
98
|
+
local_settings.py
|
|
99
|
+
db.sqlite3
|
|
100
|
+
db.sqlite3-journal
|
|
101
|
+
|
|
102
|
+
# Flask stuff:
|
|
103
|
+
instance/
|
|
104
|
+
.webassets-cache
|
|
105
|
+
|
|
106
|
+
# Scrapy stuff:
|
|
107
|
+
.scrapy
|
|
108
|
+
|
|
109
|
+
# Sphinx documentation
|
|
110
|
+
docs/_build/
|
|
111
|
+
|
|
112
|
+
# PyBuilder
|
|
113
|
+
.pybuilder/
|
|
114
|
+
target/
|
|
115
|
+
|
|
116
|
+
# Jupyter Notebook
|
|
117
|
+
.ipynb_checkpoints
|
|
118
|
+
|
|
119
|
+
# IPython
|
|
120
|
+
profile_default/
|
|
121
|
+
ipython_config.py
|
|
122
|
+
|
|
123
|
+
# pyenv
|
|
124
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
125
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
126
|
+
# .python-version
|
|
127
|
+
|
|
128
|
+
# pipenv
|
|
129
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
130
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
131
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
132
|
+
# install all needed dependencies.
|
|
133
|
+
# Pipfile.lock
|
|
134
|
+
|
|
135
|
+
# UV
|
|
136
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
137
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
138
|
+
# commonly ignored for libraries.
|
|
139
|
+
# uv.lock
|
|
140
|
+
|
|
141
|
+
# poetry
|
|
142
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
143
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
144
|
+
# commonly ignored for libraries.
|
|
145
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
146
|
+
# poetry.lock
|
|
147
|
+
# poetry.toml
|
|
148
|
+
|
|
149
|
+
# pdm
|
|
150
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
151
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
152
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
153
|
+
# pdm.lock
|
|
154
|
+
# pdm.toml
|
|
155
|
+
.pdm-python
|
|
156
|
+
.pdm-build/
|
|
157
|
+
|
|
158
|
+
# pixi
|
|
159
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
160
|
+
# pixi.lock
|
|
161
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
162
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
163
|
+
.pixi
|
|
164
|
+
|
|
165
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
166
|
+
__pypackages__/
|
|
167
|
+
|
|
168
|
+
# Celery stuff
|
|
169
|
+
celerybeat-schedule
|
|
170
|
+
celerybeat.pid
|
|
171
|
+
|
|
172
|
+
# Redis
|
|
173
|
+
*.rdb
|
|
174
|
+
*.aof
|
|
175
|
+
*.pid
|
|
176
|
+
|
|
177
|
+
# RabbitMQ
|
|
178
|
+
mnesia/
|
|
179
|
+
rabbitmq/
|
|
180
|
+
rabbitmq-data/
|
|
181
|
+
|
|
182
|
+
# ActiveMQ
|
|
183
|
+
activemq-data/
|
|
184
|
+
|
|
185
|
+
# SageMath parsed files
|
|
186
|
+
*.sage.py
|
|
187
|
+
|
|
188
|
+
# Environments
|
|
189
|
+
.env
|
|
190
|
+
.envrc
|
|
191
|
+
.venv
|
|
192
|
+
env/
|
|
193
|
+
venv/
|
|
194
|
+
ENV/
|
|
195
|
+
env.bak/
|
|
196
|
+
venv.bak/
|
|
197
|
+
|
|
198
|
+
# Spyder project settings
|
|
199
|
+
.spyderproject
|
|
200
|
+
.spyproject
|
|
201
|
+
|
|
202
|
+
# Rope project settings
|
|
203
|
+
.ropeproject
|
|
204
|
+
|
|
205
|
+
# mkdocs documentation
|
|
206
|
+
/site
|
|
207
|
+
|
|
208
|
+
# mypy
|
|
209
|
+
.mypy_cache/
|
|
210
|
+
.dmypy.json
|
|
211
|
+
dmypy.json
|
|
212
|
+
|
|
213
|
+
# Pyre type checker
|
|
214
|
+
.pyre/
|
|
215
|
+
|
|
216
|
+
# pytype static type analyzer
|
|
217
|
+
.pytype/
|
|
218
|
+
|
|
219
|
+
# Cython debug symbols
|
|
220
|
+
cython_debug/
|
|
221
|
+
|
|
222
|
+
# PyCharm
|
|
223
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
224
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
225
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
226
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
227
|
+
# .idea/
|
|
228
|
+
|
|
229
|
+
# Abstra
|
|
230
|
+
# Abstra is an AI-powered process automation framework.
|
|
231
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
232
|
+
# Learn more at https://abstra.io/docs
|
|
233
|
+
.abstra/
|
|
234
|
+
|
|
235
|
+
# Visual Studio Code
|
|
236
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
237
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
238
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
239
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
240
|
+
# .vscode/
|
|
241
|
+
|
|
242
|
+
# Ruff stuff:
|
|
243
|
+
.ruff_cache/
|
|
244
|
+
|
|
245
|
+
# PyPI configuration file
|
|
246
|
+
.pypirc
|
|
247
|
+
|
|
248
|
+
# Marimo
|
|
249
|
+
marimo/_static/
|
|
250
|
+
marimo/_lsp/
|
|
251
|
+
__marimo__/
|
|
252
|
+
|
|
253
|
+
# Streamlit
|
|
254
|
+
.streamlit/secrets.toml
|
|
255
|
+
|
|
256
|
+
### Project-Specific Rules
|
|
257
|
+
|
|
258
|
+
# hatch-vcs generated version file
|
|
259
|
+
src/launchline/_version.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
Binary file
|
|
Binary file
|
launchline-0.1.0/.semrel/linux_amd64/condition-github/1.11.0/condition-github_v1.11.0_linux_amd64
ADDED
|
Binary file
|
launchline-0.1.0/.semrel/linux_amd64/files-updater-npm/1.11.0/files-updater-npm_v1.11.0_linux_amd64
ADDED
|
Binary file
|
launchline-0.1.0/.semrel/linux_amd64/provider-github/1.19.0/provider-github_v1.19.0_linux_amd64
ADDED
|
Binary file
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.1.0] - 2026-03-30
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Interactive TUI launcher with numbered shortcuts and fuzzy search
|
|
13
|
+
- TOML configuration with `[settings]` and `[[entries]]` tables
|
|
14
|
+
- Per-entry environment variables and working directory support
|
|
15
|
+
- Configurable on-exit behavior: restart loop or exit
|
|
16
|
+
- Auto-generated starter config on first run
|
|
17
|
+
- Configurable `show_exit` setting to show/hide Exit entry
|
|
18
|
+
- Windows Terminal integration support
|
|
19
|
+
- Kitty keyboard protocol support
|
|
20
|
+
- `ghost_text` feature flag for autocomplete hints on the prompt line
|
|
21
|
+
- `numeric_trigger` feature flag for immediate digit-key launching
|
|
22
|
+
- Bundled icon accessible via `launchline --icon-path` for Windows Terminal profiles
|
|
23
|
+
- Cross-platform support (Windows, macOS, Linux)
|
|
24
|
+
- LaunchLine icon (SVG, ICO, PNG) in `assets/`
|
|
25
|
+
- PyPI publishing via GitHub Actions with OIDC trusted publishers
|
launchline-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Mike Hill
|
|
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.
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: launchline
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A lightweight terminal launcher for interactive CLI tools.
|
|
5
|
+
Project-URL: Homepage, https://github.com/mikejhill/launchline
|
|
6
|
+
Project-URL: Repository, https://github.com/mikejhill/launchline
|
|
7
|
+
Project-URL: Issues, https://github.com/mikejhill/launchline/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/mikejhill/launchline/blob/main/CHANGELOG.md
|
|
9
|
+
Author: Mike Hill
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: cli,launcher,menu,terminal
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Utilities
|
|
20
|
+
Requires-Python: >=3.12
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
23
|
+
# LaunchLine
|
|
24
|
+
|
|
25
|
+
[](https://github.com/mikejhill/launchline/actions/workflows/ci.yml)
|
|
26
|
+
[](https://github.com/mikejhill/launchline/actions/workflows/release.yml)
|
|
27
|
+
|
|
28
|
+
A lightweight terminal launcher for interactive CLI tools. Define your frequently
|
|
29
|
+
used commands in a TOML config file, then pick them from a fuzzy-searchable menu
|
|
30
|
+
instead of remembering flags and paths.
|
|
31
|
+
|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
## Why
|
|
35
|
+
|
|
36
|
+
Switching between CLI tools — AI assistants, shells, dev utilities — means
|
|
37
|
+
remembering commands, flags, working directories, and environment variables.
|
|
38
|
+
LaunchLine puts them all in one menu so you press a number or type a few letters
|
|
39
|
+
instead.
|
|
40
|
+
|
|
41
|
+
## Features
|
|
42
|
+
|
|
43
|
+
- **Fuzzy search** — type any substring to narrow the list instantly
|
|
44
|
+
- **Numbered shortcuts** — press a digit to launch directly
|
|
45
|
+
- **Per-entry environment and working directory** — set once, forget forever
|
|
46
|
+
- **Auto-restart or exit** — configurable behavior after a tool exits
|
|
47
|
+
- **Zero runtime dependencies** — pure Python 3.12+, nothing to install beyond itself
|
|
48
|
+
- **Auto-generated starter config** — creates `~/.config/launchline/config.toml`
|
|
49
|
+
on first run if no config exists
|
|
50
|
+
|
|
51
|
+
| Fuzzy search | Arrow-key navigation |
|
|
52
|
+
| :-------------------------------: | :-----------------------------------: |
|
|
53
|
+
|  |  |
|
|
54
|
+
|
|
55
|
+
## Installation
|
|
56
|
+
|
|
57
|
+
### From PyPI (recommended)
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
uv tool install launchline
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Or with pip:
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
pip install launchline
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### From source
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
git clone https://github.com/mikejhill/launchline.git
|
|
73
|
+
cd launchline
|
|
74
|
+
uv tool install .
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Run without installing
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
git clone https://github.com/mikejhill/launchline.git
|
|
81
|
+
cd launchline
|
|
82
|
+
uv sync --group dev
|
|
83
|
+
uv run launchline
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Quick Start
|
|
87
|
+
|
|
88
|
+
1. Run `launchline`. If no config exists, a starter config is created at
|
|
89
|
+
`~/.config/launchline/config.toml`.
|
|
90
|
+
2. Edit the config to add your tools.
|
|
91
|
+
3. Run `launchline` again.
|
|
92
|
+
|
|
93
|
+
Override the config path:
|
|
94
|
+
|
|
95
|
+
```sh
|
|
96
|
+
# CLI flag (highest priority)
|
|
97
|
+
launchline --config ~/my-config.toml
|
|
98
|
+
|
|
99
|
+
# Environment variable
|
|
100
|
+
export LAUNCHLINE_CONFIG=~/my-config.toml
|
|
101
|
+
launchline
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Resolution order: `--config` flag > `LAUNCHLINE_CONFIG` env var > default path.
|
|
105
|
+
|
|
106
|
+
## Configuration Reference
|
|
107
|
+
|
|
108
|
+
Config file format is [TOML](https://toml.io). The file has an optional
|
|
109
|
+
`[settings]` table and one or more `[[entries]]` tables.
|
|
110
|
+
|
|
111
|
+
### `[settings]`
|
|
112
|
+
|
|
113
|
+
| Key | Type | Default | Description |
|
|
114
|
+
| ----------------- | ------ | -------------- | ----------------------------------------------------------------- |
|
|
115
|
+
| `title` | string | `"LaunchLine"` | Window/tab title shown while the launcher is active |
|
|
116
|
+
| `on_exit` | string | `"restart"` | Behavior after a launched tool exits: `restart` or `exit` |
|
|
117
|
+
| `show_exit` | bool | `true` | Show the **Exit** entry (shortcut `0`) in the menu |
|
|
118
|
+
| `clear_on_launch` | bool | `true` | Clear terminal before launching an entry |
|
|
119
|
+
| `ghost_text` | bool | `true` | Show the highlighted entry name as an autocomplete hint on prompt |
|
|
120
|
+
| `numeric_trigger` | bool | `true` | Pressing a digit immediately launches the matching entry |
|
|
121
|
+
|
|
122
|
+
### `[[entries]]`
|
|
123
|
+
|
|
124
|
+
Each `[[entries]]` table defines one launchable tool:
|
|
125
|
+
|
|
126
|
+
| Key | Type | Required | Default | Description |
|
|
127
|
+
| ------------------- | --------------- | -------- | ------- | -------------------------------------------------------------- |
|
|
128
|
+
| `name` | string | yes | — | Display name shown in the menu |
|
|
129
|
+
| `command` | string | yes | — | Executable to run |
|
|
130
|
+
| `args` | list of strings | no | `[]` | Arguments passed to the command |
|
|
131
|
+
| `description` | string | no | `""` | Short description shown next to the name |
|
|
132
|
+
| `working_directory` | string | no | — | Working directory for the subprocess |
|
|
133
|
+
| `env` | table | no | `{}` | Extra environment variables (`KEY = "value"`) |
|
|
134
|
+
|
|
135
|
+
### Validation Rules
|
|
136
|
+
|
|
137
|
+
- At least one `[[entries]]` table is required.
|
|
138
|
+
- Every entry must have both `name` and `command`.
|
|
139
|
+
- `on_exit` must be `"restart"` or `"exit"`.
|
|
140
|
+
- `args` must be a list (not a bare string).
|
|
141
|
+
- `env` must be a TOML table (not a string or list).
|
|
142
|
+
- If `working_directory` does not exist at load time, it is silently reset to
|
|
143
|
+
`None` (a warning is logged).
|
|
144
|
+
|
|
145
|
+
### Example Config
|
|
146
|
+
|
|
147
|
+
```toml
|
|
148
|
+
[settings]
|
|
149
|
+
title = "My Tools"
|
|
150
|
+
on_exit = "restart"
|
|
151
|
+
show_exit = true
|
|
152
|
+
clear_on_launch = true
|
|
153
|
+
ghost_text = true
|
|
154
|
+
numeric_trigger = true
|
|
155
|
+
|
|
156
|
+
[[entries]]
|
|
157
|
+
name = "GitHub Copilot CLI"
|
|
158
|
+
command = "copilot"
|
|
159
|
+
|
|
160
|
+
[[entries]]
|
|
161
|
+
name = "Claude Code"
|
|
162
|
+
command = "claude"
|
|
163
|
+
description = "Anthropic coding agent"
|
|
164
|
+
working_directory = "~/projects"
|
|
165
|
+
|
|
166
|
+
[[entries]]
|
|
167
|
+
name = "PowerShell"
|
|
168
|
+
command = "pwsh"
|
|
169
|
+
args = ["-NoProfile"]
|
|
170
|
+
env = { TERM = "xterm-256color" }
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Usage
|
|
174
|
+
|
|
175
|
+
| Key | Action |
|
|
176
|
+
| ------------- | ----------------------------------------- |
|
|
177
|
+
| `1`–`9` | Launch entry by number |
|
|
178
|
+
| `0` | Exit (when `show_exit` is enabled) |
|
|
179
|
+
| Type any text | Fuzzy-filter the entry list |
|
|
180
|
+
| `Up` / `Down` | Move highlight |
|
|
181
|
+
| `Enter` | Launch highlighted entry |
|
|
182
|
+
| `Escape` | Clear filter (or exit if filter is empty) |
|
|
183
|
+
| `Backspace` | Delete last character from filter |
|
|
184
|
+
| `Ctrl+U` | Clear filter |
|
|
185
|
+
|
|
186
|
+
## Windows Terminal Integration
|
|
187
|
+
|
|
188
|
+
Add LaunchLine as a Windows Terminal profile to use it as your default launcher.
|
|
189
|
+
The package bundles an icon that you can reference via `launchline --icon-path`:
|
|
190
|
+
|
|
191
|
+
```jsonc
|
|
192
|
+
// In your Windows Terminal settings.json → profiles.list
|
|
193
|
+
{
|
|
194
|
+
"name": "LaunchLine",
|
|
195
|
+
"commandline": "launchline",
|
|
196
|
+
"startingDirectory": "%USERPROFILE%",
|
|
197
|
+
// Run: launchline --icon-path
|
|
198
|
+
"icon": "C:/Users/you/.local/lib/.../launchline/assets/launchline.ico"
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Set it as the default profile to see the launcher every time you open a terminal.
|
|
203
|
+
|
|
204
|
+
## Development
|
|
205
|
+
|
|
206
|
+
```sh
|
|
207
|
+
uv sync --group dev
|
|
208
|
+
uv run pytest
|
|
209
|
+
uv run ruff check .
|
|
210
|
+
uv run mypy src
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## License
|
|
214
|
+
|
|
215
|
+
MIT
|