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.
Files changed (55) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.yml +72 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. package/.github/ISSUE_TEMPLATE/config_help.yml +49 -0
  4. package/.github/ISSUE_TEMPLATE/docs.yml +40 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.yml +45 -0
  6. package/.github/ISSUE_TEMPLATE/safety_compliance.yml +48 -0
  7. package/.github/PULL_REQUEST_TEMPLATE.md +43 -0
  8. package/CHANGELOG.md +47 -0
  9. package/CODE_OF_CONDUCT.md +47 -0
  10. package/CONTRIBUTING.md +64 -0
  11. package/GOVERNANCE.md +41 -0
  12. package/LEGAL.md +38 -0
  13. package/LICENSE +22 -0
  14. package/MIGRATION.md +50 -0
  15. package/README.md +167 -0
  16. package/RELEASE_CHECKLIST.md +454 -0
  17. package/SAFETY.md +33 -0
  18. package/SECURITY.md +37 -0
  19. package/SUPPORT.md +44 -0
  20. package/THIRD_PARTY_NOTICES.md +67 -0
  21. package/bin/linkedin-apply-assistant.mjs +95 -0
  22. package/configs/config.example.yml +24 -0
  23. package/configs/qa_bank.example.yml +35 -0
  24. package/docs/apply.md +40 -0
  25. package/docs/assist.md +35 -0
  26. package/docs/browser-session.md +45 -0
  27. package/docs/ci-and-release-policy.md +105 -0
  28. package/docs/commands.md +176 -0
  29. package/docs/install-and-configuration.md +265 -0
  30. package/docs/registry-publication-strategy.md +169 -0
  31. package/docs/reports.md +35 -0
  32. package/docs/search.md +39 -0
  33. package/docs/troubleshooting.md +57 -0
  34. package/examples/dry_run_input.example.json +25 -0
  35. package/examples/reports/apply-audit.example.json +31 -0
  36. package/examples/reports/search-report.example.json +40 -0
  37. package/install.ps1 +178 -0
  38. package/package.json +59 -0
  39. package/pyproject.toml +51 -0
  40. package/src/linkedin_apply_assistant/__init__.py +8 -0
  41. package/src/linkedin_apply_assistant/apply_reports.py +229 -0
  42. package/src/linkedin_apply_assistant/ats_handlers.py +217 -0
  43. package/src/linkedin_apply_assistant/browser_sessions.py +155 -0
  44. package/src/linkedin_apply_assistant/cli.py +570 -0
  45. package/src/linkedin_apply_assistant/config.py +109 -0
  46. package/src/linkedin_apply_assistant/contracts.py +255 -0
  47. package/src/linkedin_apply_assistant/form_engine.py +180 -0
  48. package/src/linkedin_apply_assistant/linkedin_layer.py +436 -0
  49. package/src/linkedin_apply_assistant/page_actions.py +110 -0
  50. package/src/linkedin_apply_assistant/page_selectors.py +88 -0
  51. package/src/linkedin_apply_assistant/paths.py +135 -0
  52. package/src/linkedin_apply_assistant/qa_bank.py +352 -0
  53. package/src/linkedin_apply_assistant/redaction.py +119 -0
  54. package/src/linkedin_apply_assistant/safety.py +230 -0
  55. package/src/linkedin_apply_assistant/workflows.py +435 -0
@@ -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)
@@ -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
+