@halyard/cli 0.1.1 → 0.1.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 +28 -0
- package/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +64 -56
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +33 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/lib/auth.d.ts +2 -1
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +9 -2
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/setup.d.ts +44 -0
- package/dist/lib/setup.d.ts.map +1 -0
- package/dist/lib/setup.js +190 -0
- package/dist/lib/setup.js.map +1 -0
- package/package.json +9 -6
package/README.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# @halyard/cli
|
|
2
|
+
|
|
3
|
+
Command-line companion for [Halyard](https://usehalyard.ai) — scaffold Halyard into your repo for Claude Code, Cursor, and Codex, and sync your coding session logs back to the platform.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @halyard/cli
|
|
9
|
+
# or run without installing
|
|
10
|
+
bunx @halyard/cli <command>
|
|
11
|
+
pnpm dlx @halyard/cli <command>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Commands
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
halyard setup # Scaffold Halyard into the current repo (alias: init)
|
|
18
|
+
halyard login # Authenticate via your browser
|
|
19
|
+
halyard sync # Upload new session logs to Halyard
|
|
20
|
+
halyard push # Push a single session file
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Run `halyard --help` for the full list of flags.
|
|
24
|
+
|
|
25
|
+
## Learn more
|
|
26
|
+
|
|
27
|
+
- Product: [usehalyard.ai](https://usehalyard.ai)
|
|
28
|
+
- Docs & sign-in: [app.usehalyard.ai](https://app.usehalyard.ai)
|
package/dist/cli.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
2
3
|
import { Command } from 'commander';
|
|
3
4
|
import { DEFAULT_API_URL } from './lib/config.js';
|
|
4
5
|
import { loginCommand } from './commands/login.js';
|
|
5
6
|
import { syncCommand } from './commands/sync.js';
|
|
6
7
|
import { pushCommand } from './commands/push.js';
|
|
8
|
+
import { setupCommand } from './commands/setup.js';
|
|
9
|
+
const packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));
|
|
7
10
|
const program = new Command();
|
|
8
11
|
program
|
|
9
12
|
.name('halyard')
|
|
10
|
-
.description('
|
|
11
|
-
.version(
|
|
13
|
+
.description('Set up Halyard in your repo and sync coding session logs')
|
|
14
|
+
.version(packageJson.version)
|
|
12
15
|
.option('--api-url <url>', 'Halyard API URL', DEFAULT_API_URL);
|
|
16
|
+
program.addCommand(setupCommand());
|
|
13
17
|
program.addCommand(loginCommand());
|
|
14
18
|
program.addCommand(syncCommand());
|
|
15
19
|
program.addCommand(pushCommand());
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAC5C,CAAA;AAExB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAA;AAEhE,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAA;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAA;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkBnC,wBAAgB,YAAY,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkBnC,wBAAgB,YAAY,IAAI,OAAO,CA4KtC"}
|
package/dist/commands/login.js
CHANGED
|
@@ -53,68 +53,75 @@ export function loginCommand() {
|
|
|
53
53
|
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
54
54
|
const state = randomBytes(16).toString('hex');
|
|
55
55
|
// Step 3: Start temp HTTP server to capture callback
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}, 120_000);
|
|
61
|
-
const server = createServer((req, res) => {
|
|
62
|
-
if (!req.url?.startsWith('/callback')) {
|
|
63
|
-
res.writeHead(404);
|
|
64
|
-
res.end('Not found');
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const url = new URL(req.url, `http://127.0.0.1:${callbackPort}`);
|
|
68
|
-
const code = url.searchParams.get('code');
|
|
69
|
-
const returnedState = url.searchParams.get('state');
|
|
70
|
-
const error = url.searchParams.get('error');
|
|
71
|
-
if (error) {
|
|
72
|
-
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
73
|
-
res.end('<html><body><h1>Login failed</h1><p>You can close this tab.</p></body></html>');
|
|
74
|
-
clearTimeout(timeout);
|
|
75
|
-
server.close();
|
|
76
|
-
reject(new Error(`OAuth error: ${error}`));
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
if (returnedState !== state) {
|
|
80
|
-
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
81
|
-
res.end('<html><body><h1>Login failed</h1><p>State mismatch. You can close this tab.</p></body></html>');
|
|
82
|
-
clearTimeout(timeout);
|
|
56
|
+
let authCode;
|
|
57
|
+
try {
|
|
58
|
+
authCode = await new Promise((resolve, reject) => {
|
|
59
|
+
const timeout = setTimeout(() => {
|
|
83
60
|
server.close();
|
|
84
|
-
reject(new Error('
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
61
|
+
reject(new Error('Login timed out after 2 minutes'));
|
|
62
|
+
}, 120_000);
|
|
63
|
+
const server = createServer((req, res) => {
|
|
64
|
+
if (!req.url?.startsWith('/callback')) {
|
|
65
|
+
res.writeHead(404);
|
|
66
|
+
res.end('Not found');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const url = new URL(req.url, `http://127.0.0.1:${callbackPort}`);
|
|
70
|
+
const code = url.searchParams.get('code');
|
|
71
|
+
const returnedState = url.searchParams.get('state');
|
|
72
|
+
const error = url.searchParams.get('error');
|
|
73
|
+
if (error) {
|
|
74
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
75
|
+
res.end('<html><body><h1>Login failed</h1><p>You can close this tab.</p></body></html>');
|
|
76
|
+
clearTimeout(timeout);
|
|
77
|
+
server.close();
|
|
78
|
+
reject(new Error(`OAuth error: ${error}`));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (returnedState !== state) {
|
|
82
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
83
|
+
res.end('<html><body><h1>Login failed</h1><p>State mismatch. You can close this tab.</p></body></html>');
|
|
84
|
+
clearTimeout(timeout);
|
|
85
|
+
server.close();
|
|
86
|
+
reject(new Error('OAuth state mismatch'));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (!code) {
|
|
90
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
91
|
+
res.end('<html><body><h1>Login failed</h1><p>No auth code received. You can close this tab.</p></body></html>');
|
|
92
|
+
clearTimeout(timeout);
|
|
93
|
+
server.close();
|
|
94
|
+
reject(new Error('No authorization code received'));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
88
97
|
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
89
|
-
res.end('<html><body><h1>Login
|
|
98
|
+
res.end('<html><body><h1>Login successful!</h1><p>You can close this tab and return to the terminal.</p></body></html>');
|
|
90
99
|
clearTimeout(timeout);
|
|
91
100
|
server.close();
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
authUrl.searchParams.set('state', state);
|
|
110
|
-
authUrl.searchParams.set('scope', 'openid profile');
|
|
111
|
-
console.log('Opening browser for authentication...');
|
|
112
|
-
console.log(`If the browser doesn't open, visit: ${authUrl.toString()}`);
|
|
113
|
-
open(authUrl.toString()).catch(() => {
|
|
114
|
-
// Browser open failed - user will use the URL printed above
|
|
101
|
+
resolve(code);
|
|
102
|
+
});
|
|
103
|
+
server.listen(callbackPort, '127.0.0.1', () => {
|
|
104
|
+
// Step 4: Open browser to authorize
|
|
105
|
+
const authUrl = new URL(`${apiUrl}/oauth/authorize`);
|
|
106
|
+
authUrl.searchParams.set('client_id', clientId);
|
|
107
|
+
authUrl.searchParams.set('redirect_uri', redirectUri);
|
|
108
|
+
authUrl.searchParams.set('response_type', 'code');
|
|
109
|
+
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
110
|
+
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
111
|
+
authUrl.searchParams.set('state', state);
|
|
112
|
+
authUrl.searchParams.set('scope', 'openid profile');
|
|
113
|
+
console.log('Opening browser for authentication...');
|
|
114
|
+
console.log(`If the browser doesn't open, visit: ${authUrl.toString()}`);
|
|
115
|
+
open(authUrl.toString()).catch(() => {
|
|
116
|
+
// Browser open failed - user will use the URL printed above
|
|
117
|
+
});
|
|
115
118
|
});
|
|
116
119
|
});
|
|
117
|
-
}
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
118
125
|
// Step 5: Exchange auth code for tokens
|
|
119
126
|
console.log('Exchanging authorization code...');
|
|
120
127
|
try {
|
|
@@ -137,6 +144,7 @@ export function loginCommand() {
|
|
|
137
144
|
saveCredentials({
|
|
138
145
|
accessToken: tokenData.access_token,
|
|
139
146
|
refreshToken: tokenData.refresh_token,
|
|
147
|
+
clientId,
|
|
140
148
|
expiresAt: Date.now() + tokenData.expires_in * 1000,
|
|
141
149
|
apiUrl,
|
|
142
150
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAEhD;;GAEG;AACH,SAAS,oBAAoB;IAC3B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAC9C,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;AAClE,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;SACxB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,KAAK;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAgB,CAAA;QAEtD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;QAEvC,sCAAsC;QACtC,IAAI,QAAgB,CAAA;QACpB,MAAM,YAAY,GAAG,MAAM,YAAY,EAAE,CAAA;QACzC,MAAM,WAAW,GAAG,oBAAoB,YAAY,WAAW,CAAA;QAE/D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,iBAAiB,EAAE;gBACrD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,WAAW,EAAE,aAAa;oBAC1B,aAAa,EAAE,CAAC,WAAW,CAAC;oBAC5B,WAAW,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;oBACpD,cAAc,EAAE,CAAC,MAAM,CAAC;oBACxB,0BAA0B,EAAE,MAAM;iBACnC,CAAC;aACH,CAAC,CAAA;YAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;gBAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAA;YAC3E,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAA0B,CAAA;YAC9D,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAA;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,sCAAsC,EACtC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,+BAA+B;QAC/B,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAA;QAC3C,MAAM,aAAa,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAA;QACzD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAE7C,qDAAqD;QACrD,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,wBAAgB,YAAY,IAAI,OAAO,CAkCtC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { runSetup } from '../lib/setup.js';
|
|
3
|
+
export function setupCommand() {
|
|
4
|
+
return new Command('setup')
|
|
5
|
+
.alias('init')
|
|
6
|
+
.description('Scaffold Halyard for Claude Code, Cursor, and Codex')
|
|
7
|
+
.option('--dry-run', 'Show the changes without writing config files')
|
|
8
|
+
.action(async function () {
|
|
9
|
+
const opts = this.opts();
|
|
10
|
+
const dryRun = !!opts.dryRun;
|
|
11
|
+
const results = runSetup({ dryRun });
|
|
12
|
+
console.log(dryRun
|
|
13
|
+
? 'Previewing Halyard scaffold for this repository...'
|
|
14
|
+
: 'Scaffolding Halyard for this repository...');
|
|
15
|
+
for (const entry of results) {
|
|
16
|
+
console.log(formatResult(entry));
|
|
17
|
+
}
|
|
18
|
+
console.log('');
|
|
19
|
+
console.log(dryRun
|
|
20
|
+
? 'Dry run only. Re-run without `--dry-run` to write the scaffold.'
|
|
21
|
+
: 'Scaffold complete. Claude/Cursor/Codex will prompt for OAuth the first time Halyard is used.');
|
|
22
|
+
console.log('Zero-install usage: `bunx @halyard/cli init` or `pnpm dlx @halyard/cli init` from your repo root.');
|
|
23
|
+
if (results.some((entry) => entry.status === 'error')) {
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function formatResult(entry) {
|
|
29
|
+
const status = entry.status.padEnd(9, ' ');
|
|
30
|
+
const label = `${entry.target}:${entry.scope}`.padEnd(14, ' ');
|
|
31
|
+
return ` ${status} ${label} ${entry.location} - ${entry.detail}`;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAoB,MAAM,iBAAiB,CAAA;AAE5D,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;SACxB,KAAK,CAAC,MAAM,CAAC;SACb,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;SACpE,MAAM,CAAC,KAAK;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAEpC,OAAO,CAAC,GAAG,CACT,MAAM;YACJ,CAAC,CAAC,oDAAoD;YACtD,CAAC,CAAC,4CAA4C,CACjD,CAAA;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;QAClC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CACT,MAAM;YACJ,CAAC,CAAC,iEAAiE;YACnE,CAAC,CAAC,8FAA8F,CACnG,CAAA;QACD,OAAO,CAAC,GAAG,CACT,mGAAmG,CACpG,CAAA;QAED,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,YAAY,CAAC,KAAkB;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAC9D,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,CAAA;AACnE,CAAC"}
|
package/dist/lib/auth.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export interface Credentials {
|
|
2
2
|
accessToken: string;
|
|
3
3
|
refreshToken: string;
|
|
4
|
+
clientId: string;
|
|
4
5
|
expiresAt: number;
|
|
5
6
|
apiUrl: string;
|
|
6
7
|
}
|
|
@@ -17,7 +18,7 @@ export declare function getAuthHeaders(apiUrl: string): Promise<Record<string, s
|
|
|
17
18
|
/**
|
|
18
19
|
* Refresh an expired OAuth access token.
|
|
19
20
|
*/
|
|
20
|
-
export declare function refreshToken(refreshTokenValue: string, apiUrl: string): Promise<Credentials>;
|
|
21
|
+
export declare function refreshToken(refreshTokenValue: string, clientId: string, apiUrl: string): Promise<Credentials>;
|
|
21
22
|
/**
|
|
22
23
|
* Save credentials to disk.
|
|
23
24
|
*/
|
package/dist/lib/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAmBnD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgCpF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAgCtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAGxD"}
|
package/dist/lib/auth.js
CHANGED
|
@@ -11,6 +11,7 @@ export function getCredentials() {
|
|
|
11
11
|
return {
|
|
12
12
|
accessToken: envToken,
|
|
13
13
|
refreshToken: '',
|
|
14
|
+
clientId: '',
|
|
14
15
|
expiresAt: Date.now() + 365 * 24 * 60 * 60 * 1000, // Never expires for API keys
|
|
15
16
|
apiUrl: '', // Will use global --api-url option
|
|
16
17
|
};
|
|
@@ -38,8 +39,12 @@ export async function getAuthHeaders(apiUrl) {
|
|
|
38
39
|
}
|
|
39
40
|
// Refresh if token is expired or about to expire (30s buffer)
|
|
40
41
|
if (creds.expiresAt < Date.now() + 30_000 && creds.refreshToken) {
|
|
42
|
+
// Credentials saved before clientId was persisted can't be refreshed.
|
|
43
|
+
if (!creds.clientId) {
|
|
44
|
+
throw new Error('Stored credentials are missing the OAuth client ID. Run `halyard login` to re-authenticate.');
|
|
45
|
+
}
|
|
41
46
|
try {
|
|
42
|
-
const refreshed = await refreshToken(creds.refreshToken, apiUrl);
|
|
47
|
+
const refreshed = await refreshToken(creds.refreshToken, creds.clientId, apiUrl);
|
|
43
48
|
return { Authorization: `Bearer ${refreshed.accessToken}` };
|
|
44
49
|
}
|
|
45
50
|
catch (err) {
|
|
@@ -51,13 +56,14 @@ export async function getAuthHeaders(apiUrl) {
|
|
|
51
56
|
/**
|
|
52
57
|
* Refresh an expired OAuth access token.
|
|
53
58
|
*/
|
|
54
|
-
export async function refreshToken(refreshTokenValue, apiUrl) {
|
|
59
|
+
export async function refreshToken(refreshTokenValue, clientId, apiUrl) {
|
|
55
60
|
const res = await fetch(`${apiUrl}/oauth/token`, {
|
|
56
61
|
method: 'POST',
|
|
57
62
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
58
63
|
body: new URLSearchParams({
|
|
59
64
|
grant_type: 'refresh_token',
|
|
60
65
|
refresh_token: refreshTokenValue,
|
|
66
|
+
client_id: clientId,
|
|
61
67
|
}),
|
|
62
68
|
});
|
|
63
69
|
if (!res.ok) {
|
|
@@ -68,6 +74,7 @@ export async function refreshToken(refreshTokenValue, apiUrl) {
|
|
|
68
74
|
const creds = {
|
|
69
75
|
accessToken: data.access_token,
|
|
70
76
|
refreshToken: data.refresh_token,
|
|
77
|
+
clientId,
|
|
71
78
|
expiresAt: Date.now() + data.expires_in * 1000,
|
|
72
79
|
apiUrl,
|
|
73
80
|
};
|
package/dist/lib/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export declare const HALYARD_MCP_URL = "https://mcp.usehalyard.ai";
|
|
2
|
+
export declare const HALYARD_CLAUDE_MARKETPLACE_NAME = "halyard-labs";
|
|
3
|
+
export declare const HALYARD_CLAUDE_MARKETPLACE_REPO = "halyard-labs/claude-plugin-marketplace";
|
|
4
|
+
export declare const HALYARD_CLAUDE_PLUGIN_ID = "halyard@halyard-labs";
|
|
5
|
+
export type SetupTarget = 'claude' | 'codex' | 'cursor';
|
|
6
|
+
export type SetupStatus = 'updated' | 'unchanged' | 'skipped' | 'error';
|
|
7
|
+
export interface SetupResult {
|
|
8
|
+
target: SetupTarget;
|
|
9
|
+
scope: 'project' | 'user';
|
|
10
|
+
status: SetupStatus;
|
|
11
|
+
location: string;
|
|
12
|
+
detail: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CommandRunner {
|
|
15
|
+
has(command: string): boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface SetupOptions {
|
|
18
|
+
cwd?: string;
|
|
19
|
+
dryRun?: boolean;
|
|
20
|
+
homeDir?: string;
|
|
21
|
+
runner?: CommandRunner;
|
|
22
|
+
}
|
|
23
|
+
interface ClaudeSettings extends Record<string, unknown> {
|
|
24
|
+
enabledPlugins?: Record<string, unknown>;
|
|
25
|
+
extraKnownMarketplaces?: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
interface CursorConfig extends Record<string, unknown> {
|
|
28
|
+
mcpServers?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
interface CodexConfig extends Record<string, unknown> {
|
|
31
|
+
mcp_servers?: Record<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
export declare function createSystemRunner(): CommandRunner;
|
|
34
|
+
export declare function runSetup(options?: SetupOptions): SetupResult[];
|
|
35
|
+
export declare function getSetupPaths(cwd: string, homeDir: string): {
|
|
36
|
+
claudeProject: string;
|
|
37
|
+
cursorProject: string;
|
|
38
|
+
codexUser: string;
|
|
39
|
+
};
|
|
40
|
+
export declare function mergeClaudeSettings(input: unknown): ClaudeSettings;
|
|
41
|
+
export declare function mergeCursorConfig(input: unknown): CursorConfig;
|
|
42
|
+
export declare function mergeCodexConfig(input: unknown): CodexConfig;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/lib/setup.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,eAAe,8BAA8B,CAAA;AAC1D,eAAO,MAAM,+BAA+B,iBAAiB,CAAA;AAC7D,eAAO,MAAM,+BAA+B,2CAA2C,CAAA;AACvF,eAAO,MAAM,wBAAwB,yBAAyB,CAAA;AAE9D,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;AACvD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAA;AAEvE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,SAAS,GAAG,MAAM,CAAA;IACzB,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,UAAU,cAAe,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACxC,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjD;AAED,UAAU,YAAa,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,UAAU,WAAY,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACtC;AAED,wBAAgB,kBAAkB,IAAI,aAAa,CAMlD;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,WAAW,EAAE,CAYlE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;EAMzD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAkBlE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAc9D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAe5D"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, join, relative, resolve } from 'node:path';
|
|
5
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
6
|
+
import { parse as parseToml, stringify as stringifyToml } from 'smol-toml';
|
|
7
|
+
export const HALYARD_MCP_URL = 'https://mcp.usehalyard.ai';
|
|
8
|
+
export const HALYARD_CLAUDE_MARKETPLACE_NAME = 'halyard-labs';
|
|
9
|
+
export const HALYARD_CLAUDE_MARKETPLACE_REPO = 'halyard-labs/claude-plugin-marketplace';
|
|
10
|
+
export const HALYARD_CLAUDE_PLUGIN_ID = 'halyard@halyard-labs';
|
|
11
|
+
export function createSystemRunner() {
|
|
12
|
+
return {
|
|
13
|
+
has(command) {
|
|
14
|
+
return spawnSync('which', [command], { stdio: 'ignore' }).status === 0;
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function runSetup(options = {}) {
|
|
19
|
+
const cwd = resolve(options.cwd ?? process.cwd());
|
|
20
|
+
const dryRun = options.dryRun ?? false;
|
|
21
|
+
const homeDir = options.homeDir ?? homedir();
|
|
22
|
+
const runner = options.runner ?? createSystemRunner();
|
|
23
|
+
const paths = getSetupPaths(cwd, homeDir);
|
|
24
|
+
return [
|
|
25
|
+
setupClaudeProject(paths.claudeProject, dryRun),
|
|
26
|
+
setupCursorProject(paths.cursorProject, dryRun),
|
|
27
|
+
setupCodexUser(paths.codexUser, dryRun, runner),
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
export function getSetupPaths(cwd, homeDir) {
|
|
31
|
+
return {
|
|
32
|
+
claudeProject: join(cwd, '.claude', 'settings.json'),
|
|
33
|
+
cursorProject: join(cwd, '.cursor', 'mcp.json'),
|
|
34
|
+
codexUser: join(homeDir, '.codex', 'config.toml'),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function mergeClaudeSettings(input) {
|
|
38
|
+
const current = asObject(input);
|
|
39
|
+
const enabledPlugins = asObject(current['enabledPlugins']);
|
|
40
|
+
const extraKnownMarketplaces = asObject(current['extraKnownMarketplaces']);
|
|
41
|
+
const marketplace = asObject(extraKnownMarketplaces[HALYARD_CLAUDE_MARKETPLACE_NAME]);
|
|
42
|
+
enabledPlugins[HALYARD_CLAUDE_PLUGIN_ID] = true;
|
|
43
|
+
marketplace['source'] = {
|
|
44
|
+
source: 'github',
|
|
45
|
+
repo: HALYARD_CLAUDE_MARKETPLACE_REPO,
|
|
46
|
+
};
|
|
47
|
+
extraKnownMarketplaces[HALYARD_CLAUDE_MARKETPLACE_NAME] = marketplace;
|
|
48
|
+
return {
|
|
49
|
+
...current,
|
|
50
|
+
enabledPlugins,
|
|
51
|
+
extraKnownMarketplaces,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function mergeCursorConfig(input) {
|
|
55
|
+
const current = asObject(input);
|
|
56
|
+
const mcpServers = asObject(current['mcpServers']);
|
|
57
|
+
const halyard = asObject(mcpServers['halyard']);
|
|
58
|
+
mcpServers['halyard'] = {
|
|
59
|
+
...halyard,
|
|
60
|
+
url: HALYARD_MCP_URL,
|
|
61
|
+
};
|
|
62
|
+
return {
|
|
63
|
+
...current,
|
|
64
|
+
mcpServers,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function mergeCodexConfig(input) {
|
|
68
|
+
const current = asObject(input);
|
|
69
|
+
const mcpServers = asObject(current['mcp_servers']);
|
|
70
|
+
const halyard = asObject(mcpServers['halyard']);
|
|
71
|
+
mcpServers['halyard'] = {
|
|
72
|
+
...halyard,
|
|
73
|
+
enabled: true,
|
|
74
|
+
url: HALYARD_MCP_URL,
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
...current,
|
|
78
|
+
mcp_servers: mcpServers,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function setupClaudeProject(filePath, dryRun) {
|
|
82
|
+
const current = readJsonFile(filePath);
|
|
83
|
+
if (current instanceof Error) {
|
|
84
|
+
return result('claude', 'project', 'error', filePath, current.message);
|
|
85
|
+
}
|
|
86
|
+
const next = mergeClaudeSettings(current);
|
|
87
|
+
if (isDeepStrictEqual(current, next)) {
|
|
88
|
+
return result('claude', 'project', 'unchanged', filePath, 'Halyard plugin and marketplace are already scaffolded.');
|
|
89
|
+
}
|
|
90
|
+
if (!dryRun) {
|
|
91
|
+
writeJsonFile(filePath, next);
|
|
92
|
+
}
|
|
93
|
+
return result('claude', 'project', 'updated', filePath, dryRun
|
|
94
|
+
? 'Would add the Halyard marketplace and enable the project plugin.'
|
|
95
|
+
: 'Added the Halyard marketplace and enabled the project plugin.');
|
|
96
|
+
}
|
|
97
|
+
function setupCursorProject(filePath, dryRun) {
|
|
98
|
+
const current = readJsonFile(filePath);
|
|
99
|
+
if (current instanceof Error) {
|
|
100
|
+
return result('cursor', 'project', 'error', filePath, current.message);
|
|
101
|
+
}
|
|
102
|
+
const next = mergeCursorConfig(current);
|
|
103
|
+
if (isDeepStrictEqual(current, next)) {
|
|
104
|
+
return result('cursor', 'project', 'unchanged', filePath, 'Halyard MCP is already present in Cursor project config.');
|
|
105
|
+
}
|
|
106
|
+
if (!dryRun) {
|
|
107
|
+
writeJsonFile(filePath, next);
|
|
108
|
+
}
|
|
109
|
+
return result('cursor', 'project', 'updated', filePath, dryRun
|
|
110
|
+
? 'Would add the Halyard MCP server to Cursor project config.'
|
|
111
|
+
: 'Added the Halyard MCP server to Cursor project config.');
|
|
112
|
+
}
|
|
113
|
+
function setupCodexUser(filePath, dryRun, runner) {
|
|
114
|
+
const codexDetected = runner.has('codex') || existsSync(filePath);
|
|
115
|
+
if (!codexDetected) {
|
|
116
|
+
return result('codex', 'user', 'skipped', filePath, 'Codex was not detected on this machine, so user-level Codex config was left alone.');
|
|
117
|
+
}
|
|
118
|
+
const current = readTomlFile(filePath);
|
|
119
|
+
if (current instanceof Error) {
|
|
120
|
+
return result('codex', 'user', 'error', filePath, current.message);
|
|
121
|
+
}
|
|
122
|
+
const next = mergeCodexConfig(current);
|
|
123
|
+
if (isDeepStrictEqual(current, next)) {
|
|
124
|
+
return result('codex', 'user', 'unchanged', filePath, 'Halyard MCP is already present in Codex user config.');
|
|
125
|
+
}
|
|
126
|
+
if (!dryRun) {
|
|
127
|
+
writeTomlFile(filePath, next);
|
|
128
|
+
}
|
|
129
|
+
return result('codex', 'user', 'updated', filePath, dryRun
|
|
130
|
+
? 'Would add the Halyard MCP server to Codex user config.'
|
|
131
|
+
: 'Added the Halyard MCP server to Codex user config.');
|
|
132
|
+
}
|
|
133
|
+
function readJsonFile(filePath) {
|
|
134
|
+
if (!existsSync(filePath))
|
|
135
|
+
return {};
|
|
136
|
+
try {
|
|
137
|
+
return JSON.parse(readFileSync(filePath, 'utf8'));
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
return new Error(`Could not parse JSON at ${filePath}: ${formatError(error)}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function writeJsonFile(filePath, value) {
|
|
144
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
145
|
+
writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`);
|
|
146
|
+
}
|
|
147
|
+
function readTomlFile(filePath) {
|
|
148
|
+
if (!existsSync(filePath))
|
|
149
|
+
return {};
|
|
150
|
+
try {
|
|
151
|
+
return parseToml(readFileSync(filePath, 'utf8'));
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
return new Error(`Could not parse TOML at ${filePath}: ${formatError(error)}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function writeTomlFile(filePath, value) {
|
|
158
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
159
|
+
writeFileSync(filePath, `${stringifyToml(asObject(value))}\n`);
|
|
160
|
+
}
|
|
161
|
+
function asObject(value) {
|
|
162
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
163
|
+
return { ...value };
|
|
164
|
+
}
|
|
165
|
+
return {};
|
|
166
|
+
}
|
|
167
|
+
function formatError(error) {
|
|
168
|
+
return error instanceof Error ? error.message : String(error);
|
|
169
|
+
}
|
|
170
|
+
function result(target, scope, status, filePath, detail) {
|
|
171
|
+
return {
|
|
172
|
+
target,
|
|
173
|
+
scope,
|
|
174
|
+
status,
|
|
175
|
+
location: displayPath(filePath, scope),
|
|
176
|
+
detail,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function displayPath(filePath, scope) {
|
|
180
|
+
if (scope === 'project') {
|
|
181
|
+
return relative(process.cwd(), filePath) || filePath;
|
|
182
|
+
}
|
|
183
|
+
const userHome = homedir();
|
|
184
|
+
const fromHome = relative(userHome, filePath);
|
|
185
|
+
if (fromHome && !fromHome.startsWith('..')) {
|
|
186
|
+
return `~/${fromHome}`;
|
|
187
|
+
}
|
|
188
|
+
return relative(process.cwd(), filePath) || filePath;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/lib/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAA;AAE1E,MAAM,CAAC,MAAM,eAAe,GAAG,2BAA2B,CAAA;AAC1D,MAAM,CAAC,MAAM,+BAA+B,GAAG,cAAc,CAAA;AAC7D,MAAM,CAAC,MAAM,+BAA+B,GAAG,wCAAwC,CAAA;AACvF,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAA;AAqC9D,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,GAAG,CAAC,OAAe;YACjB,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA;QACxE,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,UAAwB,EAAE;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAA;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAA;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAA;IACrD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAEzC,OAAO;QACL,kBAAkB,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/C,kBAAkB,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/C,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;KAChD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,OAAe;IACxD,OAAO;QACL,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,eAAe,CAAC;QACpD,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC;QAC/C,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC;KAClD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/B,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC1D,MAAM,sBAAsB,GAAG,QAAQ,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAA;IAC1E,MAAM,WAAW,GAAG,QAAQ,CAAC,sBAAsB,CAAC,+BAA+B,CAAC,CAAC,CAAA;IAErF,cAAc,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAA;IAC/C,WAAW,CAAC,QAAQ,CAAC,GAAG;QACtB,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,+BAA+B;KACtC,CAAA;IACD,sBAAsB,CAAC,+BAA+B,CAAC,GAAG,WAAW,CAAA;IAErE,OAAO;QACL,GAAG,OAAO;QACV,cAAc;QACd,sBAAsB;KACvB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA;IAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;IAE/C,UAAU,CAAC,SAAS,CAAC,GAAG;QACtB,GAAG,OAAO;QACV,GAAG,EAAE,eAAe;KACrB,CAAA;IAED,OAAO;QACL,GAAG,OAAO;QACV,UAAU;KACX,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;IAE/C,UAAU,CAAC,SAAS,CAAC,GAAG;QACtB,GAAG,OAAO;QACV,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,eAAe;KACrB,CAAA;IAED,OAAO;QACL,GAAG,OAAO;QACV,WAAW,EAAE,UAAU;KACxB,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,MAAe;IAC3D,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACtC,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACxE,CAAC;IAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IACzC,IAAI,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,MAAM,CACX,QAAQ,EACR,SAAS,EACT,WAAW,EACX,QAAQ,EACR,wDAAwD,CACzD,CAAA;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO,MAAM,CACX,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAQ,EACR,MAAM;QACJ,CAAC,CAAC,kEAAkE;QACpE,CAAC,CAAC,+DAA+D,CACpE,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,MAAe;IAC3D,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACtC,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACxE,CAAC;IAED,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IACvC,IAAI,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,MAAM,CACX,QAAQ,EACR,SAAS,EACT,WAAW,EACX,QAAQ,EACR,0DAA0D,CAC3D,CAAA;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO,MAAM,CACX,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAQ,EACR,MAAM;QACJ,CAAC,CAAC,4DAA4D;QAC9D,CAAC,CAAC,wDAAwD,CAC7D,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,MAAe,EAAE,MAAqB;IAC9E,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,MAAM,CACX,OAAO,EACP,MAAM,EACN,SAAS,EACT,QAAQ,EACR,oFAAoF,CACrF,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACtC,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACtC,IAAI,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,MAAM,CACX,OAAO,EACP,MAAM,EACN,WAAW,EACX,QAAQ,EACR,sDAAsD,CACvD,CAAA;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO,MAAM,CACX,OAAO,EACP,MAAM,EACN,SAAS,EACT,QAAQ,EACR,MAAM;QACJ,CAAC,CAAC,wDAAwD;QAC1D,CAAC,CAAC,oDAAoD,CACzD,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAA;IAEpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAY,CAAA;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,KAAK,CAAC,2BAA2B,QAAQ,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAChF,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,KAAc;IACrD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAA;IAEpC,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAY,CAAA;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,KAAK,CAAC,2BAA2B,QAAQ,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAChF,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,KAAc;IACrD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,aAAa,CAAC,QAAQ,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAA;IACrB,CAAC;IAED,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,MAAM,CACb,MAAmB,EACnB,KAAyB,EACzB,MAAmB,EACnB,QAAgB,EAChB,MAAc;IAEd,OAAO;QACL,MAAM;QACN,KAAK;QACL,MAAM;QACN,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC;QACtC,MAAM;KACP,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,KAAyB;IAC9D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAA;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAA;IAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC7C,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,QAAQ,EAAE,CAAA;IACxB,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAA;AACtD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@halyard/cli",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "CLI for syncing coding session logs
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "CLI for setting up Halyard in Claude/Cursor/Codex and syncing coding session logs",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"halyard": "./dist/cli.js"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
|
-
"dist"
|
|
10
|
+
"dist",
|
|
11
|
+
"!dist/**/*.test.*"
|
|
11
12
|
],
|
|
12
13
|
"scripts": {
|
|
13
|
-
"dev": "tsx src/cli.ts",
|
|
14
14
|
"build": "tsc",
|
|
15
15
|
"build:binary": "bun build src/cli.ts --compile --outfile dist/halyard",
|
|
16
|
-
"
|
|
16
|
+
"test": "tsx --test src/**/*.test.ts",
|
|
17
|
+
"typecheck": "tsc --noEmit",
|
|
18
|
+
"prepublishOnly": "tsc"
|
|
17
19
|
},
|
|
18
20
|
"dependencies": {
|
|
19
21
|
"commander": "^13.0.0",
|
|
20
|
-
"open": "^10.0.0"
|
|
22
|
+
"open": "^10.0.0",
|
|
23
|
+
"smol-toml": "^1.6.1"
|
|
21
24
|
},
|
|
22
25
|
"devDependencies": {
|
|
23
26
|
"@halyard/prettier-config": "workspace:*",
|