terminalhire 0.19.0 → 0.19.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.
@@ -4406,7 +4406,8 @@ var init_config = __esm({
4406
4406
  inboundNudgeDisclosed: false,
4407
4407
  contributeEnabled: false,
4408
4408
  contributePrompted: false,
4409
- betaOptIn: false
4409
+ betaOptIn: false,
4410
+ lastFullFeedbackAt: null
4410
4411
  };
4411
4412
  }
4412
4413
  });
@@ -4434,7 +4434,8 @@ var init_config = __esm({
4434
4434
  inboundNudgeDisclosed: false,
4435
4435
  contributeEnabled: false,
4436
4436
  contributePrompted: false,
4437
- betaOptIn: false
4437
+ betaOptIn: false,
4438
+ lastFullFeedbackAt: null
4438
4439
  };
4439
4440
  }
4440
4441
  });
@@ -21,7 +21,8 @@ var DEFAULT_CONFIG = {
21
21
  inboundNudgeDisclosed: false,
22
22
  contributeEnabled: false,
23
23
  contributePrompted: false,
24
- betaOptIn: false
24
+ betaOptIn: false,
25
+ lastFullFeedbackAt: null
25
26
  };
26
27
  function readConfig() {
27
28
  try {
@@ -1646,7 +1646,8 @@ var DEFAULT_CONFIG = {
1646
1646
  inboundNudgeDisclosed: false,
1647
1647
  contributeEnabled: false,
1648
1648
  contributePrompted: false,
1649
- betaOptIn: false
1649
+ betaOptIn: false,
1650
+ lastFullFeedbackAt: null
1650
1651
  };
1651
1652
  function readConfig() {
1652
1653
  try {
@@ -182,7 +182,8 @@ var init_config = __esm({
182
182
  inboundNudgeDisclosed: false,
183
183
  contributeEnabled: false,
184
184
  contributePrompted: false,
185
- betaOptIn: false
185
+ betaOptIn: false,
186
+ lastFullFeedbackAt: null
186
187
  };
187
188
  }
188
189
  });
@@ -38593,7 +38594,7 @@ var init_match_slots = __esm({
38593
38594
  BOUNTY_SLOTS = 3;
38594
38595
  BOUNTY_MIN_MATCH = 0.5;
38595
38596
  INTEREST_CONTRIBUTE_SLOTS = 1;
38596
- INTEREST_SLOT_LABEL = "Exploring";
38597
+ INTEREST_SLOT_LABEL = "Stretch";
38597
38598
  CONTRIBUTE_SLOTS = 5;
38598
38599
  CONTRIBUTE_SLOTS_THIN = 8;
38599
38600
  ROLE_STABLE_MAX = 8;
@@ -39089,49 +39090,53 @@ import { createInterface as createInterface13 } from "readline";
39089
39090
  async function run23() {
39090
39091
  const rl = createInterface13({ input: process.stdin, output: process.stdout });
39091
39092
  const ask3 = (question) => new Promise((resolve2) => {
39092
- let answered = false;
39093
+ const onClose = () => resolve2(null);
39094
+ rl.once("close", onClose);
39093
39095
  rl.question(question, (answer) => {
39094
- answered = true;
39096
+ rl.removeListener("close", onClose);
39095
39097
  resolve2((answer || "").trim());
39096
39098
  });
39097
- rl.once("close", () => {
39098
- if (!answered) resolve2(null);
39099
- });
39100
39099
  });
39101
- console.log("");
39102
- console.log("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510");
39103
- console.log("\u2502 Welcome to the Terminalhire Beta \u2014 Founding Contributor \u2502");
39104
- console.log("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518");
39105
- console.log("");
39106
- console.log(` In a world where everyone's suddenly an "AI engineer," Terminalhire is`);
39107
- console.log(" third-party-verified, hard-to-game proof you're real \u2014 not a r\xE9sum\xE9, a");
39108
- console.log(" record of contributions accepted by people who don't know you.");
39109
- console.log("");
39110
- console.log(" You've been invited to help shape it while the core is still baking.");
39111
- console.log("");
39112
- console.log("The deal \u2014 two small asks, four real rewards.");
39113
- console.log("");
39114
- console.log(" Two asks:");
39115
- console.log(" 1. Use it on real work and keep it installed \u2014 the honest test of");
39116
- console.log(" whether it earns its place in your terminal.");
39117
- console.log(" 2. When something breaks or annoys you, tell us: `terminalhire feedback`");
39118
- console.log(" (2 minutes, goes straight to the founder).");
39119
- console.log("");
39120
- console.log(" Four rewards:");
39121
- console.log(" \u2022 A Founding-Contributor mark on your credential.");
39122
- console.log(" \u2022 A direct line to the founder \u2014 the person who ships the fix.");
39123
- console.log(" \u2022 Bounties on the issues your feedback surfaces \u2014 get paid for the");
39124
- console.log(" rough edges you find.");
39125
- console.log(" \u2022 A spot on the founding-contributors wall.");
39126
- console.log("");
39127
- const join33 = await ask3(' Type "yes" to join the beta as a Founding Contributor (anything else cancels): ');
39128
- if ((join33 || "").toLowerCase() !== "yes") {
39129
- console.log("\n No problem \u2014 nothing was sent. Run `terminalhire beta` any time.\n");
39130
- rl.close();
39131
- return;
39100
+ const alreadyActed = readConfig().betaOptIn === true;
39101
+ let listPublicly = false;
39102
+ if (!alreadyActed) {
39103
+ console.log("");
39104
+ console.log("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510");
39105
+ console.log("\u2502 Welcome to the Terminalhire Beta \u2014 Founding Contributor \u2502");
39106
+ console.log("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518");
39107
+ console.log("");
39108
+ console.log(` In a world where everyone's suddenly an "AI engineer," Terminalhire is`);
39109
+ console.log(" third-party-verified, hard-to-game proof you're real \u2014 not a r\xE9sum\xE9, a");
39110
+ console.log(" record of contributions accepted by people who don't know you.");
39111
+ console.log("");
39112
+ console.log(" You've been invited to help shape it while the core is still baking.");
39113
+ console.log("");
39114
+ console.log("The deal \u2014 two small asks, four real rewards.");
39115
+ console.log("");
39116
+ console.log(" Two asks:");
39117
+ console.log(" 1. Use it on real work and keep it installed \u2014 the honest test of");
39118
+ console.log(" whether it earns its place in your terminal.");
39119
+ console.log(" 2. When something breaks or annoys you, tell us: `terminalhire feedback`");
39120
+ console.log(" (2 minutes, goes straight to the founder).");
39121
+ console.log("");
39122
+ console.log(" Four rewards:");
39123
+ console.log(" \u2022 A Founding-Contributor mark on your credential.");
39124
+ console.log(" \u2022 A direct line to the founder \u2014 the person who ships the fix.");
39125
+ console.log(" \u2022 Bounties on the issues your feedback surfaces \u2014 get paid for the");
39126
+ console.log(" rough edges you find.");
39127
+ console.log(" \u2022 A spot on the founding-contributors wall.");
39128
+ console.log("");
39129
+ const join33 = await ask3(' Type "yes" to join the beta as a Founding Contributor (anything else cancels): ');
39130
+ if ((join33 || "").toLowerCase() !== "yes") {
39131
+ console.log("\n No problem \u2014 nothing was sent. Run `terminalhire beta` any time.\n");
39132
+ rl.close();
39133
+ return;
39134
+ }
39135
+ const listAns = await ask3(" List me publicly as a Founding Contributor? [y/N] (Enter = no): ");
39136
+ listPublicly = ["y", "yes"].includes((listAns || "").toLowerCase());
39137
+ } else {
39138
+ console.log("\n You've already opted in to the Terminalhire beta \u2014 checking your status\u2026");
39132
39139
  }
39133
- const listAns = await ask3(" List me publicly as a Founding Contributor? [y/N] (Enter = no): ");
39134
- const listPublicly = ["y", "yes"].includes((listAns || "").toLowerCase());
39135
39140
  rl.close();
39136
39141
  const cookie = readWebSessionCookie();
39137
39142
  if (!cookie) {
@@ -39144,7 +39149,9 @@ async function run23() {
39144
39149
  res = await fetch(`${API_BASE}/api/beta/join`, {
39145
39150
  method: "POST",
39146
39151
  headers: { "Content-Type": "application/json", Cookie: `${GH_SESSION_COOKIE8}=${cookie}` },
39147
- body: JSON.stringify({ listPublicly }),
39152
+ // First run: the prompt-gathered consent. Re-run: the CONSTANT empty body —
39153
+ // a status re-check that carries no user-authored data (see RERUN_STATUS_BODY).
39154
+ body: JSON.stringify(alreadyActed ? RERUN_STATUS_BODY : { listPublicly }),
39148
39155
  signal: AbortSignal.timeout(1e4)
39149
39156
  });
39150
39157
  } catch (err) {
@@ -39153,34 +39160,39 @@ async function run23() {
39153
39160
  `);
39154
39161
  return;
39155
39162
  }
39156
- if (res.status === 401) {
39157
- console.log("\n Your linked web session expired.");
39163
+ if (res.status === 401 || res.status === 403) {
39164
+ console.log("\n Your linked web session isn't valid anymore.");
39158
39165
  console.log(" Run `terminalhire link` to reconnect this terminal, then re-run.\n");
39159
39166
  return;
39160
39167
  }
39161
- if (res.status === 403) {
39162
- console.log("\n The beta is invite-only right now \u2014 your GitHub login is not on the");
39163
- console.log(" Founding-Contributor allowlist yet. Hang tight; it opens wider soon.\n");
39164
- return;
39165
- }
39166
- if (!res.ok) {
39168
+ if (res.status !== 200 && res.status !== 202) {
39167
39169
  console.error(`
39168
39170
  Request failed: /api/beta/join returned ${res.status}.
39169
39171
  `);
39170
39172
  return;
39171
39173
  }
39174
+ let status;
39172
39175
  let memberNo;
39173
39176
  try {
39174
39177
  const data = await res.json();
39178
+ status = typeof data.status === "string" ? data.status : null;
39175
39179
  memberNo = typeof data.memberNo === "number" ? data.memberNo : null;
39176
39180
  } catch {
39177
39181
  }
39182
+ if (status !== "active" && status !== "requested") {
39183
+ status = res.status === 202 ? "requested" : "active";
39184
+ }
39178
39185
  writeConfig({ betaOptIn: true });
39186
+ if (status === "requested") {
39187
+ console.log("\n \u2713 You're on the list.");
39188
+ console.log(" Invites go out in small batches \u2014 run `terminalhire beta` anytime to check your status.\n");
39189
+ return;
39190
+ }
39179
39191
  console.log(`
39180
39192
  \u2713 Founding Contributor${memberNo !== null && memberNo !== void 0 ? ` #${memberNo}` : ""}`);
39181
39193
  console.log(" Leave feedback any time: terminalhire feedback\n");
39182
39194
  }
39183
- var API_BASE, GH_SESSION_COOKIE8;
39195
+ var API_BASE, GH_SESSION_COOKIE8, RERUN_STATUS_BODY;
39184
39196
  var init_jpi_beta = __esm({
39185
39197
  "bin/jpi-beta.js"() {
39186
39198
  "use strict";
@@ -39188,6 +39200,7 @@ var init_jpi_beta = __esm({
39188
39200
  init_config();
39189
39201
  API_BASE = process.env["TERMINALHIRE_API_URL"] || "https://terminalhire.com";
39190
39202
  GH_SESSION_COOKIE8 = "__jpi_gh_session";
39203
+ RERUN_STATUS_BODY = {};
39191
39204
  }
39192
39205
  });
39193
39206
 
@@ -39215,18 +39228,22 @@ function readLocalVersion2() {
39215
39228
  async function run24() {
39216
39229
  const rl = createInterface14({ input: process.stdin, output: process.stdout });
39217
39230
  const ask3 = (question) => new Promise((resolve2) => {
39218
- let answered = false;
39231
+ const onClose = () => resolve2(null);
39232
+ rl.once("close", onClose);
39219
39233
  rl.question(question, (answer) => {
39220
- answered = true;
39234
+ rl.removeListener("close", onClose);
39221
39235
  resolve2((answer || "").trim());
39222
39236
  });
39223
- rl.once("close", () => {
39224
- if (!answered) resolve2(null);
39225
- });
39226
39237
  });
39238
+ const lastFull = readConfig().lastFullFeedbackAt;
39239
+ const fullDue = !lastFull || Date.now() - Date.parse(lastFull) >= FULL_FORM_INTERVAL_MS;
39240
+ const fullForm = process.argv.includes("--full") || fullDue;
39227
39241
  console.log("");
39228
39242
  console.log(" terminalhire feedback \u2014 goes straight to the founder. Everything below is");
39229
39243
  console.log(" what YOU type; the only thing auto-attached is your CLI version + OS.");
39244
+ if (!fullForm) {
39245
+ console.log(" (quick form \u2014 run `terminalhire feedback --full` for ratings + the long form)");
39246
+ }
39230
39247
  console.log("");
39231
39248
  console.log(" What is this about?");
39232
39249
  CATEGORY_LABELS.forEach((label, i) => console.log(` ${i + 1}) ${label}`));
@@ -39240,15 +39257,19 @@ async function run24() {
39240
39257
  const category = CATEGORIES[catIdx - 1];
39241
39258
  const tryingToDo = await ask3(" What were you trying to do? (Enter to skip): ");
39242
39259
  const expectedVsActual = await ask3(" What did you expect vs. what happened? (Enter to skip): ");
39243
- console.log(" Rate 1\u20135 (Enter to skip any):");
39244
39260
  const ratings = {};
39245
- for (const key of RATING_KEYS) {
39246
- const ans = await ask3(` ${key}: `);
39247
- const n = Number.parseInt(ans || "", 10);
39248
- if (n >= 1 && n <= 5) ratings[key] = n;
39261
+ let almostQuit = null;
39262
+ let keepInstalled = null;
39263
+ if (fullForm) {
39264
+ console.log(" Rate 1\u20135 (Enter to skip any):");
39265
+ for (const key of RATING_KEYS) {
39266
+ const ans = await ask3(` ${key}: `);
39267
+ const n = Number.parseInt(ans || "", 10);
39268
+ if (n >= 1 && n <= 5) ratings[key] = n;
39269
+ }
39270
+ almostQuit = await ask3(" What almost made you quit / uninstall? (Enter to skip): ");
39271
+ keepInstalled = await ask3(" Will you keep it installed? y/n + why (Enter to skip): ");
39249
39272
  }
39250
- const almostQuit = await ask3(" What almost made you quit / uninstall? (Enter to skip): ");
39251
- const keepInstalled = await ask3(" Will you keep it installed? y/n + why (Enter to skip): ");
39252
39273
  const payload = { category };
39253
39274
  if (tryingToDo) payload.tryingToDo = tryingToDo;
39254
39275
  if (expectedVsActual) payload.expectedVsActual = expectedVsActual;
@@ -39310,13 +39331,16 @@ async function run24() {
39310
39331
  `);
39311
39332
  return;
39312
39333
  }
39334
+ if (fullForm) writeConfig({ lastFullFeedbackAt: (/* @__PURE__ */ new Date()).toISOString() });
39313
39335
  console.log("\n \u2713 Sent \u2014 thank you. This goes straight to the founder.\n");
39314
39336
  }
39315
- var __dirname6, API_BASE2, GH_SESSION_COOKIE9, CATEGORIES, CATEGORY_LABELS, RATING_KEYS;
39337
+ var FULL_FORM_INTERVAL_MS, __dirname6, API_BASE2, GH_SESSION_COOKIE9, CATEGORIES, CATEGORY_LABELS, RATING_KEYS;
39316
39338
  var init_jpi_feedback = __esm({
39317
39339
  "bin/jpi-feedback.js"() {
39318
39340
  "use strict";
39319
39341
  init_web_session();
39342
+ init_config();
39343
+ FULL_FORM_INTERVAL_MS = 7 * 24 * 60 * 60 * 1e3;
39320
39344
  __dirname6 = fileURLToPath7(new URL(".", import.meta.url));
39321
39345
  API_BASE2 = process.env["TERMINALHIRE_API_URL"] || "https://terminalhire.com";
39322
39346
  GH_SESSION_COOKIE9 = "__jpi_gh_session";
@@ -4434,7 +4434,8 @@ var init_config = __esm({
4434
4434
  inboundNudgeDisclosed: false,
4435
4435
  contributeEnabled: false,
4436
4436
  contributePrompted: false,
4437
- betaOptIn: false
4437
+ betaOptIn: false,
4438
+ lastFullFeedbackAt: null
4438
4439
  };
4439
4440
  }
4440
4441
  });
@@ -94,7 +94,8 @@ var init_config = __esm({
94
94
  inboundNudgeDisclosed: false,
95
95
  contributeEnabled: false,
96
96
  contributePrompted: false,
97
- betaOptIn: false
97
+ betaOptIn: false,
98
+ lastFullFeedbackAt: null
98
99
  };
99
100
  }
100
101
  });
@@ -7333,7 +7333,8 @@ var init_config = __esm({
7333
7333
  inboundNudgeDisclosed: false,
7334
7334
  contributeEnabled: false,
7335
7335
  contributePrompted: false,
7336
- betaOptIn: false
7336
+ betaOptIn: false,
7337
+ lastFullFeedbackAt: null
7337
7338
  };
7338
7339
  }
7339
7340
  });
@@ -22178,7 +22178,8 @@ var init_config = __esm({
22178
22178
  inboundNudgeDisclosed: false,
22179
22179
  contributeEnabled: false,
22180
22180
  contributePrompted: false,
22181
- betaOptIn: false
22181
+ betaOptIn: false,
22182
+ lastFullFeedbackAt: null
22182
22183
  };
22183
22184
  }
22184
22185
  });
