openings 0.1.0 → 0.1.2
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/.codex-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/docs/job-seeker-quickstart.md +1 -1
- package/package.json +1 -1
- package/src/locations.ts +5 -1
- package/src/mcp.ts +1 -1
- package/src/package-mcp.ts +2 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openings",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Find evidence-grounded jobs, including relevant roles you may not have searched for, without accounts or API keys.",
|
|
5
5
|
"author": { "name": "Openings contributors" },
|
|
6
6
|
"license": "MIT",
|
package/README.md
CHANGED
|
@@ -91,7 +91,7 @@ The verifier resolves the canonical board endpoint, validates its payload, appli
|
|
|
91
91
|
|
|
92
92
|
## Sharing crawls
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
The packaged server reports each source you crawl to the shared Openings aggregator at `openings.avagama.co`, which merges reports from every install and publishes the result. New installs download the published index on first setup instead of crawling every source. Only public job data is sent, never resume content. Set `OPENINGS_AGGREGATOR_URL` to an empty string to keep every crawl local, or to another URL to use your own aggregator. The source entrypoint reports only when the variable is set.
|
|
95
95
|
|
|
96
96
|
## Privacy
|
|
97
97
|
|
|
@@ -104,6 +104,6 @@ For development from a source checkout, point the server at the absolute `src/mc
|
|
|
104
104
|
}
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
First-time setup downloads the shared index from the Openings aggregator before crawling, and every source you crawl is reported back so other installs benefit; only public job data is shared, never your resume. Set `OPENINGS_AGGREGATOR_URL` to an empty string to keep crawls private. The packaged commands use `~/.openings` by default. The source entrypoint uses `.openings` under the MCP process's working directory unless `OPENINGS_DATA_DIR` is set. The included `.mcp.json` provides the repository-local configuration when this repository is installed as a Codex plugin.
|
|
108
108
|
|
|
109
109
|
The MCP interface exposes setup, coverage, recommendation, fit analysis, resume optimization, search, and job-detail tools. There is no application-submission tool.
|
package/package.json
CHANGED
package/src/locations.ts
CHANGED
|
@@ -118,6 +118,9 @@ function detectEligibleCountries(description: string): string[] {
|
|
|
118
118
|
return matches;
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
+
/** Codes the CLDR region table resolves to a name but that are not current ISO 3166-1 countries: deprecated aliases (DD = Germany, UK = United Kingdom) and non-country groupings. */
|
|
122
|
+
const NON_COUNTRY_CODES = new Set(["AC", "AN", "BU", "CP", "CS", "CT", "DD", "DG", "DY", "EA", "EU", "EZ", "FQ", "FX", "HV", "IC", "JT", "MI", "NH", "NQ", "NT", "PC", "PU", "PZ", "QO", "RH", "SU", "TA", "TP", "UK", "UN", "VD", "WK", "XA", "XB", "XK", "YD", "YU", "ZR", "ZZ"]);
|
|
123
|
+
|
|
121
124
|
let cachedCountryNames: Array<[string, string]> | undefined;
|
|
122
125
|
function countryNames(): Array<[string, string]> {
|
|
123
126
|
if (cachedCountryNames) return cachedCountryNames;
|
|
@@ -126,6 +129,7 @@ function countryNames(): Array<[string, string]> {
|
|
|
126
129
|
for (let first = 65; first <= 90; first += 1) {
|
|
127
130
|
for (let second = 65; second <= 90; second += 1) {
|
|
128
131
|
const code = String.fromCharCode(first, second);
|
|
132
|
+
if (NON_COUNTRY_CODES.has(code)) continue;
|
|
129
133
|
const name = display.of(code);
|
|
130
134
|
if (name && name !== code && !name.startsWith("Unknown Region")) names.push([code, name]);
|
|
131
135
|
}
|
|
@@ -153,7 +157,7 @@ function countryRules(): CountryRule[] {
|
|
|
153
157
|
cachedCountryRules = countryMatchers().map(([code, country]) => ({
|
|
154
158
|
code,
|
|
155
159
|
location: new RegExp(country, "i"),
|
|
156
|
-
codeLocation: new RegExp(`(?:^|[,(/-]\\s*)${code}(?=\\s*(?:$|[,)/-]))`, "i"),
|
|
160
|
+
codeLocation: new RegExp(`(?:^|[,(/-]\\s*)${code === "GB" ? "(?:GB|UK)" : code}(?=\\s*(?:$|[,)/-]))`, "i"),
|
|
157
161
|
exclusion: new RegExp(`\\b(not available|unavailable|excluding|except|cannot hire|can't hire|unable to hire|do not hire|does not hire)\\b.{0,80}(?:${country})|(?:${country}).{0,40}\\b(excluded|not eligible|not supported)\\b`, "i"),
|
|
158
162
|
eligibility: new RegExp(`\\b(open to|hiring|candidates?|applicants?|eligible|remote (?:in|from)|work (?:in|from)|based in|available (?:in|to))\\b.{0,80}(?:${country})`, "i"),
|
|
159
163
|
}));
|
package/src/mcp.ts
CHANGED
|
@@ -22,7 +22,7 @@ export function createMcpHandler(tools: ToolHandler) {
|
|
|
22
22
|
const base = { jsonrpc: "2.0" as const, id: request.id ?? null };
|
|
23
23
|
try {
|
|
24
24
|
if (request.method === "initialize") {
|
|
25
|
-
return { ...base, result: { protocolVersion: "2025-06-18", capabilities: { tools: {} }, serverInfo: { name: "openings", version: "0.1.
|
|
25
|
+
return { ...base, result: { protocolVersion: "2025-06-18", capabilities: { tools: {} }, serverInfo: { name: "openings", version: "0.1.2" } } };
|
|
26
26
|
}
|
|
27
27
|
if (request.method === "ping") return { ...base, result: {} };
|
|
28
28
|
if (request.method === "tools/list") return { ...base, result: { tools: tools.list() } };
|
package/src/package-mcp.ts
CHANGED
|
@@ -3,6 +3,8 @@ import { homedir } from "node:os";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
|
|
5
5
|
process.env.OPENINGS_DATA_DIR ??= join(homedir(), ".openings");
|
|
6
|
+
// Shared index: installs report crawled sources here and seed from it. Set OPENINGS_AGGREGATOR_URL to override, or to "" to keep crawls local.
|
|
7
|
+
process.env.OPENINGS_AGGREGATOR_URL ??= "https://openings.avagama.co";
|
|
6
8
|
|
|
7
9
|
const { serve } = await import("./mcp.ts");
|
|
8
10
|
await serve();
|