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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openings",
3
- "version": "0.1.0",
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
- Set `OPENINGS_AGGREGATOR_URL` and each source you crawl is reported to that aggregator, which merges reports from every install and publishes the result. New installs then download the published index on first setup instead of crawling every source. Only public job data is sent, never resume content. Leave the variable unset to keep every crawl local.
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
- When `OPENINGS_AGGREGATOR_URL` is set, first-time setup downloads the aggregator's published index before crawling, and every source you crawl is reported back so other installs benefit; only public job data is shared, never your resume. Leave it unset 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.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openings",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "A free, candidate-safe job-search substrate for AI agents",
5
5
  "license": "MIT",
6
6
  "repository": { "type": "git", "url": "git+https://github.com/abhay-avagama/hiring-agent.git" },
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.0" } } };
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() } };
@@ -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();