@@ -120,7 +120,8 @@ var init_config = __esm({
120
120
  inboundNudgeDisclosed: false,
121
121
  contributeEnabled: false,
122
122
  contributePrompted: false,
123
- betaOptIn: false
123
+ betaOptIn: false,
124
+ lastFullFeedbackAt: null
124
125
  };
125
126
  }
126
127
  });
@@ -8414,7 +8415,7 @@ var TOTAL_SLOTS = 25;
8414
8415
  var BOUNTY_SLOTS = 3;
8415
8416
  var BOUNTY_MIN_MATCH = 0.5;
8416
8417
  var INTEREST_CONTRIBUTE_SLOTS = 1;
8417
- var INTEREST_SLOT_LABEL = "Exploring";
8418
+ var INTEREST_SLOT_LABEL = "Stretch";
8418
8419
  var CONTRIBUTE_SLOTS = 5;
8419
8420
  var CONTRIBUTE_SLOTS_THIN = 8;
8420
8421
  var ROLE_STABLE_MAX = 8;
@@ -20,7 +20,8 @@ var DEFAULT_CONFIG = {
20
20
  inboundNudgeDisclosed: false,
21
21
  contributeEnabled: false,
22
22
  contributePrompted: false,
23
- betaOptIn: false
23
+ betaOptIn: false,
24
+ lastFullFeedbackAt: null
24
25
  };
25
26
  function readConfig() {
26
27
  try {
@@ -15,7 +15,8 @@ var DEFAULT_CONFIG = {
15
15
  inboundNudgeDisclosed: false,
16
16
  contributeEnabled: false,
17
17
  contributePrompted: false,
18
- betaOptIn: false
18
+ betaOptIn: false,
19
+ lastFullFeedbackAt: null
19
20
  };
20
21
  function readConfig() {
21
22
  try {
package/dist/src/link.js CHANGED
@@ -105,7 +105,8 @@ var DEFAULT_CONFIG = {
105
105
  inboundNudgeDisclosed: false,
106
106
  contributeEnabled: false,
107
107
  contributePrompted: false,
108
- betaOptIn: false
108
+ betaOptIn: false,
109
+ lastFullFeedbackAt: null
109
110
  };
110
111
  function readConfig() {
111
112
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "terminalhire",
3
- "version": "0.19.0",
3
+ "version": "0.19.1",
4
4
  "description": "Local-first job matching for developers — ambient job matches in the Claude Code spinner. Matching runs on your machine; your profile never leaves it.",
5
5
  "repository": {
6
6
  "type": "git",