terminalhire 0.4.5 → 0.5.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.
package/README.md CHANGED
@@ -45,6 +45,17 @@ terminalhire jobs --limit 20 # show top 20 results (default: 10)
45
45
  terminalhire jobs --remote-only # filter to remote roles only
46
46
  terminalhire jobs --all # show all matches above zero score
47
47
 
48
+ terminalhire bounties # day-sized paid tasks you can knock out today
49
+ terminalhire bounties --priced # only bounties with a known $ amount
50
+
51
+ terminalhire claim record <id|issueUrl> # claim a bounty locally + print the executor brief
52
+ terminalhire claim list --active # list your active claims + accepted-PR rate
53
+ terminalhire claim status <id> # poll source PR merge state (updates the metric)
54
+
55
+ terminalhire trajectory # trajectory from your local Claude Code corpus
56
+ terminalhire trajectory --export # write a derived score + Markdown to ~/.terminalhire/
57
+ terminalhire trajectory --inward # also show private rework/recovery (never exported)
58
+
48
59
  terminalhire profile --show # inspect your encrypted local profile (incl. GitHub fields)
49
60
  terminalhire profile --edit # set displayName, contactEmail, prefs
50
61
  terminalhire profile --delete # wipe profile and encryption key from disk
@@ -1640,6 +1640,28 @@ var init_bounty_gate = __esm({
1640
1640
  }
1641
1641
  });
1642
1642
 
1643
+ // ../../packages/core/src/concurrency.ts
1644
+ async function mapWithConcurrency(items, limit, fn) {
1645
+ const results = new Array(items.length);
1646
+ if (items.length === 0) return results;
1647
+ const workers = Math.max(1, Math.min(Math.floor(limit) || 1, items.length));
1648
+ let next = 0;
1649
+ async function run2() {
1650
+ for (; ; ) {
1651
+ const i = next++;
1652
+ if (i >= items.length) return;
1653
+ results[i] = await fn(items[i], i);
1654
+ }
1655
+ }
1656
+ await Promise.all(Array.from({ length: workers }, run2));
1657
+ return results;
1658
+ }
1659
+ var init_concurrency = __esm({
1660
+ "../../packages/core/src/concurrency.ts"() {
1661
+ "use strict";
1662
+ }
1663
+ });
1664
+
1643
1665
  // ../../packages/core/src/feeds/github-bounties.ts
1644
1666
  function authHeaders() {
1645
1667
  const token = process.env["GITHUB_TOKEN"] ?? process.env["GH_TOKEN"];
@@ -1731,7 +1753,7 @@ async function fetchRepoBounties(repoFullName) {
1731
1753
  if (!issues) return [];
1732
1754
  const bounties = issues.filter(isBountyIssue).slice(0, MAX_BOUNTIES_PER_REPO);
1733
1755
  const owner = repo.owner.login;
1734
- return Promise.all(bounties.map(async (issue) => {
1756
+ return mapWithConcurrency(bounties, BOUNTY_FETCH_CONCURRENCY, async (issue) => {
1735
1757
  const title = decodeEntities(issue.title).trim();
1736
1758
  const body = issue.body ? decodeEntities(issue.body) : "";
1737
1759
  const amountUSD = parseAmountUSD(title) ?? parseAmountUSD(body) ?? await fetchCommentAmount(repoFullName, issue.number);
@@ -1760,7 +1782,7 @@ async function fetchRepoBounties(repoFullName) {
1760
1782
  },
1761
1783
  raw: issue
1762
1784
  };
1763
- }));
1785
+ });
1764
1786
  }
1765
1787
  function repoFullNameFromApiUrl(url) {
1766
1788
  const m = url.match(/\/repos\/([^/]+)\/([^/]+)\/?$/);
@@ -1902,7 +1924,7 @@ async function fetchSearchBounties() {
1902
1924
  }
1903
1925
  return jobs;
1904
1926
  }
1905
- var GITHUB_API, BOUNTY_LABEL_RE, SEARCH_QUERIES, SEARCH_PER_PAGE, MAX_SEARCH_BOUNTIES, MAX_SEARCH_ISSUES_SCANNED, REPO_META_CONCURRENCY, repoMetaCache, MAX_PR_PAGES, repoOpenPRRefsCache, issueStateCache, githubBounties;
1927
+ var GITHUB_API, BOUNTY_LABEL_RE, SEARCH_QUERIES, SEARCH_PER_PAGE, MAX_SEARCH_BOUNTIES, MAX_SEARCH_ISSUES_SCANNED, REPO_META_CONCURRENCY, BOUNTY_FETCH_CONCURRENCY, repoMetaCache, MAX_PR_PAGES, repoOpenPRRefsCache, issueStateCache, githubBounties;
1906
1928
  var init_github_bounties = __esm({
1907
1929
  "../../packages/core/src/feeds/github-bounties.ts"() {
1908
1930
  "use strict";
@@ -1910,6 +1932,7 @@ var init_github_bounties = __esm({
1910
1932
  init_entities();
1911
1933
  init_bounty_gate();
1912
1934
  init_http();
1935
+ init_concurrency();
1913
1936
  GITHUB_API = "https://api.github.com";
1914
1937
  BOUNTY_LABEL_RE = /bounty|reward|funded|💎|💰/i;
1915
1938
  SEARCH_QUERIES = [
@@ -1922,6 +1945,7 @@ var init_github_bounties = __esm({
1922
1945
  MAX_SEARCH_BOUNTIES = 150;
1923
1946
  MAX_SEARCH_ISSUES_SCANNED = 300;
1924
1947
  REPO_META_CONCURRENCY = 15;
1948
+ BOUNTY_FETCH_CONCURRENCY = 6;
1925
1949
  repoMetaCache = /* @__PURE__ */ new Map();
1926
1950
  MAX_PR_PAGES = 3;
1927
1951
  repoOpenPRRefsCache = /* @__PURE__ */ new Map();