jobhunt-kit 0.2.0

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 (50) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +14 -0
  3. package/AGENTS.md +23 -0
  4. package/CLAUDE.md +5 -0
  5. package/README.md +122 -0
  6. package/bin/jobhunt-kit.mjs +95 -0
  7. package/installer-assets/gitignore.txt +22 -0
  8. package/installer-assets/runtime-lock.json +492 -0
  9. package/installer-assets/workspace-lock.json +495 -0
  10. package/package.json +52 -0
  11. package/plugins/jobhunt-kit/.claude-plugin/plugin.json +9 -0
  12. package/plugins/jobhunt-kit/.codex-plugin/plugin.json +18 -0
  13. package/plugins/jobhunt-kit/THIRD_PARTY.md +18 -0
  14. package/plugins/jobhunt-kit/package-lock.json +492 -0
  15. package/plugins/jobhunt-kit/package.json +14 -0
  16. package/plugins/jobhunt-kit/references/cli.md +125 -0
  17. package/plugins/jobhunt-kit/references/cover-guidance.md +24 -0
  18. package/plugins/jobhunt-kit/references/hirify/LICENSE +202 -0
  19. package/plugins/jobhunt-kit/references/hirify/NOTICE +2 -0
  20. package/plugins/jobhunt-kit/references/hirify/SKILL.md +139 -0
  21. package/plugins/jobhunt-kit/references/hirify/reference.md +286 -0
  22. package/plugins/jobhunt-kit/references/matching.md +28 -0
  23. package/plugins/jobhunt-kit/references/resume-guidance.md +47 -0
  24. package/plugins/jobhunt-kit/references/storage.md +120 -0
  25. package/plugins/jobhunt-kit/references/workflow.md +89 -0
  26. package/plugins/jobhunt-kit/scripts/cli.mjs +9 -0
  27. package/plugins/jobhunt-kit/scripts/commands.mjs +157 -0
  28. package/plugins/jobhunt-kit/scripts/extract-resume.mjs +27 -0
  29. package/plugins/jobhunt-kit/scripts/hirify.mjs +31 -0
  30. package/plugins/jobhunt-kit/scripts/profile.mjs +79 -0
  31. package/plugins/jobhunt-kit/scripts/resume.mjs +92 -0
  32. package/plugins/jobhunt-kit/scripts/send-packet.mjs +36 -0
  33. package/plugins/jobhunt-kit/scripts/setup.mjs +25 -0
  34. package/plugins/jobhunt-kit/scripts/tracker.mjs +332 -0
  35. package/plugins/jobhunt-kit/skills/job-apply/SKILL.md +61 -0
  36. package/plugins/jobhunt-kit/skills/job-profile/SKILL.md +33 -0
  37. package/plugins/jobhunt-kit/skills/job-resume/SKILL.md +29 -0
  38. package/plugins/jobhunt-kit/skills/job-search/SKILL.md +39 -0
  39. package/plugins/jobhunt-kit/skills/job-track/SKILL.md +30 -0
  40. package/plugins/jobhunt-kit/templates/cover-letter.md +17 -0
  41. package/plugins/jobhunt-kit/templates/intake.md +62 -0
  42. package/plugins/jobhunt-kit/templates/policy.json +6 -0
  43. package/plugins/jobhunt-kit/templates/profile.json +29 -0
  44. package/plugins/jobhunt-kit/templates/profile.md +21 -0
  45. package/plugins/jobhunt-kit/templates/resume-review.md +30 -0
  46. package/plugins/jobhunt-kit/templates/scheduled-search.md +21 -0
  47. package/scripts/check-package.mjs +62 -0
  48. package/tests/commands.test.mjs +143 -0
  49. package/tests/installer.test.mjs +52 -0
  50. package/tests/tracker.test.mjs +180 -0
