terminalhire 0.10.2 → 0.10.4

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.
@@ -4699,9 +4699,9 @@ async function runChatPane(opts = {}) {
4699
4699
  output.write(
4700
4700
  `
4701
4701
  @${peerLogin} isn't reachable for chat yet.
4702
- They may not have opened chat (no encryption key published), or the
4703
- connection is no longer active. Once they run
4704
- terminalhire chat ${target}
4702
+ Chat is end-to-end encrypted, so they need to open chat once to
4703
+ publish their key. As soon as they run
4704
+ terminalhire chat
4705
4705
  on their side, messages will flow.
4706
4706
 
4707
4707
  `
@@ -9634,7 +9634,7 @@ function defaultIntroDeps() {
9634
9634
  try {
9635
9635
  const { readProfile: readProfile2 } = await Promise.resolve().then(() => (init_profile(), profile_exports));
9636
9636
  const profile = await readProfile2();
9637
- return { displayName: profile?.displayName, contactEmail: profile?.contactEmail };
9637
+ return { displayName: profile?.displayName };
9638
9638
  } catch {
9639
9639
  return {};
9640
9640
  }
@@ -9685,7 +9685,7 @@ function renderConsentCard2(payload, deps) {
9685
9685
  }
9686
9686
  async function runIntroRequest(args5, overrides) {
9687
9687
  const deps = { ...defaultIntroDeps(), ...overrides };
9688
- const targetLogin = args5.targetLogin?.trim();
9688
+ const targetLogin = args5.targetLogin?.trim().replace(/^@/, "");
9689
9689
  if (!targetLogin) {
9690
9690
  deps.errorLog('\n Usage: terminalhire intro <github-login> [--note "..."] [--contact <email>] [--name "..."]\n');
9691
9691
  deps.exit(1);
@@ -9704,13 +9704,8 @@ async function runIntroRequest(args5, overrides) {
9704
9704
  }
9705
9705
  const profile = await deps.readProfileContact();
9706
9706
  const displayName = (args5.name ?? profile.displayName ?? requesterLogin).trim();
9707
- const contact = (args5.contact ?? profile.contactEmail ?? "").trim();
9708
- if (!contact) {
9709
- deps.errorLog("\n No contact on file. Set one with `terminalhire profile --edit`,");
9710
- deps.errorLog(" or pass `--contact <email-or-handle>`. Nothing was sent.\n");
9711
- deps.exit(1);
9712
- return;
9713
- }
9707
+ const explicitContact = (args5.contact ?? "").trim();
9708
+ const contact = explicitContact || `@${requesterLogin}`;
9714
9709
  const payload = buildIntroPayload({
9715
9710
  requesterLogin,
9716
9711
  requesterDisplayName: displayName,
@@ -9840,8 +9835,7 @@ async function runIntroDecision(args5, overrides) {
9840
9835
  let contact = "";
9841
9836
  let shareHandle = false;
9842
9837
  if (args5.action === "accept") {
9843
- const profile = await deps.readProfileContact();
9844
- contact = (args5.contact ?? profile.contactEmail ?? "").trim();
9838
+ contact = (args5.contact ?? "").trim();
9845
9839
  shareHandle = contact.length === 0;
9846
9840
  let shareLabel = contact;
9847
9841
  if (shareHandle) {
@@ -9911,8 +9905,11 @@ async function runIntroDecision(args5, overrides) {
9911
9905
  deps.log("\n Declined \u2014 no contact was shared.\n");
9912
9906
  return;
9913
9907
  }
9914
- deps.log("\n Accepted. Your contact was shared with the requester.");
9915
- if (data.contact) deps.log(` You can reach them at: ${data.contact}`);
9908
+ const peer = data.counterpartyLogin;
9909
+ deps.log(`
9910
+ \u2713 Connected${peer ? ` with @${peer}` : ""}.`);
9911
+ if (peer) deps.log(` Message them any time: terminalhire chat @${peer}`);
9912
+ if (data.contact) deps.log(` They also shared: ${data.contact}`);
9916
9913
  deps.log("");
9917
9914
  }
9918
9915
  async function runIntroList(overrides) {
@@ -10839,9 +10836,9 @@ async function runChatPane(opts = {}) {
10839
10836
  output.write(
10840
10837
  `
10841
10838
  @${peerLogin} isn't reachable for chat yet.
10842
- They may not have opened chat (no encryption key published), or the
10843
- connection is no longer active. Once they run
10844
- terminalhire chat ${target}
10839
+ Chat is end-to-end encrypted, so they need to open chat once to
10840
+ publish their key. As soon as they run
10841
+ terminalhire chat
10845
10842
  on their side, messages will flow.
10846
10843
 
10847
10844
  `
@@ -11275,6 +11272,7 @@ async function run10() {
11275
11272
  console.log("\n terminalhire connect \u2014 find and reach other developers, locally matched:");
11276
11273
  console.log(" terminalhire devs Rank opted-in builders & projects for you");
11277
11274
  console.log(' terminalhire project "<title>: <skills>" Declare a project to staff');
11275
+ console.log(" terminalhire connect <github-login> Request a consented intro (alias for `intro`)");
11278
11276
  console.log(" terminalhire intro <github-login> Request a consented intro (double opt-in)");
11279
11277
  console.log(" terminalhire intro --list See intros you have sent + received");
11280
11278
  console.log(" terminalhire chat Message your accepted connections");
@@ -13348,6 +13346,7 @@ if (!firstArg || firstArg === "help" || firstArg === "--help" || firstArg === "-
13348
13346
  console.log(" terminalhire chat <github-login> --read Read a thread inline (last 8; -n N / --all for depth)");
13349
13347
  console.log(' terminalhire chat <github-login> --send "\u2026" Send one line to a connection (E2E encrypted)');
13350
13348
  console.log(" terminalhire chat <github-login> Open the live E2E chat pane with an accepted connection");
13349
+ console.log(" terminalhire connect <github-login> Request a consented intro (alias for `intro`)");
13351
13350
  console.log(" terminalhire connect Connect family overview + inbound-nudge state");
13352
13351
  console.log(" terminalhire connect --mute Stop surfacing incoming connection requests in the spinner");
13353
13352
  console.log(" terminalhire connect --unmute Resume surfacing incoming connection requests");
@@ -13451,6 +13450,14 @@ if (firstArg === "chat") {
13451
13450
  process.exit(0);
13452
13451
  }
13453
13452
  if (firstArg === "connect") {
13453
+ const sub = process.argv[3];
13454
+ const isConnectOwn = !sub || sub === "--mute" || sub === "--unmute";
13455
+ if (!isConnectOwn) {
13456
+ process.argv.splice(2, 1);
13457
+ const mod3 = await Promise.resolve().then(() => (init_jpi_intro(), jpi_intro_exports));
13458
+ await mod3.run();
13459
+ process.exit(0);
13460
+ }
13454
13461
  const mod2 = await Promise.resolve().then(() => (init_jpi_connect(), jpi_connect_exports));
13455
13462
  await mod2.run();
13456
13463
  process.exit(0);
@@ -1108,7 +1108,7 @@ function defaultIntroDeps() {
1108
1108
  try {
1109
1109
  const { readProfile: readProfile2 } = await Promise.resolve().then(() => (init_profile(), profile_exports));
1110
1110
  const profile = await readProfile2();
1111
- return { displayName: profile?.displayName, contactEmail: profile?.contactEmail };
1111
+ return { displayName: profile?.displayName };
1112
1112
  } catch {
1113
1113
  return {};
1114
1114
  }
@@ -1159,7 +1159,7 @@ function renderConsentCard(payload, deps) {
1159
1159
  }
1160
1160
  async function runIntroRequest(args, overrides) {
1161
1161
  const deps = { ...defaultIntroDeps(), ...overrides };
1162
- const targetLogin = args.targetLogin?.trim();
1162
+ const targetLogin = args.targetLogin?.trim().replace(/^@/, "");
1163
1163
  if (!targetLogin) {
1164
1164
  deps.errorLog('\n Usage: terminalhire intro <github-login> [--note "..."] [--contact <email>] [--name "..."]\n');
1165
1165
  deps.exit(1);
@@ -1178,13 +1178,8 @@ async function runIntroRequest(args, overrides) {
1178
1178
  }
1179
1179
  const profile = await deps.readProfileContact();
1180
1180
  const displayName = (args.name ?? profile.displayName ?? requesterLogin).trim();
1181
- const contact = (args.contact ?? profile.contactEmail ?? "").trim();
1182
- if (!contact) {
1183
- deps.errorLog("\n No contact on file. Set one with `terminalhire profile --edit`,");
1184
- deps.errorLog(" or pass `--contact <email-or-handle>`. Nothing was sent.\n");
1185
- deps.exit(1);
1186
- return;
1187
- }
1181
+ const explicitContact = (args.contact ?? "").trim();
1182
+ const contact = explicitContact || `@${requesterLogin}`;
1188
1183
  const payload = buildIntroPayload({
1189
1184
  requesterLogin,
1190
1185
  requesterDisplayName: displayName,
@@ -1314,8 +1309,7 @@ async function runIntroDecision(args, overrides) {
1314
1309
  let contact = "";
1315
1310
  let shareHandle = false;
1316
1311
  if (args.action === "accept") {
1317
- const profile = await deps.readProfileContact();
1318
- contact = (args.contact ?? profile.contactEmail ?? "").trim();
1312
+ contact = (args.contact ?? "").trim();
1319
1313
  shareHandle = contact.length === 0;
1320
1314
  let shareLabel = contact;
1321
1315
  if (shareHandle) {
@@ -1385,8 +1379,11 @@ async function runIntroDecision(args, overrides) {
1385
1379
  deps.log("\n Declined \u2014 no contact was shared.\n");
1386
1380
  return;
1387
1381
  }
1388
- deps.log("\n Accepted. Your contact was shared with the requester.");
1389
- if (data.contact) deps.log(` You can reach them at: ${data.contact}`);
1382
+ const peer = data.counterpartyLogin;
1383
+ deps.log(`
1384
+ \u2713 Connected${peer ? ` with @${peer}` : ""}.`);
1385
+ if (peer) deps.log(` Message them any time: terminalhire chat @${peer}`);
1386
+ if (data.contact) deps.log(` They also shared: ${data.contact}`);
1390
1387
  deps.log("");
1391
1388
  }
1392
1389
  async function runIntroList(overrides) {
package/dist/src/intro.js CHANGED
@@ -1101,7 +1101,7 @@ function defaultIntroDeps() {
1101
1101
  try {
1102
1102
  const { readProfile: readProfile2 } = await Promise.resolve().then(() => (init_profile(), profile_exports));
1103
1103
  const profile = await readProfile2();
1104
- return { displayName: profile?.displayName, contactEmail: profile?.contactEmail };
1104
+ return { displayName: profile?.displayName };
1105
1105
  } catch {
1106
1106
  return {};
1107
1107
  }
@@ -1152,7 +1152,7 @@ function renderConsentCard(payload, deps) {
1152
1152
  }
1153
1153
  async function runIntroRequest(args, overrides) {
1154
1154
  const deps = { ...defaultIntroDeps(), ...overrides };
1155
- const targetLogin = args.targetLogin?.trim();
1155
+ const targetLogin = args.targetLogin?.trim().replace(/^@/, "");
1156
1156
  if (!targetLogin) {
1157
1157
  deps.errorLog('\n Usage: terminalhire intro <github-login> [--note "..."] [--contact <email>] [--name "..."]\n');
1158
1158
  deps.exit(1);
@@ -1171,13 +1171,8 @@ async function runIntroRequest(args, overrides) {
1171
1171
  }
1172
1172
  const profile = await deps.readProfileContact();
1173
1173
  const displayName = (args.name ?? profile.displayName ?? requesterLogin).trim();
1174
- const contact = (args.contact ?? profile.contactEmail ?? "").trim();
1175
- if (!contact) {
1176
- deps.errorLog("\n No contact on file. Set one with `terminalhire profile --edit`,");
1177
- deps.errorLog(" or pass `--contact <email-or-handle>`. Nothing was sent.\n");
1178
- deps.exit(1);
1179
- return;
1180
- }
1174
+ const explicitContact = (args.contact ?? "").trim();
1175
+ const contact = explicitContact || `@${requesterLogin}`;
1181
1176
  const payload = buildIntroPayload({
1182
1177
  requesterLogin,
1183
1178
  requesterDisplayName: displayName,
@@ -1308,8 +1303,7 @@ async function runIntroDecision(args, overrides) {
1308
1303
  let contact = "";
1309
1304
  let shareHandle = false;
1310
1305
  if (args.action === "accept") {
1311
- const profile = await deps.readProfileContact();
1312
- contact = (args.contact ?? profile.contactEmail ?? "").trim();
1306
+ contact = (args.contact ?? "").trim();
1313
1307
  shareHandle = contact.length === 0;
1314
1308
  let shareLabel = contact;
1315
1309
  if (shareHandle) {
@@ -1379,8 +1373,11 @@ async function runIntroDecision(args, overrides) {
1379
1373
  deps.log("\n Declined \u2014 no contact was shared.\n");
1380
1374
  return;
1381
1375
  }
1382
- deps.log("\n Accepted. Your contact was shared with the requester.");
1383
- if (data.contact) deps.log(` You can reach them at: ${data.contact}`);
1376
+ const peer = data.counterpartyLogin;
1377
+ deps.log(`
1378
+ \u2713 Connected${peer ? ` with @${peer}` : ""}.`);
1379
+ if (peer) deps.log(` Message them any time: terminalhire chat @${peer}`);
1380
+ if (data.contact) deps.log(` They also shared: ${data.contact}`);
1384
1381
  deps.log("");
1385
1382
  }
1386
1383
  async function runIntroList(overrides) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "terminalhire",
3
- "version": "0.10.2",
3
+ "version": "0.10.4",
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",