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 +11 -0
- package/dist/bin/jpi-bounties.js +27 -3
- package/dist/bin/jpi-dispatch.js +1277 -143
- package/dist/bin/jpi-jobs.js +27 -3
- package/dist/bin/jpi-learn.js +8 -0
- package/dist/bin/jpi-login.js +71 -3
- package/dist/bin/jpi-profile.js +8 -0
- package/dist/bin/jpi-refresh.js +27 -3
- package/dist/bin/jpi-save.js +8 -0
- package/dist/bin/jpi-sync.js +33 -21
- package/dist/bin/jpi-trajectory.js +1076 -0
- package/dist/src/acceptance-score.js +49 -0
- package/dist/src/trajectory.js +927 -0
- package/package.json +1 -1
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
|
package/dist/bin/jpi-bounties.js
CHANGED
|
@@ -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
|
|
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();
|