@@ -0,0 +1,492 @@
1
+ {
2
+ "name": "jobhunt-kit-plugin",
3
+ "version": "0.2.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "jobhunt-kit-plugin",
9
+ "version": "0.2.0",
10
+ "dependencies": {
11
+ "hirify-cli": "0.4.5",
12
+ "mammoth": "1.12.2",
13
+ "pdf-parse": "2.4.5"
14
+ },
15
+ "engines": {
16
+ "node": ">=24.0.0"
17
+ }
18
+ },
19
+ "node_modules/@napi-rs/canvas": {
20
+ "version": "0.1.80",
21
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz",
22
+ "integrity": "sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==",
23
+ "license": "MIT",
24
+ "workspaces": [
25
+ "e2e/*"
26
+ ],
27
+ "engines": {
28
+ "node": ">= 10"
29
+ },
30
+ "optionalDependencies": {
31
+ "@napi-rs/canvas-android-arm64": "0.1.80",
32
+ "@napi-rs/canvas-darwin-arm64": "0.1.80",
33
+ "@napi-rs/canvas-darwin-x64": "0.1.80",
34
+ "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.80",
35
+ "@napi-rs/canvas-linux-arm64-gnu": "0.1.80",
36
+ "@napi-rs/canvas-linux-arm64-musl": "0.1.80",
37
+ "@napi-rs/canvas-linux-riscv64-gnu": "0.1.80",
38
+ "@napi-rs/canvas-linux-x64-gnu": "0.1.80",
39
+ "@napi-rs/canvas-linux-x64-musl": "0.1.80",
40
+ "@napi-rs/canvas-win32-x64-msvc": "0.1.80"
41
+ }
42
+ },
43
+ "node_modules/@napi-rs/canvas-android-arm64": {
44
+ "version": "0.1.80",
45
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz",
46
+ "integrity": "sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==",
47
+ "cpu": [
48
+ "arm64"
49
+ ],
50
+ "license": "MIT",
51
+ "optional": true,
52
+ "os": [
53
+ "android"
54
+ ],
55
+ "engines": {
56
+ "node": ">= 10"
57
+ }
58
+ },
59
+ "node_modules/@napi-rs/canvas-darwin-arm64": {
60
+ "version": "0.1.80",
61
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz",
62
+ "integrity": "sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==",
63
+ "cpu": [
64
+ "arm64"
65
+ ],
66
+ "license": "MIT",
67
+ "optional": true,
68
+ "os": [
69
+ "darwin"
70
+ ],
71
+ "engines": {
72
+ "node": ">= 10"
73
+ }
74
+ },
75
+ "node_modules/@napi-rs/canvas-darwin-x64": {
76
+ "version": "0.1.80",
77
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz",
78
+ "integrity": "sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==",
79
+ "cpu": [
80
+ "x64"
81
+ ],
82
+ "license": "MIT",
83
+ "optional": true,
84
+ "os": [
85
+ "darwin"
86
+ ],
87
+ "engines": {
88
+ "node": ">= 10"
89
+ }
90
+ },
91
+ "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": {
92
+ "version": "0.1.80",
93
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz",
94
+ "integrity": "sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==",
95
+ "cpu": [
96
+ "arm"
97
+ ],
98
+ "license": "MIT",
99
+ "optional": true,
100
+ "os": [
101
+ "linux"
102
+ ],
103
+ "engines": {
104
+ "node": ">= 10"
105
+ }
106
+ },
107
+ "node_modules/@napi-rs/canvas-linux-arm64-gnu": {
108
+ "version": "0.1.80",
109
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz",
110
+ "integrity": "sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==",
111
+ "cpu": [
112
+ "arm64"
113
+ ],
114
+ "libc": [
115
+ "glibc"
116
+ ],
117
+ "license": "MIT",
118
+ "optional": true,
119
+ "os": [
120
+ "linux"
121
+ ],
122
+ "engines": {
123
+ "node": ">= 10"
124
+ }
125
+ },
126
+ "node_modules/@napi-rs/canvas-linux-arm64-musl": {
127
+ "version": "0.1.80",
128
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz",
129
+ "integrity": "sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==",
130
+ "cpu": [
131
+ "arm64"
132
+ ],
133
+ "libc": [
134
+ "musl"
135
+ ],
136
+ "license": "MIT",
137
+ "optional": true,
138
+ "os": [
139
+ "linux"
140
+ ],
141
+ "engines": {
142
+ "node": ">= 10"
143
+ }
144
+ },
145
+ "node_modules/@napi-rs/canvas-linux-riscv64-gnu": {
146
+ "version": "0.1.80",
147
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz",
148
+ "integrity": "sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==",
149
+ "cpu": [
150
+ "riscv64"
151
+ ],
152
+ "libc": [
153
+ "glibc"
154
+ ],
155
+ "license": "MIT",
156
+ "optional": true,
157
+ "os": [
158
+ "linux"
159
+ ],
160
+ "engines": {
161
+ "node": ">= 10"
162
+ }
163
+ },
164
+ "node_modules/@napi-rs/canvas-linux-x64-gnu": {
165
+ "version": "0.1.80",
166
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz",
167
+ "integrity": "sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==",
168
+ "cpu": [
169
+ "x64"
170
+ ],
171
+ "libc": [
172
+ "glibc"
173
+ ],
174
+ "license": "MIT",
175
+ "optional": true,
176
+ "os": [
177
+ "linux"
178
+ ],
179
+ "engines": {
180
+ "node": ">= 10"
181
+ }
182
+ },
183
+ "node_modules/@napi-rs/canvas-linux-x64-musl": {
184
+ "version": "0.1.80",
185
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz",
186
+ "integrity": "sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==",
187
+ "cpu": [
188
+ "x64"
189
+ ],
190
+ "libc": [
191
+ "musl"
192
+ ],
193
+ "license": "MIT",
194
+ "optional": true,
195
+ "os": [
196
+ "linux"
197
+ ],
198
+ "engines": {
199
+ "node": ">= 10"
200
+ }
201
+ },
202
+ "node_modules/@napi-rs/canvas-win32-x64-msvc": {
203
+ "version": "0.1.80",
204
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz",
205
+ "integrity": "sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==",
206
+ "cpu": [
207
+ "x64"
208
+ ],
209
+ "license": "MIT",
210
+ "optional": true,
211
+ "os": [
212
+ "win32"
213
+ ],
214
+ "engines": {
215
+ "node": ">= 10"
216
+ }
217
+ },
218
+ "node_modules/@xmldom/xmldom": {
219
+ "version": "0.8.15",
220
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.15.tgz",
221
+ "integrity": "sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==",
222
+ "license": "MIT",
223
+ "engines": {
224
+ "node": ">=10.0.0"
225
+ }
226
+ },
227
+ "node_modules/argparse": {
228
+ "version": "1.0.10",
229
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
230
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
231
+ "license": "MIT",
232
+ "dependencies": {
233
+ "sprintf-js": "~1.0.2"
234
+ }
235
+ },
236
+ "node_modules/base64-js": {
237
+ "version": "1.5.1",
238
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
239
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
240
+ "funding": [
241
+ {
242
+ "type": "github",
243
+ "url": "https://github.com/sponsors/feross"
244
+ },
245
+ {
246
+ "type": "patreon",
247
+ "url": "https://www.patreon.com/feross"
248
+ },
249
+ {
250
+ "type": "consulting",
251
+ "url": "https://feross.org/support"
252
+ }
253
+ ],
254
+ "license": "MIT"
255
+ },
256
+ "node_modules/bluebird": {
257
+ "version": "3.4.7",
258
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz",
259
+ "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==",
260
+ "license": "MIT"
261
+ },
262
+ "node_modules/core-util-is": {
263
+ "version": "1.0.3",
264
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
265
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
266
+ "license": "MIT"
267
+ },
268
+ "node_modules/dingbat-to-unicode": {
269
+ "version": "1.0.1",
270
+ "resolved": "https://registry.npmjs.org/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz",
271
+ "integrity": "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==",
272
+ "license": "BSD-2-Clause"
273
+ },
274
+ "node_modules/duck": {
275
+ "version": "0.1.12",
276
+ "resolved": "https://registry.npmjs.org/duck/-/duck-0.1.12.tgz",
277
+ "integrity": "sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==",
278
+ "license": "BSD",
279
+ "dependencies": {
280
+ "underscore": "^1.13.1"
281
+ }
282
+ },
283
+ "node_modules/hirify-cli": {
284
+ "version": "0.4.5",
285
+ "resolved": "https://registry.npmjs.org/hirify-cli/-/hirify-cli-0.4.5.tgz",
286
+ "integrity": "sha512-dyuZTXk25d5d5RA8CxnT9RQTnK+GBU6P/ke4roOPJz3PQTVhobPDN8O+A9PdFISwpxNW3EiCfS996U362ZRnNw==",
287
+ "license": "Apache-2.0",
288
+ "bin": {
289
+ "hirify": "bin/hirify.js"
290
+ },
291
+ "engines": {
292
+ "node": ">=18"
293
+ }
294
+ },
295
+ "node_modules/immediate": {
296
+ "version": "3.0.6",
297
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
298
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
299
+ "license": "MIT"
300
+ },
301
+ "node_modules/inherits": {
302
+ "version": "2.0.4",
303
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
304
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
305
+ "license": "ISC"
306
+ },
307
+ "node_modules/isarray": {
308
+ "version": "1.0.0",
309
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
310
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
311
+ "license": "MIT"
312
+ },
313
+ "node_modules/jszip": {
314
+ "version": "3.10.1",
315
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
316
+ "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
317
+ "license": "(MIT OR GPL-3.0-or-later)",
318
+ "dependencies": {
319
+ "lie": "~3.3.0",
320
+ "pako": "~1.0.2",
321
+ "readable-stream": "~2.3.6",
322
+ "setimmediate": "^1.0.5"
323
+ }
324
+ },
325
+ "node_modules/lie": {
326
+ "version": "3.3.0",
327
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
328
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
329
+ "license": "MIT",
330
+ "dependencies": {
331
+ "immediate": "~3.0.5"
332
+ }
333
+ },
334
+ "node_modules/lop": {
335
+ "version": "0.4.2",
336
+ "resolved": "https://registry.npmjs.org/lop/-/lop-0.4.2.tgz",
337
+ "integrity": "sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==",
338
+ "license": "BSD-2-Clause",
339
+ "dependencies": {
340
+ "duck": "^0.1.12",
341
+ "option": "~0.2.1",
342
+ "underscore": "^1.13.1"
343
+ }
344
+ },
345
+ "node_modules/mammoth": {
346
+ "version": "1.12.2",
347
+ "resolved": "https://registry.npmjs.org/mammoth/-/mammoth-1.12.2.tgz",
348
+ "integrity": "sha512-MH2vkgafD/2MYUaEOtoXLKrHQZ7yLYTHGQgyLNtYZHiUxU1K1QQ+8qMFquDAfhBm06wSGSws3J+Q9QTsKtR44g==",
349
+ "license": "BSD-2-Clause",
350
+ "dependencies": {
351
+ "@xmldom/xmldom": "^0.8.6",
352
+ "argparse": "~1.0.3",
353
+ "base64-js": "^1.5.1",
354
+ "bluebird": "~3.4.0",
355
+ "dingbat-to-unicode": "^1.0.1",
356
+ "jszip": "^3.7.1",
357
+ "lop": "^0.4.2",
358
+ "path-is-absolute": "^1.0.0",
359
+ "underscore": "^1.13.1",
360
+ "xmlbuilder": "^10.0.0"
361
+ },
362
+ "bin": {
363
+ "mammoth": "bin/mammoth"
364
+ },
365
+ "engines": {
366
+ "node": ">=12.0.0"
367
+ }
368
+ },
369
+ "node_modules/option": {
370
+ "version": "0.2.4",
371
+ "resolved": "https://registry.npmjs.org/option/-/option-0.2.4.tgz",
372
+ "integrity": "sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==",
373
+ "license": "BSD-2-Clause"
374
+ },
375
+ "node_modules/pako": {
376
+ "version": "1.0.11",
377
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
378
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
379
+ "license": "(MIT AND Zlib)"
380
+ },
381
+ "node_modules/path-is-absolute": {
382
+ "version": "1.0.1",
383
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
384
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
385
+ "license": "MIT",
386
+ "engines": {
387
+ "node": ">=0.10.0"
388
+ }
389
+ },
390
+ "node_modules/pdf-parse": {
391
+ "version": "2.4.5",
392
+ "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-2.4.5.tgz",
393
+ "integrity": "sha512-mHU89HGh7v+4u2ubfnevJ03lmPgQ5WU4CxAVmTSh/sxVTEDYd1er/dKS/A6vg77NX47KTEoihq8jZBLr8Cxuwg==",
394
+ "license": "Apache-2.0",
395
+ "dependencies": {
396
+ "@napi-rs/canvas": "0.1.80",
397
+ "pdfjs-dist": "5.4.296"
398
+ },
399
+ "bin": {
400
+ "pdf-parse": "bin/cli.mjs"
401
+ },
402
+ "engines": {
403
+ "node": ">=20.16.0 <21 || >=22.3.0"
404
+ },
405
+ "funding": {
406
+ "type": "github",
407
+ "url": "https://github.com/sponsors/mehmet-kozan"
408
+ }
409
+ },
410
+ "node_modules/pdfjs-dist": {
411
+ "version": "5.4.296",
412
+ "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.296.tgz",
413
+ "integrity": "sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==",
414
+ "license": "Apache-2.0",
415
+ "engines": {
416
+ "node": ">=20.16.0 || >=22.3.0"
417
+ },
418
+ "optionalDependencies": {
419
+ "@napi-rs/canvas": "^0.1.80"
420
+ }
421
+ },
422
+ "node_modules/process-nextick-args": {
423
+ "version": "2.0.1",
424
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
425
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
426
+ "license": "MIT"
427
+ },
428
+ "node_modules/readable-stream": {
429
+ "version": "2.3.8",
430
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
431
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
432
+ "license": "MIT",
433
+ "dependencies": {
434
+ "core-util-is": "~1.0.0",
435
+ "inherits": "~2.0.3",
436
+ "isarray": "~1.0.0",
437
+ "process-nextick-args": "~2.0.0",
438
+ "safe-buffer": "~5.1.1",
439
+ "string_decoder": "~1.1.1",
440
+ "util-deprecate": "~1.0.1"
441
+ }
442
+ },
443
+ "node_modules/safe-buffer": {
444
+ "version": "5.1.2",
445
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
446
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
447
+ "license": "MIT"
448
+ },
449
+ "node_modules/setimmediate": {
450
+ "version": "1.0.5",
451
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
452
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
453
+ "license": "MIT"
454
+ },
455
+ "node_modules/sprintf-js": {
456
+ "version": "1.0.3",
457
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
458
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
459
+ "license": "BSD-3-Clause"
460
+ },
461
+ "node_modules/string_decoder": {
462
+ "version": "1.1.1",
463
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
464
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
465
+ "license": "MIT",
466
+ "dependencies": {
467
+ "safe-buffer": "~5.1.0"
468
+ }
469
+ },
470
+ "node_modules/underscore": {
471
+ "version": "1.13.8",
472
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz",
473
+ "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==",
474
+ "license": "MIT"
475
+ },
476
+ "node_modules/util-deprecate": {
477
+ "version": "1.0.2",
478
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
479
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
480
+ "license": "MIT"
481
+ },
482
+ "node_modules/xmlbuilder": {
483
+ "version": "10.1.1",
484
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
485
+ "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==",
486
+ "license": "MIT",
487
+ "engines": {
488
+ "node": ">=4.0"
489
+ }
490
+ }
491
+ }
492
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "jobhunt-kit-plugin",
3
+ "version": "0.2.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=24.0.0"
8
+ },
9
+ "dependencies": {
10
+ "hirify-cli": "0.4.5",
11
+ "mammoth": "1.12.2",
12
+ "pdf-parse": "2.4.5"
13
+ }
14
+ }
@@ -0,0 +1,125 @@
1
+ # Команды рабочих сценариев
2
+
3
+ Установка: `npx jobhunt-kit install [папка]`.
4
+ Без пути создаётся `./my-jobhunt`. Старый `init <папка>` также поддерживается.
5
+ Из установленной папки: `npx jobhunt-kit <команда>`.
6
+ Из другой папки: `npx jobhunt-kit <команда> --workspace <папка>`.
7
+
8
+ В переносимом плагине доступны те же рабочие команды:
9
+ `node <P>/scripts/cli.mjs <команда> --data <D>`. Для работы непосредственно в исходниках:
10
+ `node bin/jobhunt-kit.mjs <команда>`. Тексты JSON писать в файлы, не собирать строкой shell.
11
+ Все рабочие команды возвращают JSON; исключения — help и установщик. Ошибка даёт
12
+ ненулевой exit. Данные по умолчанию — `<workspace>/local/jobhunt-kit`.
13
+
14
+ ## Команды и работа агента
15
+
16
+ | Скилл | Детерминированная часть | Что остаётся у агента |
17
+ |---|---|---|
18
+ | job-profile | Пустая анкета, проверка структуры/ссылок evidence/зарплаты, сохранение, сброс и запись подтверждения | Интервью, интерпретация опыта, уточнение противоречий, получение настоящего согласия |
19
+ | job-resume | Копия по SHA-256, извлечение PDF/DOCX/TXT/MD, простые проверки текста, сохранение отчёта, запись завершённой проверки | Визуальная оценка, истинность фактов, соответствие роли и содержательные правки |
20
+ | job-search | Сбор профиля, бюджетов и известных вакансий; журнал запусков/результатов, запрет второго активного запуска через CLI | Актуальные фильтры Hirify, preview, живой поиск, оценка требований и ранжирование |
21
+ | job-apply | Снимок черновика, экспорт текста/ответов, согласование, резервирование и однократный вызов CLI, запись исхода | Написание письма из фактов, проверка живого профиля/квоты, получение разрешения, разбор ответа сервиса |
22
+ | job-track | Списки/история/статусы/Markdown; заполнение prompt для расписания | Интерпретация сообщения кандидата, создание задачи в планировщике после запроса |
23
+
24
+ Технические функции: `profile.mjs`, `resume.mjs`, `extract-resume.mjs`, `commands.mjs`;
25
+ история и защита отправки переиспользуют `tracker.mjs` и `send-packet.mjs`.
26
+ Команды не запускают встроенную LLM и не требуют отдельного AI API-ключа.
27
+
28
+ ## Профиль и резюме
29
+
30
+ ```text
31
+ npx jobhunt-kit doctor
32
+ npx jobhunt-kit profile init
33
+ npx jobhunt-kit profile show
34
+ npx jobhunt-kit profile check
35
+ npx jobhunt-kit profile save --input local/jobhunt-kit/materials/profile-draft.json
36
+ npx jobhunt-kit profile confirm --note "Пользователь подтвердил перечисленные факты и условия"
37
+ npx jobhunt-kit resume ./resume.pdf
38
+ npx jobhunt-kit resume check
39
+ npx jobhunt-kit resume reviewed --input local/jobhunt-kit/materials/review-result.json
40
+ ```
41
+
42
+ `doctor` проверяет только локальное окружение; не читает аккаунт и не создаёт профиль.
43
+ `profile save` принимает полный профиль, проверяет структуру и сбрасывает confirmed_at.
44
+ Сам факт прохождения валидации не подтверждает биографию. `confirm` использовать
45
+ только после реального подтверждения; текст в примере не заменяет ответ пользователя.
46
+
47
+ `resume <file>` сохраняет копию в resumes/<sha256>.<ext>, привязывает её к профилю
48
+ и запускает механические проверки. Новая версия сбрасывает подтверждение профиля.
49
+ PDF извлекается через pdf-parse, DOCX — mammoth, TXT/MD — UTF-8; DOC/RTF сначала
50
+ нужно экспортировать в поддерживаемый формат. OCR и визуальный рендер не выполняются.
51
+ PDF/DOCX обрабатываются локально в дочернем процессе с тайм-аутом 60 секунд.
52
+
53
+ В materials/resume-<sha256>/ появляются checks.json, text.txt (если извлечение удалось)
54
+ и review.md для агента. Уже заполненный review.md не перезаписывается.
55
+ Проверки email/заголовка — простые эвристики, а не ATS-тест. Даже успешное извлечение
56
+ не устанавливает ready. Ошибка парсера записывается в findings, сохраняя файл и
57
+ диагностику; агент проверяет поле text_extraction, а не только exit процесса.
58
+
59
+ Формат review-result.json после фактической проверки агентом:
60
+
61
+ ```json
62
+ {
63
+ "sha256": "хеш проверенной версии файла",
64
+ "status": "ready",
65
+ "checks": { "text": "pass", "visual": "pass", "facts": "pass" },
66
+ "evidence": "Что и каким инструментом проверено; ссылка на отчёт и подтверждение кандидата"
67
+ }
68
+ ```
69
+
70
+ Можно записать needs_changes. Ready требует всех трёх checks=pass и совпадающего
71
+ хеша; запись не заменяет сами проверки. После изменения review потребуется profile confirm.
72
+
73
+ ## Поиск и отклики
74
+
75
+ ```text
76
+ npx jobhunt-kit search
77
+ npx jobhunt-kit search start --input run.json
78
+ npx jobhunt-kit search event --input event.json
79
+ npx jobhunt-kit search record --input vacancy.json
80
+ npx jobhunt-kit search finish --input result.json
81
+ npx jobhunt-kit apply prepare --input draft.json
82
+ npx jobhunt-kit apply preview vacancy-slug
83
+ npx jobhunt-kit apply export vacancy-slug
84
+ npx jobhunt-kit apply approve --input approval.json
85
+ npx jobhunt-kit apply begin vacancy-slug
86
+ npx jobhunt-kit apply send --input local/jobhunt-kit/materials/attempt-UUID.json
87
+ npx jobhunt-kit apply finish --input response.json
88
+ npx jobhunt-kit apply resolve --input verified-outcome.json
89
+ ```
90
+
91
+ `search` готовит search-context.json и search-task.md для агента; **живой поиск ещё
92
+ не выполнен**. Это явно указано в выводе. Форматы записей совпадают с
93
+ [storage.md](storage.md): start=run-start, event=run-event, record=put, finish=run-finish.
94
+ Чтения/preview/поиск Hirify выполняет агент по job-search и сохраняет их результаты.
95
+
96
+ `apply export` сохраняет текст письма, ответы, снимок и handoff.md в отдельную
97
+ папку версии черновика. `begin` сохраняет пакет по уникальному attempt_id и отдаёт
98
+ packet_path. `send` — единственная рабочая команда этого CLI, вызывающая отправку;
99
+ она не получает новое разрешение сама и не обходит проверки трекера.
100
+ Перед ней агент проверяет квоту и серверный профиль. После неё агент разбирает
101
+ достоверный ответ и вызывает finish. При аварии повторная отправка блокируется.
102
+
103
+ ## История, политика и расписание
104
+
105
+ ```text
106
+ npx jobhunt-kit track
107
+ npx jobhunt-kit track show vacancy-slug
108
+ npx jobhunt-kit track status vacancy-slug --input status.json
109
+ npx jobhunt-kit history
110
+ npx jobhunt-kit runs
111
+ npx jobhunt-kit report
112
+ npx jobhunt-kit policy show
113
+ npx jobhunt-kit policy set --input permission.json
114
+ npx jobhunt-kit schedule --input schedule.json
115
+ ```
116
+
117
+ status.json: `{"status":"interview","note":"Источник и дата сообщения кандидата"}`.
118
+ Состояния и формат permission.json — в storage.md. Команда policy set только
119
+ записывает ранее полученное разрешение, не создаёт его.
120
+
121
+ schedule.json: `{"frequency":"По будням в 09:00","timezone":"Europe/Berlin","mode":"search"}`.
122
+ Срок и зона — только пример. Допустимые mode: search/prepare/auto. Результат —
123
+ materials/scheduled-search.md, а не включённая задача; auto-разрешение не выдаётся.
124
+ Нужен --workspace с установленным шаблоном, чтобы prompt не ссылался на временный
125
+ кеш npx. Планировщик выбирает агент по явному запросу пользователя.
@@ -0,0 +1,24 @@
1
+ # Сопроводительное письмо
2
+
3
+ Harvard советует связывать опыт с конкретной ролью и организацией, подкреплять его
4
+ примерами и писать кратко и по существу, обычно в пределах страницы. Известного
5
+ адресата можно назвать; имя не угадывать. Это рекомендация карьерного центра,
6
+ а не ограничение Hirify.
7
+ [Harvard: Cover Letter Tips](https://careerservices.fas.harvard.edu/resources/create-a-strong-resume/#cover-letter-tips).
8
+
9
+ Ниже — собственная процедура шаблона:
10
+
11
+ 1. Выбрать 1–2 наиболее важные задачи вакансии и подтверждённые evidence ID кандидата.
12
+ 2. Сформулировать связь задачи с опытом. Если чисел нет, использовать качественный
13
+ результат; не придумывать экономию, рост, масштабы команды или стаж.
14
+ 3. Мотивацию брать из ответов кандидата. Проверенные факты компании можно использовать
15
+ как контекст, но не превращать их в выдуманное личное восхищение.
16
+ 4. Написать на согласованном языке, в естественном тоне. Короткое поле формы обычно
17
+ требует меньше текста, чем отдельное письмо; текущий лимит CLI проверять по ответу.
18
+ 5. Проверить имя компании/роль, факты, язык, контакты и отсутствие служебных пометок.
19
+ 6. Сохранить точный текст и карту утверждений в draft.json. Ответы анкеты хранить рядом;
20
+ `vacancy apply` передаёт профиль и cover, а не произвольные поля локального банка.
21
+ 7. Показать полный пакет перед индивидуальным согласованием. После содержательной
22
+ правки согласование получить заново. В auto действует отдельно записанное разрешение.
23
+
24
+ Шаблон структуры: [cover-letter.md](../templates/cover-letter.md).