@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 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('Sync coding session logs to Halyard')
11
- .version('0.1.0')
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;AAEhD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,qCAAqC,CAAC;KAClD,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAA;AAEhE,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
+ {"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,CAmKtC"}
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"}
@@ -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
- const authCode = await new Promise((resolve, reject) => {
57
- const timeout = setTimeout(() => {
58
- server.close();
59
- reject(new Error('Login timed out after 2 minutes'));
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('OAuth state mismatch'));
85
- return;
86
- }
87
- if (!code) {
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 failed</h1><p>No auth code received. You can close this tab.</p></body></html>');
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
- reject(new Error('No authorization code received'));
93
- return;
94
- }
95
- res.writeHead(200, { 'Content-Type': 'text/html' });
96
- res.end('<html><body><h1>Login successful!</h1><p>You can close this tab and return to the terminal.</p></body></html>');
97
- clearTimeout(timeout);
98
- server.close();
99
- resolve(code);
100
- });
101
- server.listen(callbackPort, '127.0.0.1', () => {
102
- // Step 4: Open browser to authorize
103
- const authUrl = new URL(`${apiUrl}/oauth/authorize`);
104
- authUrl.searchParams.set('client_id', clientId);
105
- authUrl.searchParams.set('redirect_uri', redirectUri);
106
- authUrl.searchParams.set('response_type', 'code');
107
- authUrl.searchParams.set('code_challenge', codeChallenge);
108
- authUrl.searchParams.set('code_challenge_method', 'S256');
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":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function setupCommand(): Command;
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -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"}
@@ -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
  */
@@ -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,CAkBnD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0BpF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CA8BtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAGxD"}
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
  };
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
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":"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"}
package/package.json CHANGED
@@ -1,23 +1,26 @@
1
1
  {
2
2
  "name": "@halyard/cli",
3
- "version": "0.1.1",
4
- "description": "CLI for syncing coding session logs to Halyard",
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
- "typecheck": "tsc --noEmit"
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:*",