trackly-cli 0.2.8 → 0.3.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.
- package/README.md +2 -1
- package/bin/trackly +43 -0
- package/mcp/server.js +18 -0
- package/package.json +1 -1
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ trackly jobs --function product
|
|
|
35
35
|
|
|
36
36
|
## At a Glance
|
|
37
37
|
|
|
38
|
-
1,900+ companies | 128K+ jobs | 40+ ATS types | CLI + MCP |
|
|
38
|
+
1,900+ companies | 128K+ jobs | 40+ ATS types | CLI + MCP | 11 MCP tools
|
|
39
39
|
|
|
40
40
|
## CLI Commands
|
|
41
41
|
|
|
@@ -63,6 +63,7 @@ trackly referral start 1234 # Start a referral campaign
|
|
|
63
63
|
trackly referral status 1234 # Check referral campaign status
|
|
64
64
|
trackly company-brief 243 # Get company brief (--refresh to regenerate)
|
|
65
65
|
trackly company-workspace 243 # Full company workspace view
|
|
66
|
+
trackly request-company "eBay" # Request a company be added (--url, --notes optional)
|
|
66
67
|
trackly api-key create # Generate API key
|
|
67
68
|
trackly api-key list # List API keys
|
|
68
69
|
trackly config # Show current CLI config
|
package/bin/trackly
CHANGED
|
@@ -28,11 +28,13 @@ const VALUE_FLAGS = new Set([
|
|
|
28
28
|
'keywords',
|
|
29
29
|
'limit',
|
|
30
30
|
'name',
|
|
31
|
+
'notes',
|
|
31
32
|
'offset',
|
|
32
33
|
'region',
|
|
33
34
|
'search',
|
|
34
35
|
'sort',
|
|
35
36
|
'status',
|
|
37
|
+
'url',
|
|
36
38
|
]);
|
|
37
39
|
const AUTH_HELP_TEXT = `Not authenticated.
|
|
38
40
|
Option 1: trackly login (Google OAuth)
|
|
@@ -668,6 +670,43 @@ async function cmdCompanyWorkspace(args) {
|
|
|
668
670
|
}
|
|
669
671
|
}
|
|
670
672
|
|
|
673
|
+
async function cmdRequestCompany(args) {
|
|
674
|
+
// Positional arg = company name. Allow multi-word names without forcing the user
|
|
675
|
+
// to quote, e.g. `trackly request-company Built Robotics --url ...` joins the
|
|
676
|
+
// free-floating positionals into "Built Robotics". Matches `trackly ask` UX.
|
|
677
|
+
const name = (args._ || []).join(' ').trim();
|
|
678
|
+
if (!name) {
|
|
679
|
+
failNow('Company name required. Usage: trackly request-company <name> [--url <url>] [--notes <notes>]');
|
|
680
|
+
}
|
|
681
|
+
if (!hasAuth()) failNow(AUTH_HELP_TEXT);
|
|
682
|
+
|
|
683
|
+
const url = typeof args.url === 'string' ? args.url : '';
|
|
684
|
+
const notes = typeof args.notes === 'string' ? args.notes : '';
|
|
685
|
+
|
|
686
|
+
try {
|
|
687
|
+
const result = await apiRequest('POST', '/api/jobscout/companies/request', {
|
|
688
|
+
company_name: name,
|
|
689
|
+
company_url: url,
|
|
690
|
+
notes: notes,
|
|
691
|
+
source: 'cli',
|
|
692
|
+
});
|
|
693
|
+
if (isJSON()) return printJson(result);
|
|
694
|
+
const requestId = result.requestId || result.id || '?';
|
|
695
|
+
console.log(color('green', `Requested "${name}" (#${requestId}). Trackly team will review shortly.`));
|
|
696
|
+
} catch (e) {
|
|
697
|
+
// Backend returns 429 (rate limit, max 5 pending) and 409 (duplicate pending request)
|
|
698
|
+
// with a specific `error` message. Surface that message verbatim so the user knows
|
|
699
|
+
// exactly which gate fired without having to enable --json.
|
|
700
|
+
if (e.status === 429) {
|
|
701
|
+
setErrorExit(e.error || 'Maximum 5 pending requests allowed. Please wait for existing requests to be reviewed.');
|
|
702
|
+
} else if (e.status === 409) {
|
|
703
|
+
setErrorExit(e.error || 'You already have a pending request for this company.');
|
|
704
|
+
} else {
|
|
705
|
+
setErrorExit(e.error || e.message || 'Failed to request company');
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
|
|
671
710
|
async function cmdConfig(args) {
|
|
672
711
|
if (args['api-key'] === null) failNow('API key value required. Usage: trackly config --api-key <key>');
|
|
673
712
|
if (args['base-url'] === null) failNow('Base URL value required. Usage: trackly config --base-url <url>');
|
|
@@ -770,6 +809,7 @@ ${color('bold', 'Commands:')}
|
|
|
770
809
|
${color('cyan', 'brief <id>')} Get network brief for a job
|
|
771
810
|
${color('cyan', 'company-brief <id>')} Get company brief (--refresh to generate)
|
|
772
811
|
${color('cyan', 'company-workspace <id>')} Show company workspace (jobs, contacts, campaigns)
|
|
812
|
+
${color('cyan', 'request-company <name>')} Request a company be added to Trackly (--url, --notes)
|
|
773
813
|
${color('cyan', 'api-key create')} Generate an API key
|
|
774
814
|
${color('cyan', 'api-key list')} List your API keys
|
|
775
815
|
${color('cyan', 'config')} Show or update CLI config (--api-key, --base-url)
|
|
@@ -926,6 +966,9 @@ async function main() {
|
|
|
926
966
|
case 'company-workspace':
|
|
927
967
|
await cmdCompanyWorkspace(args);
|
|
928
968
|
break;
|
|
969
|
+
case 'request-company':
|
|
970
|
+
await cmdRequestCompany(args);
|
|
971
|
+
break;
|
|
929
972
|
case 'api-key':
|
|
930
973
|
await cmdApiKey(args);
|
|
931
974
|
break;
|
package/mcp/server.js
CHANGED
|
@@ -297,6 +297,24 @@ function createServer() {
|
|
|
297
297
|
}, 'Failed to fetch company workspace')
|
|
298
298
|
);
|
|
299
299
|
|
|
300
|
+
server.tool(
|
|
301
|
+
'trackly_request_company',
|
|
302
|
+
'Request that a company be added to Trackly\'s tracked companies. Use when the user asks about a company that isn\'t in trackly_search_companies / trackly_list_companies results. Rate-limited to 5 pending requests per user.',
|
|
303
|
+
{
|
|
304
|
+
companyName: z.string().min(1).max(200).describe('Company name (e.g. "eBay")'),
|
|
305
|
+
companyUrl: z.string().max(500).optional().describe('Optional careers page or homepage URL (e.g. "https://careers.ebay.com")'),
|
|
306
|
+
notes: z.string().max(1000).optional().describe('Optional context (e.g. "MBA hiring page", "specific role I want tracked")'),
|
|
307
|
+
},
|
|
308
|
+
wrapTool(async ({ companyName, companyUrl, notes }) => {
|
|
309
|
+
return apiRequest('POST', '/api/jobscout/companies/request', {
|
|
310
|
+
company_name: companyName,
|
|
311
|
+
company_url: companyUrl || '',
|
|
312
|
+
notes: notes || '',
|
|
313
|
+
source: 'mcp',
|
|
314
|
+
}, false, false, MCP_USER_AGENT);
|
|
315
|
+
}, 'Failed to request company')
|
|
316
|
+
);
|
|
317
|
+
|
|
300
318
|
return server;
|
|
301
319
|
}
|
|
302
320
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trackly-cli",
|
|
3
|
-
"version": "0.2
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"mcpName": "io.github.trackly-app/trackly",
|
|
5
5
|
"description": "AI job search CLI + hosted MCP server with OAuth. 128K+ jobs, 1,900+ companies, 40+ ATS. Works with Claude, ChatGPT, Cursor, Windsurf, Codex via hosted streamable-http or local stdio.",
|
|
6
6
|
"bin": {
|
package/server.json
CHANGED
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
]
|
|
18
18
|
}
|
|
19
19
|
],
|
|
20
|
-
"version": "0.2
|
|
20
|
+
"version": "0.3.2",
|
|
21
21
|
"packages": [
|
|
22
22
|
{
|
|
23
23
|
"registryType": "npm",
|
|
24
24
|
"identifier": "trackly-cli",
|
|
25
|
-
"version": "0.2
|
|
25
|
+
"version": "0.3.2",
|
|
26
26
|
"runtimeHint": "npx",
|
|
27
27
|
"runtimeArguments": [
|
|
28
28
|
{
|