linkedin-apply-assistant 0.1.1
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.
- package/.github/ISSUE_TEMPLATE/bug_report.yml +72 -0
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/ISSUE_TEMPLATE/config_help.yml +49 -0
- package/.github/ISSUE_TEMPLATE/docs.yml +40 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +45 -0
- package/.github/ISSUE_TEMPLATE/safety_compliance.yml +48 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +43 -0
- package/CHANGELOG.md +47 -0
- package/CODE_OF_CONDUCT.md +47 -0
- package/CONTRIBUTING.md +64 -0
- package/GOVERNANCE.md +41 -0
- package/LEGAL.md +38 -0
- package/LICENSE +22 -0
- package/MIGRATION.md +50 -0
- package/README.md +167 -0
- package/RELEASE_CHECKLIST.md +454 -0
- package/SAFETY.md +33 -0
- package/SECURITY.md +37 -0
- package/SUPPORT.md +44 -0
- package/THIRD_PARTY_NOTICES.md +67 -0
- package/bin/linkedin-apply-assistant.mjs +95 -0
- package/configs/config.example.yml +24 -0
- package/configs/qa_bank.example.yml +35 -0
- package/docs/apply.md +40 -0
- package/docs/assist.md +35 -0
- package/docs/browser-session.md +45 -0
- package/docs/ci-and-release-policy.md +105 -0
- package/docs/commands.md +176 -0
- package/docs/install-and-configuration.md +265 -0
- package/docs/registry-publication-strategy.md +169 -0
- package/docs/reports.md +35 -0
- package/docs/search.md +39 -0
- package/docs/troubleshooting.md +57 -0
- package/examples/dry_run_input.example.json +25 -0
- package/examples/reports/apply-audit.example.json +31 -0
- package/examples/reports/search-report.example.json +40 -0
- package/install.ps1 +178 -0
- package/package.json +59 -0
- package/pyproject.toml +51 -0
- package/src/linkedin_apply_assistant/__init__.py +8 -0
- package/src/linkedin_apply_assistant/apply_reports.py +229 -0
- package/src/linkedin_apply_assistant/ats_handlers.py +217 -0
- package/src/linkedin_apply_assistant/browser_sessions.py +155 -0
- package/src/linkedin_apply_assistant/cli.py +570 -0
- package/src/linkedin_apply_assistant/config.py +109 -0
- package/src/linkedin_apply_assistant/contracts.py +255 -0
- package/src/linkedin_apply_assistant/form_engine.py +180 -0
- package/src/linkedin_apply_assistant/linkedin_layer.py +436 -0
- package/src/linkedin_apply_assistant/page_actions.py +110 -0
- package/src/linkedin_apply_assistant/page_selectors.py +88 -0
- package/src/linkedin_apply_assistant/paths.py +135 -0
- package/src/linkedin_apply_assistant/qa_bank.py +352 -0
- package/src/linkedin_apply_assistant/redaction.py +119 -0
- package/src/linkedin_apply_assistant/safety.py +230 -0
- package/src/linkedin_apply_assistant/workflows.py +435 -0
package/docs/commands.md
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Command Reference
|
|
2
|
+
|
|
3
|
+
Use this page after installation to choose the right terminal command, inspect first-run paths, and understand where local output is written. The full install matrix remains in [Install and configuration](install-and-configuration.md).
|
|
4
|
+
|
|
5
|
+
## First-Run Checklist
|
|
6
|
+
|
|
7
|
+
1. Install the package from the current source/Python path documented in [Install and configuration](install-and-configuration.md).
|
|
8
|
+
2. Run the read-only diagnostic:
|
|
9
|
+
|
|
10
|
+
```powershell
|
|
11
|
+
linkedin-apply-assistant config check
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
3. Copy example files into your own ignored workspace when you need them:
|
|
15
|
+
- `configs/config.example.yml` for profile, documents, and path choices.
|
|
16
|
+
- `configs/qa_bank.example.yml` for truthful reusable answers.
|
|
17
|
+
4. Install browser support before visible-browser workflows:
|
|
18
|
+
|
|
19
|
+
```powershell
|
|
20
|
+
python -m playwright install chromium
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
5. Keep the safety boundary visible: public workflows are no-submit by default, `assist` is fill-only, and browser submission remains disabled in `apply`.
|
|
24
|
+
|
|
25
|
+
## Runtime Paths
|
|
26
|
+
|
|
27
|
+
`linkedin-apply-assistant config check` resolves these path categories without creating files or directories:
|
|
28
|
+
|
|
29
|
+
| Path category | Purpose |
|
|
30
|
+
|---|---|
|
|
31
|
+
| Config file | Optional YAML config selected by `--config` or the workspace default. |
|
|
32
|
+
| Q&A bank | Optional YAML answers selected by `--qa-bank` or the workspace default. |
|
|
33
|
+
| Browser profile | Local visible-browser profile directory used by browser workflows. |
|
|
34
|
+
| Output directory | Local command output directory. |
|
|
35
|
+
| Reports directory | Local JSON report directory under the output directory. |
|
|
36
|
+
| Data directory | Local assistant data such as pending questions. |
|
|
37
|
+
| Cache directory | Local cache data for workflows that need it. |
|
|
38
|
+
|
|
39
|
+
Use `--workspace` to keep those paths under one local directory:
|
|
40
|
+
|
|
41
|
+
```powershell
|
|
42
|
+
linkedin-apply-assistant --workspace .\local-workspace config check
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Bash/macOS/Linux:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
linkedin-apply-assistant --workspace ./local-workspace config check
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## config check
|
|
52
|
+
|
|
53
|
+
Run diagnostics before browser workflows or after changing path flags:
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
linkedin-apply-assistant config check
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Expected output:
|
|
60
|
+
|
|
61
|
+
- `ok`, `missing`, or `warning` for each path category.
|
|
62
|
+
- The resolved config file, Q&A bank, browser profile, output directory, reports directory, data directory, and cache directory.
|
|
63
|
+
- Setup guidance for missing config and missing Q&A bank.
|
|
64
|
+
|
|
65
|
+
This command is read-only. It does not create config files, Q&A bank files, browser profiles, output directories, reports directories, data directories, or cache directories.
|
|
66
|
+
|
|
67
|
+
Try: linkedin-apply-assistant config check
|
|
68
|
+
|
|
69
|
+
## search
|
|
70
|
+
|
|
71
|
+
`search` collects candidate job context and writes local reports without submitting applications.
|
|
72
|
+
|
|
73
|
+
```powershell
|
|
74
|
+
linkedin-apply-assistant search --query "python" --location "Remote" --limit 5
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Use an existing LinkedIn search URL when you already have one:
|
|
78
|
+
|
|
79
|
+
```powershell
|
|
80
|
+
linkedin-apply-assistant search --search-url "https://www.linkedin.com/jobs/search/" --limit 10 --verbose
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Notes:
|
|
84
|
+
|
|
85
|
+
- Visible browser search needs Playwright Chromium: `python -m playwright install chromium`.
|
|
86
|
+
- `--limit 0` remains browser-free and can write an empty search report.
|
|
87
|
+
- Reports are written under the resolved reports directory.
|
|
88
|
+
- Public workflows are no-submit by default.
|
|
89
|
+
|
|
90
|
+
## assist
|
|
91
|
+
|
|
92
|
+
`assist` opens a visible-browser session where you drive the browser and the assistant fills detected forms. It is fill-only.
|
|
93
|
+
|
|
94
|
+
```powershell
|
|
95
|
+
linkedin-apply-assistant assist --mode on-demand
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Use an explicit workspace and browser profile when you want all local state grouped:
|
|
99
|
+
|
|
100
|
+
```powershell
|
|
101
|
+
linkedin-apply-assistant assist --workspace .\local-workspace --browser-profile .\local-workspace\browser-profile --verbose
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Notes:
|
|
105
|
+
|
|
106
|
+
- Install browser support first: `python -m playwright install chromium`.
|
|
107
|
+
- Use a truthful Q&A bank based on `configs/qa_bank.example.yml`.
|
|
108
|
+
- Missing answers should pause filling or be captured as pending questions for review.
|
|
109
|
+
- Reports are written under the resolved reports directory.
|
|
110
|
+
- Browser submission remains disabled.
|
|
111
|
+
|
|
112
|
+
## apply
|
|
113
|
+
|
|
114
|
+
`apply` prepares local audit output. Browser submission remains disabled in this package boundary.
|
|
115
|
+
|
|
116
|
+
```powershell
|
|
117
|
+
linkedin-apply-assistant apply --input candidates.json --limit 3
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Use verbose mode to see resolved report paths:
|
|
121
|
+
|
|
122
|
+
```powershell
|
|
123
|
+
linkedin-apply-assistant apply --workspace .\local-workspace --input candidates.json --verbose
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Notes:
|
|
127
|
+
|
|
128
|
+
- Current behavior is prepare-only.
|
|
129
|
+
- `--confirm-submit` is recorded as a guarded future signal, but browser submission remains disabled.
|
|
130
|
+
- Reports are written under the resolved reports directory.
|
|
131
|
+
- Do not use the package for mass applications or unattended apply sessions.
|
|
132
|
+
|
|
133
|
+
## dry-run
|
|
134
|
+
|
|
135
|
+
`dry-run` validates local job JSON input. It is browser-free, does not require Playwright, does not require config, and does not require a browser profile.
|
|
136
|
+
|
|
137
|
+
```powershell
|
|
138
|
+
linkedin-apply-assistant dry-run --input examples\dry_run_input.example.json
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Bash/macOS/Linux:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
linkedin-apply-assistant dry-run --input examples/dry_run_input.example.json
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Use this command to check JSON shape before browser workflows.
|
|
148
|
+
|
|
149
|
+
## report
|
|
150
|
+
|
|
151
|
+
`report` reads an existing local report JSON file and prints a concise summary. It is browser-free, does not require Playwright, does not require config, and does not require a browser profile.
|
|
152
|
+
|
|
153
|
+
```powershell
|
|
154
|
+
linkedin-apply-assistant report examples\reports\apply-audit.example.json
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Bash/macOS/Linux:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
linkedin-apply-assistant report examples/reports/apply-audit.example.json
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Use this command for local report review without opening a browser.
|
|
164
|
+
|
|
165
|
+
## Troubleshooting Pointers
|
|
166
|
+
|
|
167
|
+
| Symptom | Next step |
|
|
168
|
+
|---|---|
|
|
169
|
+
| Missing config | Run `linkedin-apply-assistant config check`, then copy and edit `configs/config.example.yml` if you need config. |
|
|
170
|
+
| Missing Q&A bank | Copy `configs/qa_bank.example.yml`, answer truthfully, and pass it with `--qa-bank` or a workspace default. |
|
|
171
|
+
| Invalid JSON input | Re-run `dry-run` after checking the `--input` path and JSON format. |
|
|
172
|
+
| Missing Playwright or Chromium | Run `python -m playwright install chromium`. |
|
|
173
|
+
| Browser profile issue | Run `config check`, inspect the browser profile path, or choose another profile with `--browser-profile <path>`. |
|
|
174
|
+
| Unsure which command to use | Start with `linkedin-apply-assistant --help` and `linkedin-apply-assistant config check`. |
|
|
175
|
+
|
|
176
|
+
More details are in [Troubleshooting](troubleshooting.md).
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# Install and Configuration
|
|
2
|
+
|
|
3
|
+
This package runs locally. You install the Python package, choose a local workspace, and keep personal runtime files out of version control.
|
|
4
|
+
|
|
5
|
+
This file is the canonical install matrix. The README keeps only a short quick start.
|
|
6
|
+
|
|
7
|
+
Current package metadata version: `0.1.1`.
|
|
8
|
+
|
|
9
|
+
The npm launcher and PowerShell installer are the current quick-install paths.
|
|
10
|
+
PyPI remains a future package channel. The package-channel decision, approval
|
|
11
|
+
gates, and `v0.1.0` no-backfill policy are documented in the
|
|
12
|
+
[registry publication strategy](registry-publication-strategy.md).
|
|
13
|
+
|
|
14
|
+
## Prerequisites
|
|
15
|
+
|
|
16
|
+
- Python 3.11 or newer.
|
|
17
|
+
- A shell such as PowerShell, Bash, zsh, or another POSIX-like shell.
|
|
18
|
+
- Node.js/npm for the npm global launcher path.
|
|
19
|
+
- PowerShell 5.1+ or PowerShell 7+ for the Windows installer path.
|
|
20
|
+
- Playwright Chromium only for visible-browser workflows.
|
|
21
|
+
|
|
22
|
+
Browser-free commands such as `dry-run` and `report` do not need a Playwright browser install. Commands that open a visible browser, such as `search`, `assist`, and browser-dependent `apply` preparation, need Chromium:
|
|
23
|
+
|
|
24
|
+
```powershell
|
|
25
|
+
python -m playwright install chromium
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## NPM Global Launcher
|
|
29
|
+
|
|
30
|
+
The npm package provides the `linkedin-apply-assistant` command as a Node
|
|
31
|
+
launcher. It delegates to the Python CLI and still needs Python 3.11+ plus the
|
|
32
|
+
Python dependencies.
|
|
33
|
+
|
|
34
|
+
```powershell
|
|
35
|
+
npm install -g linkedin-apply-assistant
|
|
36
|
+
linkedin-apply-assistant --help
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
If the launcher reports that the Python package is not importable, install the
|
|
40
|
+
bundled Python package from the global npm package directory:
|
|
41
|
+
|
|
42
|
+
```powershell
|
|
43
|
+
$pkg = Join-Path (npm root -g) 'linkedin-apply-assistant'
|
|
44
|
+
py -3 -m pip install $pkg
|
|
45
|
+
linkedin-apply-assistant --help
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## PowerShell Installer
|
|
49
|
+
|
|
50
|
+
The PowerShell installer downloads the public GitHub source archive, creates a
|
|
51
|
+
local virtual environment, installs the Python package, and writes
|
|
52
|
+
`linkedin-apply-assistant.ps1` plus `.cmd` shims under the install directory. It
|
|
53
|
+
does not require admin rights.
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
$script = Join-Path $env:TEMP 'install-linkedin-apply-assistant.ps1'
|
|
57
|
+
Invoke-WebRequest -UseBasicParsing https://raw.githubusercontent.com/MohammedGhazal09/linkedin-apply-assistant/main/install.ps1 -OutFile $script
|
|
58
|
+
powershell -ExecutionPolicy Bypass -File $script
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Optional visible-browser setup during install:
|
|
62
|
+
|
|
63
|
+
```powershell
|
|
64
|
+
powershell -ExecutionPolicy Bypass -File $script -InstallBrowser
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Current Source Checkout
|
|
68
|
+
|
|
69
|
+
Run these commands from the package root, not from a broader parent repository root.
|
|
70
|
+
|
|
71
|
+
Install the package for local development:
|
|
72
|
+
|
|
73
|
+
```powershell
|
|
74
|
+
python -m pip install -e ".[dev]"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Check the console command:
|
|
78
|
+
|
|
79
|
+
```powershell
|
|
80
|
+
linkedin-apply-assistant --help
|
|
81
|
+
linkedin-apply-assistant config check
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
After installation, use the [command reference](commands.md) for first-run diagnostics, public command examples, output paths, reports, and browser-profile guidance.
|
|
85
|
+
|
|
86
|
+
If you are working directly from source and need a module fallback, set `PYTHONPATH` to the local `src` directory.
|
|
87
|
+
|
|
88
|
+
PowerShell:
|
|
89
|
+
|
|
90
|
+
```powershell
|
|
91
|
+
$env:PYTHONPATH=(Resolve-Path 'src').Path
|
|
92
|
+
python -m linkedin_apply_assistant.cli --help
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Bash/macOS/Linux:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
PYTHONPATH="$(pwd)/src" python -m linkedin_apply_assistant.cli --help
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Public Source Download
|
|
102
|
+
|
|
103
|
+
The canonical public source repository is:
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
https://github.com/MohammedGhazal09/linkedin-apply-assistant
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Git clone:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
git clone https://github.com/MohammedGhazal09/linkedin-apply-assistant.git
|
|
113
|
+
cd linkedin-apply-assistant
|
|
114
|
+
python -m pip install -e ".[dev]"
|
|
115
|
+
linkedin-apply-assistant --help
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
ZIP/tarball archive shape:
|
|
119
|
+
|
|
120
|
+
1. Download the ZIP/tarball archive from the public repository source archive links.
|
|
121
|
+
2. Extract it.
|
|
122
|
+
3. Open a shell in the extracted package root.
|
|
123
|
+
4. Install and verify:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
python -m pip install -e ".[dev]"
|
|
127
|
+
linkedin-apply-assistant --help
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Python Install Paths
|
|
131
|
+
|
|
132
|
+
For a local package root checkout:
|
|
133
|
+
|
|
134
|
+
```powershell
|
|
135
|
+
python -m pip install .
|
|
136
|
+
linkedin-apply-assistant --help
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
For editable development with test and release tooling:
|
|
140
|
+
|
|
141
|
+
```powershell
|
|
142
|
+
python -m pip install -e ".[dev]"
|
|
143
|
+
linkedin-apply-assistant --help
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
For an isolated application install with pipx from a local package root:
|
|
147
|
+
|
|
148
|
+
```powershell
|
|
149
|
+
pipx install .
|
|
150
|
+
linkedin-apply-assistant --help
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
After a later approved PyPI release, the future pipx command shape will use the package name:
|
|
154
|
+
|
|
155
|
+
```powershell
|
|
156
|
+
pipx install linkedin-apply-assistant
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Until that release exists, use the local package-root commands above.
|
|
160
|
+
|
|
161
|
+
## npm Launcher Path
|
|
162
|
+
|
|
163
|
+
The package-local npm path is a thin launcher for users who want an npm-installed command. It delegates to the Python CLI and does not install Python dependencies for you.
|
|
164
|
+
|
|
165
|
+
From the package root, test the launcher locally after making the Python package importable.
|
|
166
|
+
|
|
167
|
+
PowerShell:
|
|
168
|
+
|
|
169
|
+
```powershell
|
|
170
|
+
$env:PYTHONPATH=(Resolve-Path 'src').Path
|
|
171
|
+
node .\bin\linkedin-apply-assistant.mjs --help
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Bash/macOS/Linux:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
PYTHONPATH="$(pwd)/src" node ./bin/linkedin-apply-assistant.mjs --help
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Local package-shape validation uses npm packaging dry runs rather than registry publication:
|
|
181
|
+
|
|
182
|
+
```powershell
|
|
183
|
+
npm pack --dry-run --json
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
The global npm command shape is:
|
|
187
|
+
|
|
188
|
+
```powershell
|
|
189
|
+
npm install -g linkedin-apply-assistant
|
|
190
|
+
linkedin-apply-assistant --help
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
If imports are missing after the npm install, use the bundled package-root pip
|
|
194
|
+
command from the NPM Global Launcher section above.
|
|
195
|
+
|
|
196
|
+
## Browser-Free Commands
|
|
197
|
+
|
|
198
|
+
`dry-run` validates local input without opening a browser:
|
|
199
|
+
|
|
200
|
+
```powershell
|
|
201
|
+
linkedin-apply-assistant dry-run --input examples\dry_run_input.example.json
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
`report` reads a local report JSON file and prints a summary without opening a browser:
|
|
205
|
+
|
|
206
|
+
```powershell
|
|
207
|
+
linkedin-apply-assistant report examples\reports\apply-audit.example.json
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Visible-Browser Workflows
|
|
211
|
+
|
|
212
|
+
Visible-browser workflows are user-controlled and no-submit by default. Use the Playwright Chromium prerequisite command above before opening them.
|
|
213
|
+
|
|
214
|
+
Then review each command's help:
|
|
215
|
+
|
|
216
|
+
```powershell
|
|
217
|
+
linkedin-apply-assistant config check
|
|
218
|
+
linkedin-apply-assistant search --help
|
|
219
|
+
linkedin-apply-assistant assist --help
|
|
220
|
+
linkedin-apply-assistant apply --help
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
`search` collects candidate job context and writes local reports. `assist` opens a visible-browser fill-only session. `apply` prepares approval-gated audit output; browser submission remains disabled today.
|
|
224
|
+
|
|
225
|
+
## Workspace
|
|
226
|
+
|
|
227
|
+
Use `--workspace` to point the assistant at a local directory for config, data, visible-browser profile, outputs, and reports:
|
|
228
|
+
|
|
229
|
+
```powershell
|
|
230
|
+
linkedin-apply-assistant --workspace .\local-workspace dry-run --input examples\dry_run_input.example.json
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
The package `.gitignore` excludes local runtime directories such as `data/`, `output/`, `reports/`, `browser-profile/`, and local config files. Keep real answers and browser state local.
|
|
234
|
+
|
|
235
|
+
## Config
|
|
236
|
+
|
|
237
|
+
Start from [../configs/config.example.yml](../configs/config.example.yml). Copy it to your own ignored workspace before adding real local paths.
|
|
238
|
+
|
|
239
|
+
Use `--config` to choose the file:
|
|
240
|
+
|
|
241
|
+
```powershell
|
|
242
|
+
linkedin-apply-assistant --config .\local-workspace\config.yml dry-run --input examples\dry_run_input.example.json
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Do not put credentials in the package config. Browser login state belongs in your local visible-browser profile, and the profile directory should stay ignored.
|
|
246
|
+
|
|
247
|
+
## Q&A Bank
|
|
248
|
+
|
|
249
|
+
Start from [../configs/qa_bank.example.yml](../configs/qa_bank.example.yml). The Q&A bank should contain truthful, reusable answers only. Unknown required questions should stop the workflow until the user supplies an answer.
|
|
250
|
+
|
|
251
|
+
Use `--qa-bank` to choose a local file:
|
|
252
|
+
|
|
253
|
+
```powershell
|
|
254
|
+
linkedin-apply-assistant --qa-bank .\local-workspace\qa_bank.yml dry-run --input examples\dry_run_input.example.json
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## Output Directory
|
|
258
|
+
|
|
259
|
+
Use `--output-dir` when you want command output somewhere specific:
|
|
260
|
+
|
|
261
|
+
```powershell
|
|
262
|
+
linkedin-apply-assistant --output-dir .\local-workspace\outputs dry-run --input examples\dry_run_input.example.json
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Generated output is local audit material. Do not publish it unless you have reviewed and sanitized it.
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Registry Publication Strategy
|
|
2
|
+
|
|
3
|
+
Status: registry and installer policy. This document does not by itself publish
|
|
4
|
+
a package, reserve a package name, configure a trusted publisher, create a
|
|
5
|
+
registry token, log in to a registry, create a tag, upload a GitHub Release
|
|
6
|
+
asset, or grant publish-capable workflow permissions.
|
|
7
|
+
|
|
8
|
+
The first GitHub source release, `v0.1.0`, remains source-only and is not a
|
|
9
|
+
registry backfill candidate. The npm launcher release starts at `0.1.1`; PyPI
|
|
10
|
+
and TestPyPI remain future channels.
|
|
11
|
+
|
|
12
|
+
## Current Boundary
|
|
13
|
+
|
|
14
|
+
- Current package metadata version: `0.1.1`.
|
|
15
|
+
- Current install path: npm global launcher, PowerShell installer, source
|
|
16
|
+
checkout, local Python install, local editable install, and local npm launcher
|
|
17
|
+
dry-run validation.
|
|
18
|
+
- Current public channel: GitHub repository source checkout and GitHub source
|
|
19
|
+
release archives; npm launcher package for `0.1.1` after the approved npm
|
|
20
|
+
publish step verifies successfully.
|
|
21
|
+
- Not current: PyPI package, TestPyPI package, GitHub Packages package, PyPI
|
|
22
|
+
trusted-publisher setup, npm trusted-publisher setup, registry automation,
|
|
23
|
+
release asset uploads, artifact attestations, provenance, or signing.
|
|
24
|
+
|
|
25
|
+
PyPI registry install commands remain future commands until a later phase
|
|
26
|
+
explicitly approves the target registry, version, repository, workflow or manual
|
|
27
|
+
action, and exact mutation.
|
|
28
|
+
|
|
29
|
+
## Channel Matrix
|
|
30
|
+
|
|
31
|
+
| Channel | Current status | Future status | Rationale | Prerequisites | Publish trigger | Verification | Rollback or remediation |
|
|
32
|
+
|---|---|---|---|---|---|---|---|
|
|
33
|
+
| GitHub Releases | Current source-only channel for `v0.1.0`. No wheel, sdist, npm tarball, or other release asset is attached. | Keep as the source-of-truth release record. Future assets require explicit approval. | Users can inspect and install from source without introducing registry auth or package-name ownership. | Clean local verification, changelog, release checklist, source manifest, approved tag or release mutation. | Explicit GitHub Release approval naming repo, tag, target commit, release state, and assets, if any. | `gh release view`, `gh release list`, source archive inspection, release manifest verification. | Remove mistaken assets from the release, correct the release notes, or delete a draft. Source tags need separate explicit remediation because asset removal does not undo a tag. |
|
|
34
|
+
| PyPI | Not published and not reserved. | Primary future Python registry for direct package publication. | The project is a Python CLI with Playwright-driven browser automation, so PyPI is the natural long-term install path. | Maintainer or maintainer-controlled organization ownership, account 2FA where supported, PyPI Trusted Publishing with GitHub Actions OIDC, protected `pypi` environment, clean build and metadata gates. | Explicit PyPI approval naming repository, version, PyPI project, workflow or manual action, and exact upload mutation. | Read-only JSON API check, `python -m build`, `twine check dist/*`, local wheel install smoke, release scan, manifest verification. | Prefer yanking a broken release where appropriate. Deletion is disruptive and permanent; never rely on deleting and reusing the same version. |
|
|
35
|
+
| TestPyPI | Not published and not reserved. | Required preflight for the first registry release and for publish-workflow changes. Routine patch preflights can become optional only after a proven release cycle. | It exercises package metadata, artifacts, and installer behavior before the real PyPI release. | Same artifact gates as PyPI, protected `testpypi` environment, explicit preflight approval, no production token. | Explicit TestPyPI approval naming repository, version, TestPyPI project, workflow or manual action, and exact upload mutation. | TestPyPI JSON API check, metadata validation, test-index install smoke, package contents review. | Clean up mistaken TestPyPI releases where possible and move forward with a new version if needed. Do not treat TestPyPI cleanup as production rollback proof. |
|
|
36
|
+
| npm | Public thin-launcher channel for `0.1.1`. | Keep as the JavaScript ecosystem convenience launcher; use PyPI later for direct Python package installs. | npm provides a familiar global command on systems that already have Node.js, but the launcher delegates to the Python CLI and cannot install Python itself. | Maintainer or maintainer-controlled ownership, account 2FA where supported, first-publish token bootstrap if trusted publishing cannot create the package, exact package contents review. | Explicit npm approval naming repository, version, npm package, workflow or manual action, and exact registry mutation. | `npm pack --dry-run --json`, package contents inspection, no lifecycle install/publish scripts, npm read-only registry check after publication. | Prefer deprecation for bad packages when unpublish criteria are not met. A used npm `package@version` cannot be reused, even after unpublish. |
|
|
37
|
+
| PowerShell installer | Current GitHub-hosted installer script at `install.ps1`. | Keep as the no-admin Windows convenience path for users who prefer a single script. | It can create a local virtual environment, install dependencies from the public source archive, create command shims, and optionally install Chromium. | Public GitHub source archive availability, Python 3.11+, script syntax validation, no `Invoke-Expression` pipe-install pattern, and local install smoke. | Push the verified installer to the public repository; no registry mutation is required. | PowerShell parser check, temp-directory install smoke, command shim help smoke, and docs link checks. | Fix forward in `main`; users can reinstall from the corrected script or pin `-Ref` to a known tag. |
|
|
38
|
+
| GitHub Packages | Not used. | Deferred. | It adds `packages: write` and authenticated consumption friction without improving the primary Python install path. | A future reason to publish a package to GitHub Packages, explicit package type, permission model, and install documentation. | Separate approval naming package type, repository, version, and exact mutation. | GitHub Packages read-only checks and package permission review. | Delete or deprecate only according to the package type's GitHub Packages support. This is not a substitute for PyPI/npm remediation. |
|
|
39
|
+
|
|
40
|
+
## Package Names
|
|
41
|
+
|
|
42
|
+
The target package name for PyPI, TestPyPI, and npm publication is
|
|
43
|
+
`linkedin-apply-assistant`. The current npm launcher version is `0.1.1`.
|
|
44
|
+
|
|
45
|
+
If the unscoped npm name becomes unavailable or ownership changes later, the
|
|
46
|
+
fallback is a future scoped npm package under a maintainer-controlled scope.
|
|
47
|
+
|
|
48
|
+
## Version Sequencing
|
|
49
|
+
|
|
50
|
+
- `v0.1.0` stays a GitHub source-only release.
|
|
51
|
+
- No registry should backfill `0.1.0`.
|
|
52
|
+
- The first registry release must use a later explicitly approved package version.
|
|
53
|
+
- The npm launcher release uses `0.1.1` because it changes distribution
|
|
54
|
+
metadata, includes the Python source in the npm tarball, and adds the
|
|
55
|
+
PowerShell installer without changing the browser workflow contract.
|
|
56
|
+
- If user-visible behavior changes before registry publication, the default
|
|
57
|
+
future version example is `0.2.0`.
|
|
58
|
+
- Future behavior changes remain SemVer decisions at the publish phase.
|
|
59
|
+
|
|
60
|
+
## Ownership and Authentication
|
|
61
|
+
|
|
62
|
+
Future registry publication must use maintainer-owned or maintainer-controlled
|
|
63
|
+
organization accounts.
|
|
64
|
+
|
|
65
|
+
Required future controls:
|
|
66
|
+
|
|
67
|
+
- Account 2FA where the registry supports it.
|
|
68
|
+
- PyPI Trusted Publishing with GitHub Actions OIDC for PyPI/TestPyPI.
|
|
69
|
+
- npm trusted publishing or equivalent OIDC flow where supported after the first
|
|
70
|
+
package bootstrap. A brand-new npm package may need a short-lived granular
|
|
71
|
+
token for the first publish before trusted publishing can be linked.
|
|
72
|
+
- Protected GitHub environments such as `testpypi`, `pypi`, and `npm`.
|
|
73
|
+
- A tightly scoped future release workflow identity, commonly `release.yml`, but
|
|
74
|
+
- no release workflow is added by this document.
|
|
75
|
+
- No shared long-lived registry tokens.
|
|
76
|
+
- No publish credentials in repository files, examples, local configs, or
|
|
77
|
+
package metadata.
|
|
78
|
+
|
|
79
|
+
Future OIDC and attestation work may require permissions such as
|
|
80
|
+
`id-token: write`, `attestations: write`, or `packages: write`. Phase 29 does not grant those permissions.
|
|
81
|
+
|
|
82
|
+
## Future Publish Gates
|
|
83
|
+
|
|
84
|
+
Every future registry publication approval must include fresh evidence for the
|
|
85
|
+
target version:
|
|
86
|
+
|
|
87
|
+
- Python build: `python -m build`.
|
|
88
|
+
- Python metadata validation: `twine check dist/*`.
|
|
89
|
+
- Local wheel install smoke from a temporary output directory.
|
|
90
|
+
- npm launcher package dry run: `npm pack --dry-run --json`.
|
|
91
|
+
- Package contents inspection for source release and npm package surfaces.
|
|
92
|
+
- PowerShell installer parser check and temp-directory install smoke.
|
|
93
|
+
- Release manifest check: `python scripts\release.py manifest --check`.
|
|
94
|
+
- Release verification: `python scripts\release.py verify`.
|
|
95
|
+
- Secret scan or release scan with gitleaks or the package release scanner.
|
|
96
|
+
- Read-only npm, PyPI, and TestPyPI registry version or absence checks.
|
|
97
|
+
- GitHub Release read-only checks when source tags or release assets are in
|
|
98
|
+
scope.
|
|
99
|
+
|
|
100
|
+
Live registry checks stay out of default pytest and CI. They are verification
|
|
101
|
+
commands for the human-approved release step.
|
|
102
|
+
|
|
103
|
+
## Approval Templates
|
|
104
|
+
|
|
105
|
+
Use these templates verbatim before any future registry or release mutation.
|
|
106
|
+
|
|
107
|
+
### TestPyPI Preflight
|
|
108
|
+
|
|
109
|
+
- Repository: `MohammedGhazal09/linkedin-apply-assistant`
|
|
110
|
+
- Version: `<version>`
|
|
111
|
+
- Channel: TestPyPI
|
|
112
|
+
- Workflow or manual action: `<workflow filename or manual command owner>`
|
|
113
|
+
- Exact mutation: upload the verified sdist and wheel for `<version>` to
|
|
114
|
+
TestPyPI only.
|
|
115
|
+
|
|
116
|
+
### PyPI Release
|
|
117
|
+
|
|
118
|
+
- Repository: `MohammedGhazal09/linkedin-apply-assistant`
|
|
119
|
+
- Version: `<version>`
|
|
120
|
+
- Channel: PyPI
|
|
121
|
+
- Workflow or manual action: `<workflow filename or manual command owner>`
|
|
122
|
+
- Exact mutation: upload the verified sdist and wheel for `<version>` to PyPI.
|
|
123
|
+
|
|
124
|
+
### npm Launcher Release
|
|
125
|
+
|
|
126
|
+
- Repository: `MohammedGhazal09/linkedin-apply-assistant`
|
|
127
|
+
- Version: `0.1.1`
|
|
128
|
+
- Channel: npm
|
|
129
|
+
- Workflow or manual action: `<workflow filename or manual command owner>`
|
|
130
|
+
- Exact mutation: publish the verified npm launcher package for `<version>` to
|
|
131
|
+
the npm public registry.
|
|
132
|
+
|
|
133
|
+
### PowerShell Installer Update
|
|
134
|
+
|
|
135
|
+
- Repository: `MohammedGhazal09/linkedin-apply-assistant`
|
|
136
|
+
- Version or ref: `<version-or-ref>`
|
|
137
|
+
- Channel: GitHub raw source installer
|
|
138
|
+
- Workflow or manual action: `<workflow filename or manual command owner>`
|
|
139
|
+
- Exact mutation: push the verified `install.ps1` installer script to the
|
|
140
|
+
public repository.
|
|
141
|
+
|
|
142
|
+
### GitHub Release Asset Work
|
|
143
|
+
|
|
144
|
+
- Repository: `MohammedGhazal09/linkedin-apply-assistant`
|
|
145
|
+
- Version or tag: `<version-or-tag>`
|
|
146
|
+
- Channel: GitHub Releases
|
|
147
|
+
- Workflow or manual action: `<workflow filename or manual command owner>`
|
|
148
|
+
- Exact mutation: upload, replace, or remove the named release asset(s) for
|
|
149
|
+
`<version-or-tag>`.
|
|
150
|
+
|
|
151
|
+
## Rollback and Remediation Notes
|
|
152
|
+
|
|
153
|
+
- PyPI: prefer yanking for broken releases where appropriate. Deletion is
|
|
154
|
+
disruptive and should not be treated as a normal rollback path.
|
|
155
|
+
- TestPyPI: cleanup is acceptable for preflight mistakes, but it does not prove
|
|
156
|
+
production rollback.
|
|
157
|
+
- npm: unpublish is limited and irreversible in important ways; deprecation is often the safer remediation path. A used package version cannot be reused.
|
|
158
|
+
- GitHub Releases: removing a release asset does not remove source archives,
|
|
159
|
+
tags, or downstream copies. Tag remediation requires a separate explicit
|
|
160
|
+
approval.
|
|
161
|
+
|
|
162
|
+
Do not add executable rollback scripts for registry actions until a future phase
|
|
163
|
+
has a concrete approved publication mechanism.
|
|
164
|
+
|
|
165
|
+
## Related Docs
|
|
166
|
+
|
|
167
|
+
- [Install and configuration](install-and-configuration.md)
|
|
168
|
+
- [CI and release policy](ci-and-release-policy.md)
|
|
169
|
+
- [Release checklist](../RELEASE_CHECKLIST.md)
|
package/docs/reports.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Report Review
|
|
2
|
+
|
|
3
|
+
`report` reads a local JSON report and prints a concise summary for review.
|
|
4
|
+
|
|
5
|
+
## Review a Report
|
|
6
|
+
|
|
7
|
+
```powershell
|
|
8
|
+
linkedin-apply-assistant report examples\reports\search-report.example.json
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Synthetic examples:
|
|
12
|
+
|
|
13
|
+
- [../examples/reports/search-report.example.json](../examples/reports/search-report.example.json)
|
|
14
|
+
- [../examples/reports/apply-audit.example.json](../examples/reports/apply-audit.example.json)
|
|
15
|
+
|
|
16
|
+
## Report Boundary
|
|
17
|
+
|
|
18
|
+
Reports are local audit material. They can contain company names, role names, status counts, blockers, and decisions. They should not contain credentials, cookies, tokens, raw browser state, raw HTML, screenshots, full private URLs, private documents, or generated local reports copied from a real run.
|
|
19
|
+
|
|
20
|
+
Use examples to understand shape only. Replace or redact sensitive data before sharing any report outside your machine.
|
|
21
|
+
|
|
22
|
+
## Related Commands
|
|
23
|
+
|
|
24
|
+
Generate browser-free dry-run output:
|
|
25
|
+
|
|
26
|
+
```powershell
|
|
27
|
+
linkedin-apply-assistant dry-run --input examples\dry_run_input.example.json
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Prepare local apply audit output without browser submission:
|
|
31
|
+
|
|
32
|
+
```powershell
|
|
33
|
+
linkedin-apply-assistant apply --input examples\dry_run_input.example.json --limit 1
|
|
34
|
+
```
|
|
35
|
+
|
package/docs/search.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Search-Only Workflow
|
|
2
|
+
|
|
3
|
+
`search` collects candidate job context and writes local report output without submitting applications.
|
|
4
|
+
|
|
5
|
+
## Basic Search
|
|
6
|
+
|
|
7
|
+
```powershell
|
|
8
|
+
linkedin-apply-assistant search --query "applied ai engineer" --location "Remote" --limit 10
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Use `--search-url` when you already have a LinkedIn jobs search URL:
|
|
12
|
+
|
|
13
|
+
```powershell
|
|
14
|
+
linkedin-apply-assistant search --search-url "https://www.linkedin.com/jobs/search/" --limit 5
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Shared Options
|
|
18
|
+
|
|
19
|
+
`search` accepts the shared package flags:
|
|
20
|
+
|
|
21
|
+
- `--workspace`
|
|
22
|
+
- `--config`
|
|
23
|
+
- `--qa-bank`
|
|
24
|
+
- `--browser-profile`
|
|
25
|
+
- `--output-dir`
|
|
26
|
+
- `--verbose`
|
|
27
|
+
|
|
28
|
+
Example:
|
|
29
|
+
|
|
30
|
+
```powershell
|
|
31
|
+
linkedin-apply-assistant --workspace .\local-workspace search --query "automation engineer" --location "Remote" --limit 5 --verbose
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Output
|
|
35
|
+
|
|
36
|
+
Search output is local audit material. Review it before sharing. Do not publish full private URLs, browser state, generated local reports, or live job history.
|
|
37
|
+
|
|
38
|
+
For report review, see [reports.md](reports.md).
|
|
39
|
+
|