@halyard/cli 0.1.1 → 0.2.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 +115 -0
- package/dist/cli.js +30 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/api-keys.d.ts +3 -0
- package/dist/commands/api-keys.d.ts.map +1 -0
- package/dist/commands/api-keys.js +90 -0
- package/dist/commands/api-keys.js.map +1 -0
- package/dist/commands/hook.d.ts +6 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +106 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/login.d.ts +17 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +170 -65
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/orgs.d.ts +3 -0
- package/dist/commands/orgs.d.ts.map +1 -0
- package/dist/commands/orgs.js +102 -0
- package/dist/commands/orgs.js.map +1 -0
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +29 -6
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/sessions.d.ts +3 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +139 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +58 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/skills.d.ts +12 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +171 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +51 -49
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/users.d.ts +13 -0
- package/dist/commands/users.d.ts.map +1 -0
- package/dist/commands/users.js +205 -0
- package/dist/commands/users.js.map +1 -0
- package/dist/commands/whoami.d.ts +21 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +77 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/lib/api-client.d.ts +64 -2
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +32 -7
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/auth.d.ts +43 -6
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +106 -25
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/config-files.d.ts +6 -0
- package/dist/lib/config-files.d.ts.map +1 -0
- package/dist/lib/config-files.js +27 -0
- package/dist/lib/config-files.js.map +1 -0
- package/dist/lib/config.d.ts +13 -7
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +22 -8
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/copilot-export.d.ts +31 -0
- package/dist/lib/copilot-export.d.ts.map +1 -0
- package/dist/lib/copilot-export.js +129 -0
- package/dist/lib/copilot-export.js.map +1 -0
- package/dist/lib/discovery.d.ts +60 -2
- package/dist/lib/discovery.d.ts.map +1 -1
- package/dist/lib/discovery.js +187 -15
- package/dist/lib/discovery.js.map +1 -1
- package/dist/lib/hook-discovery.d.ts +43 -0
- package/dist/lib/hook-discovery.d.ts.map +1 -0
- package/dist/lib/hook-discovery.js +90 -0
- package/dist/lib/hook-discovery.js.map +1 -0
- package/dist/lib/hook-input.d.ts +36 -0
- package/dist/lib/hook-input.d.ts.map +1 -0
- package/dist/lib/hook-input.js +161 -0
- package/dist/lib/hook-input.js.map +1 -0
- package/dist/lib/hook-runner.d.ts +48 -0
- package/dist/lib/hook-runner.d.ts.map +1 -0
- package/dist/lib/hook-runner.js +306 -0
- package/dist/lib/hook-runner.js.map +1 -0
- package/dist/lib/http.d.ts +18 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +54 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/opencode-export.d.ts +22 -0
- package/dist/lib/opencode-export.d.ts.map +1 -0
- package/dist/lib/opencode-export.js +53 -0
- package/dist/lib/opencode-export.js.map +1 -0
- package/dist/lib/output.d.ts +27 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +74 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/preflight.d.ts +35 -0
- package/dist/lib/preflight.d.ts.map +1 -0
- package/dist/lib/preflight.js +54 -0
- package/dist/lib/preflight.js.map +1 -0
- package/dist/lib/repo-binding.d.ts +43 -0
- package/dist/lib/repo-binding.d.ts.map +1 -0
- package/dist/lib/repo-binding.js +158 -0
- package/dist/lib/repo-binding.js.map +1 -0
- package/dist/lib/repo-identity.d.ts +29 -0
- package/dist/lib/repo-identity.d.ts.map +1 -0
- package/dist/lib/repo-identity.js +113 -0
- package/dist/lib/repo-identity.js.map +1 -0
- package/dist/lib/setup-hooks.d.ts +41 -0
- package/dist/lib/setup-hooks.d.ts.map +1 -0
- package/dist/lib/setup-hooks.js +276 -0
- package/dist/lib/setup-hooks.js.map +1 -0
- package/dist/lib/setup.d.ts +47 -0
- package/dist/lib/setup.d.ts.map +1 -0
- package/dist/lib/setup.js +179 -0
- package/dist/lib/setup.js.map +1 -0
- package/dist/lib/skill-batches.d.ts +16 -0
- package/dist/lib/skill-batches.d.ts.map +1 -0
- package/dist/lib/skill-batches.js +35 -0
- package/dist/lib/skill-batches.js.map +1 -0
- package/dist/lib/skill-files.d.ts +4 -0
- package/dist/lib/skill-files.d.ts.map +1 -0
- package/dist/lib/skill-files.js +36 -0
- package/dist/lib/skill-files.js.map +1 -0
- package/dist/lib/skill-fingerprint.d.ts +55 -0
- package/dist/lib/skill-fingerprint.d.ts.map +1 -0
- package/dist/lib/skill-fingerprint.js +204 -0
- package/dist/lib/skill-fingerprint.js.map +1 -0
- package/dist/lib/skills-discovery.d.ts +57 -0
- package/dist/lib/skills-discovery.d.ts.map +1 -0
- package/dist/lib/skills-discovery.js +157 -0
- package/dist/lib/skills-discovery.js.map +1 -0
- package/dist/lib/skills-sync.d.ts +66 -0
- package/dist/lib/skills-sync.d.ts.map +1 -0
- package/dist/lib/skills-sync.js +251 -0
- package/dist/lib/skills-sync.js.map +1 -0
- package/dist/lib/sync-runner.d.ts +56 -0
- package/dist/lib/sync-runner.d.ts.map +1 -0
- package/dist/lib/sync-runner.js +106 -0
- package/dist/lib/sync-runner.js.map +1 -0
- package/dist/lib/sync-state.d.ts +36 -6
- package/dist/lib/sync-state.d.ts.map +1 -1
- package/dist/lib/sync-state.js +41 -11
- package/dist/lib/sync-state.js.map +1 -1
- package/package.json +16 -8
package/dist/commands/login.js
CHANGED
|
@@ -2,7 +2,8 @@ import { createServer } from 'node:http';
|
|
|
2
2
|
import { randomBytes, createHash } from 'node:crypto';
|
|
3
3
|
import { Command } from 'commander';
|
|
4
4
|
import open from 'open';
|
|
5
|
-
import { saveCredentials } from '../lib/auth.js';
|
|
5
|
+
import { perOrgCredentialsPath, refreshToken, saveCredentials, savePerOrgCredentials, } from '../lib/auth.js';
|
|
6
|
+
import { findRepoBinding } from '../lib/repo-binding.js';
|
|
6
7
|
/**
|
|
7
8
|
* Generate a PKCE code verifier (RFC 7636)
|
|
8
9
|
*/
|
|
@@ -15,6 +16,51 @@ function generateCodeVerifier() {
|
|
|
15
16
|
function generateCodeChallenge(verifier) {
|
|
16
17
|
return createHash('sha256').update(verifier).digest('base64url');
|
|
17
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Branded OAuth return page. Fully self-contained (inline sail mark, system
|
|
21
|
+
* font fallbacks, prefers-color-scheme dark) because it is served from the
|
|
22
|
+
* loopback listener with no asset pipeline. Values mirror the design tokens in
|
|
23
|
+
* packages/ui/src/styles/brand-tokens.css; the desktop app serves the same page
|
|
24
|
+
* from apps/desktop/src-tauri/src/oauth.rs — keep the two in step.
|
|
25
|
+
*/
|
|
26
|
+
function returnPage(ok, msg) {
|
|
27
|
+
const escaped = msg.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');
|
|
28
|
+
return `<!doctype html>
|
|
29
|
+
<html lang="en">
|
|
30
|
+
<head>
|
|
31
|
+
<meta charset="utf-8">
|
|
32
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
33
|
+
<title>${ok ? 'Halyard — signed in' : 'Halyard — sign-in failed'}</title>
|
|
34
|
+
<style>
|
|
35
|
+
:root { color-scheme: light dark; }
|
|
36
|
+
body { margin: 0; min-height: 100vh; display: grid; place-items: center; background: #fdfbf7; color: #2b180a; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; -webkit-font-smoothing: antialiased; }
|
|
37
|
+
main { text-align: center; padding: 56px 64px; max-width: 420px; border: 1px solid #ede4da; border-radius: 14px; background: #faf7f1; box-shadow: 0 1px 3px rgba(43, 24, 10, 0.05); }
|
|
38
|
+
h1 { font-family: 'Playfair Display', Georgia, 'Times New Roman', serif; font-weight: 500; font-size: 30px; letter-spacing: -0.01em; margin: 24px 0 10px; }
|
|
39
|
+
p { color: #796758; font-size: 15px; line-height: 1.55; margin: 0; }
|
|
40
|
+
.rule { width: 40px; height: 2px; border-radius: 1px; background: #8b6914; opacity: 0.55; margin: 26px auto 0; }
|
|
41
|
+
@media (prefers-color-scheme: dark) {
|
|
42
|
+
body { background: #131210; color: #ebe5db; }
|
|
43
|
+
main { border-color: #312e28; background: #1a1815; box-shadow: none; }
|
|
44
|
+
p { color: #7d766a; }
|
|
45
|
+
.rule { background: #d4a017; }
|
|
46
|
+
}
|
|
47
|
+
</style>
|
|
48
|
+
</head>
|
|
49
|
+
<body>
|
|
50
|
+
<main>
|
|
51
|
+
<svg width="56" height="56" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Halyard">
|
|
52
|
+
<rect width="48" height="48" rx="10" fill="#1C1A16"/>
|
|
53
|
+
<path d="M 18.000,24.750 Q 18.000,22.500 16.821,24.416 L 7.179,40.085 Q 6.000,42.000 8.250,42.000 L 15.750,42.000 Q 18.000,42.000 18.000,39.750 Z" fill="#E8DFD0" opacity="0.8"/>
|
|
54
|
+
<path d="M 42.000,8.250 Q 42.000,6.000 40.808,7.908 L 20.693,40.092 Q 19.500,42.000 21.750,42.000 L 39.750,42.000 Q 42.000,42.000 42.000,39.750 Z" fill="#E8DFD0"/>
|
|
55
|
+
</svg>
|
|
56
|
+
<h1>${ok ? 'You’re signed in' : 'Sign-in didn’t complete'}</h1>
|
|
57
|
+
<p>${escaped}</p>
|
|
58
|
+
<div class="rule"></div>
|
|
59
|
+
</main>
|
|
60
|
+
</body>
|
|
61
|
+
</html>
|
|
62
|
+
`;
|
|
63
|
+
}
|
|
18
64
|
export function loginCommand() {
|
|
19
65
|
return new Command('login')
|
|
20
66
|
.description('Authenticate with Halyard via browser login')
|
|
@@ -53,70 +99,78 @@ export function loginCommand() {
|
|
|
53
99
|
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
54
100
|
const state = randomBytes(16).toString('hex');
|
|
55
101
|
// 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);
|
|
102
|
+
let authCode;
|
|
103
|
+
try {
|
|
104
|
+
authCode = await new Promise((resolve, reject) => {
|
|
105
|
+
const timeout = setTimeout(() => {
|
|
83
106
|
server.close();
|
|
84
|
-
reject(new Error('
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
107
|
+
reject(new Error('Login timed out after 2 minutes'));
|
|
108
|
+
}, 120_000);
|
|
109
|
+
const server = createServer((req, res) => {
|
|
110
|
+
if (!req.url?.startsWith('/callback')) {
|
|
111
|
+
res.writeHead(404);
|
|
112
|
+
res.end('Not found');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const url = new URL(req.url, `http://127.0.0.1:${callbackPort}`);
|
|
116
|
+
const code = url.searchParams.get('code');
|
|
117
|
+
const returnedState = url.searchParams.get('state');
|
|
118
|
+
const error = url.searchParams.get('error');
|
|
119
|
+
if (error) {
|
|
120
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
121
|
+
res.end(returnPage(false, 'You can close this tab and try again from the terminal.'));
|
|
122
|
+
clearTimeout(timeout);
|
|
123
|
+
server.close();
|
|
124
|
+
reject(new Error(`OAuth error: ${error}`));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (returnedState !== state) {
|
|
128
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
129
|
+
res.end(returnPage(false, 'State mismatch. You can close this tab.'));
|
|
130
|
+
clearTimeout(timeout);
|
|
131
|
+
server.close();
|
|
132
|
+
reject(new Error('OAuth state mismatch'));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (!code) {
|
|
136
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
137
|
+
res.end(returnPage(false, 'No auth code received. You can close this tab.'));
|
|
138
|
+
clearTimeout(timeout);
|
|
139
|
+
server.close();
|
|
140
|
+
reject(new Error('No authorization code received'));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
88
143
|
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
89
|
-
res.end('
|
|
144
|
+
res.end(returnPage(true, 'You can close this tab and return to the terminal.'));
|
|
90
145
|
clearTimeout(timeout);
|
|
91
146
|
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
|
|
147
|
+
resolve(code);
|
|
148
|
+
});
|
|
149
|
+
server.listen(callbackPort, '127.0.0.1', () => {
|
|
150
|
+
// Step 4: Open browser to authorize
|
|
151
|
+
const authUrl = new URL(`${apiUrl}/oauth/authorize`);
|
|
152
|
+
authUrl.searchParams.set('client_id', clientId);
|
|
153
|
+
authUrl.searchParams.set('redirect_uri', redirectUri);
|
|
154
|
+
authUrl.searchParams.set('response_type', 'code');
|
|
155
|
+
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
156
|
+
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
157
|
+
authUrl.searchParams.set('state', state);
|
|
158
|
+
authUrl.searchParams.set('scope', 'openid profile');
|
|
159
|
+
console.log('Opening browser for authentication...');
|
|
160
|
+
console.log(`If the browser doesn't open, visit: ${authUrl.toString()}`);
|
|
161
|
+
open(authUrl.toString()).catch(() => {
|
|
162
|
+
// Browser open failed - user will use the URL printed above
|
|
163
|
+
});
|
|
115
164
|
});
|
|
116
165
|
});
|
|
117
|
-
}
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
118
171
|
// Step 5: Exchange auth code for tokens
|
|
119
172
|
console.log('Exchanging authorization code...');
|
|
173
|
+
let tokenData;
|
|
120
174
|
try {
|
|
121
175
|
const tokenRes = await fetch(`${apiUrl}/oauth/token`, {
|
|
122
176
|
method: 'POST',
|
|
@@ -133,21 +187,72 @@ export function loginCommand() {
|
|
|
133
187
|
const body = await tokenRes.text();
|
|
134
188
|
throw new Error(`Token exchange failed (${tokenRes.status}): ${body}`);
|
|
135
189
|
}
|
|
136
|
-
|
|
137
|
-
saveCredentials({
|
|
138
|
-
accessToken: tokenData.access_token,
|
|
139
|
-
refreshToken: tokenData.refresh_token,
|
|
140
|
-
expiresAt: Date.now() + tokenData.expires_in * 1000,
|
|
141
|
-
apiUrl,
|
|
142
|
-
});
|
|
143
|
-
console.log('Login successful! Credentials saved to ~/.halyard/credentials.json');
|
|
190
|
+
tokenData = (await tokenRes.json());
|
|
144
191
|
}
|
|
145
192
|
catch (err) {
|
|
146
193
|
console.error('Token exchange failed:', err instanceof Error ? err.message : err);
|
|
147
194
|
process.exit(1);
|
|
148
195
|
}
|
|
196
|
+
// Step 6: Persist credentials (org-aware when the repo is bound)
|
|
197
|
+
try {
|
|
198
|
+
const message = await persistLogin({
|
|
199
|
+
creds: {
|
|
200
|
+
accessToken: tokenData.access_token,
|
|
201
|
+
refreshToken: tokenData.refresh_token,
|
|
202
|
+
clientId,
|
|
203
|
+
expiresAt: Date.now() + tokenData.expires_in * 1000,
|
|
204
|
+
apiUrl,
|
|
205
|
+
},
|
|
206
|
+
binding: findRepoBinding(),
|
|
207
|
+
});
|
|
208
|
+
console.log(message);
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
149
214
|
});
|
|
150
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Persist freshly exchanged tokens. In an unbound repo this is the legacy
|
|
218
|
+
* behavior (write ~/.halyard/credentials.json). In a bound repo, resolve the
|
|
219
|
+
* binding's org slug against /api/v1/organizations, reissue workspace-scoped
|
|
220
|
+
* tokens when needed, and save to the per-org store.
|
|
221
|
+
* Returns the success message to print; throws on failure.
|
|
222
|
+
*/
|
|
223
|
+
export async function persistLogin(options) {
|
|
224
|
+
const { creds, binding, fetchImpl = fetch, refreshImpl = refreshToken } = options;
|
|
225
|
+
if (!binding) {
|
|
226
|
+
saveCredentials(creds);
|
|
227
|
+
return 'Login successful! Credentials saved to ~/.halyard/credentials.json';
|
|
228
|
+
}
|
|
229
|
+
const res = await fetchImpl(`${creds.apiUrl}/api/v1/organizations`, {
|
|
230
|
+
headers: { Authorization: `Bearer ${creds.accessToken}` },
|
|
231
|
+
});
|
|
232
|
+
if (!res.ok) {
|
|
233
|
+
throw new Error(`Could not list organizations (${res.status}): ${await res.text()}`);
|
|
234
|
+
}
|
|
235
|
+
const { organizations } = (await res.json());
|
|
236
|
+
const target = organizations.find((org) => org.slug === binding.org);
|
|
237
|
+
if (!target) {
|
|
238
|
+
const available = organizations.map((org) => ` ${org.slug}`).join('\n');
|
|
239
|
+
throw new Error(`This repo is bound to organization "${binding.org}" (${binding.rootDir}/.halyard.json), ` +
|
|
240
|
+
`but your account has no access to it.\nAvailable organizations:\n${available}`);
|
|
241
|
+
}
|
|
242
|
+
if (target.isCurrent) {
|
|
243
|
+
// Token is already scoped to the bound org - save it as-is.
|
|
244
|
+
savePerOrgCredentials({ ...creds, orgId: target.id, orgSlug: target.slug });
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
// Workspace-scoped reissue, persisted straight into the per-org store.
|
|
248
|
+
await refreshImpl(creds.refreshToken, creds.clientId, creds.apiUrl, target.id, {
|
|
249
|
+
filePath: perOrgCredentialsPath(target.id),
|
|
250
|
+
orgId: target.id,
|
|
251
|
+
orgSlug: target.slug,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
return `Logged in to Halyard (${target.slug}) for this repo`;
|
|
255
|
+
}
|
|
151
256
|
/**
|
|
152
257
|
* Find an available port for the OAuth callback server.
|
|
153
258
|
*/
|
|
@@ -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,
|
|
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":"orgs.d.ts","sourceRoot":"","sources":["../../src/commands/orgs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqBnC,wBAAgB,WAAW,IAAI,OAAO,CAyGrC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { apiFetch } from '../lib/http.js';
|
|
3
|
+
import { getCredentials, refreshToken } from '../lib/auth.js';
|
|
4
|
+
import { printTable, printJson, fail } from '../lib/output.js';
|
|
5
|
+
async function listOrgs(apiUrl) {
|
|
6
|
+
const response = await apiFetch(apiUrl, '/api/v1/organizations');
|
|
7
|
+
return response.organizations;
|
|
8
|
+
}
|
|
9
|
+
export function orgsCommand() {
|
|
10
|
+
const orgs = new Command('orgs').description('List and switch between your organizations');
|
|
11
|
+
orgs
|
|
12
|
+
.command('list')
|
|
13
|
+
.description('List organizations you belong to')
|
|
14
|
+
.action(async function () {
|
|
15
|
+
const globalOpts = this.optsWithGlobals();
|
|
16
|
+
const apiUrl = globalOpts.apiUrl;
|
|
17
|
+
let organizations;
|
|
18
|
+
try {
|
|
19
|
+
organizations = await listOrgs(apiUrl);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
fail(err instanceof Error ? err.message : String(err));
|
|
23
|
+
}
|
|
24
|
+
if (globalOpts.json) {
|
|
25
|
+
printJson({ organizations });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
printTable(organizations, [
|
|
29
|
+
{ key: 'isCurrent', header: '', format: (v) => (v ? '*' : '') },
|
|
30
|
+
{ key: 'id', header: 'ID' },
|
|
31
|
+
{ key: 'name', header: 'NAME' },
|
|
32
|
+
{ key: 'slug', header: 'SLUG', format: (v) => String(v) },
|
|
33
|
+
{ key: 'userRole', header: 'ROLE' },
|
|
34
|
+
{ key: 'memberCount', header: 'MEMBERS' },
|
|
35
|
+
{ key: 'isHome', header: 'HOME', format: (v) => (v ? 'yes' : '') },
|
|
36
|
+
]);
|
|
37
|
+
});
|
|
38
|
+
orgs
|
|
39
|
+
.command('switch')
|
|
40
|
+
.description('Switch the active organization (reissues your OAuth token)')
|
|
41
|
+
.argument('<org>', 'Organization ID or slug (from `halyard orgs list`)')
|
|
42
|
+
.action(async function (orgArg) {
|
|
43
|
+
const globalOpts = this.optsWithGlobals();
|
|
44
|
+
const apiUrl = globalOpts.apiUrl;
|
|
45
|
+
// Operate on the legacy/default chain explicitly (binding = null):
|
|
46
|
+
// switching must never rotate a per-org file's refresh token while
|
|
47
|
+
// persisting the result to the legacy file.
|
|
48
|
+
const creds = getCredentials(null);
|
|
49
|
+
if (!creds) {
|
|
50
|
+
fail('Not authenticated. Run `halyard login`.');
|
|
51
|
+
}
|
|
52
|
+
if (process.env['HALYARD_TOKEN'] || creds.accessToken.startsWith('sk_halyard_')) {
|
|
53
|
+
fail('Workspace switching requires OAuth login (API keys are bound to one organization). Run `halyard login`.');
|
|
54
|
+
}
|
|
55
|
+
if (!creds.clientId || !creds.refreshToken) {
|
|
56
|
+
fail('Stored credentials cannot be refreshed. Run `halyard login` to re-authenticate.');
|
|
57
|
+
}
|
|
58
|
+
// Resolve slug or id against the orgs the account is linked to.
|
|
59
|
+
let organizations;
|
|
60
|
+
try {
|
|
61
|
+
organizations = await listOrgs(apiUrl);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
fail(err instanceof Error ? err.message : String(err));
|
|
65
|
+
}
|
|
66
|
+
const target = organizations.find((org) => org.id === orgArg || org.slug === orgArg);
|
|
67
|
+
if (!target) {
|
|
68
|
+
const available = organizations.map((org) => ` ${org.slug} (${org.id})`).join('\n');
|
|
69
|
+
fail(`No organization matching "${orgArg}". Available:\n${available}`);
|
|
70
|
+
}
|
|
71
|
+
if (target.isCurrent) {
|
|
72
|
+
console.log(`Already in ${target.name} (${target.slug}).`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Reissue the token scoped to the target org. The server validates
|
|
76
|
+
// membership before rotating the refresh token, so a failure here
|
|
77
|
+
// leaves the stored credentials untouched.
|
|
78
|
+
try {
|
|
79
|
+
await refreshToken(creds.refreshToken, creds.clientId, apiUrl, target.id);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
fail(err instanceof Error ? err.message : String(err));
|
|
83
|
+
}
|
|
84
|
+
let me;
|
|
85
|
+
try {
|
|
86
|
+
me = await apiFetch(apiUrl, '/api/v1/me');
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
fail(err instanceof Error ? err.message : String(err));
|
|
90
|
+
}
|
|
91
|
+
if (globalOpts.json) {
|
|
92
|
+
printJson({ switched: true, organization: me.organization });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const org = me.organization;
|
|
96
|
+
console.log(org
|
|
97
|
+
? `Switched to ${org.name} (${org.slug}). Credentials updated.`
|
|
98
|
+
: 'Switched. Credentials updated.');
|
|
99
|
+
});
|
|
100
|
+
return orgs;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=orgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orgs.js","sourceRoot":"","sources":["../../src/commands/orgs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBnC,wBAAgB,WAAW,IAAI,OAAO,CA6FrC"}
|
package/dist/commands/push.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { readFileSync, statSync } from 'node:fs';
|
|
2
|
-
import { basename } from 'node:path';
|
|
2
|
+
import { basename, extname } from 'node:path';
|
|
3
3
|
import { Command } from 'commander';
|
|
4
4
|
import { getAuthHeaders } from '../lib/auth.js';
|
|
5
5
|
import { uploadSession } from '../lib/api-client.js';
|
|
6
|
+
import { findRepoBinding } from '../lib/repo-binding.js';
|
|
7
|
+
import { runPreflight } from '../lib/preflight.js';
|
|
6
8
|
import { readSyncState, writeSyncState, markUploaded, hashFileContents } from '../lib/sync-state.js';
|
|
7
9
|
/**
|
|
8
10
|
* Detect provider from file path heuristics.
|
|
@@ -12,6 +14,12 @@ function detectProvider(filePath) {
|
|
|
12
14
|
return 'claude';
|
|
13
15
|
if (filePath.includes('.codex/') || filePath.includes('/codex/'))
|
|
14
16
|
return 'codex';
|
|
17
|
+
if (filePath.includes('.gemini/') || filePath.includes('/gemini/'))
|
|
18
|
+
return 'gemini';
|
|
19
|
+
if (filePath.includes('opencode/') || filePath.includes('.opencode/'))
|
|
20
|
+
return 'opencode';
|
|
21
|
+
if (filePath.includes('.copilot/') || filePath.includes('/copilot/'))
|
|
22
|
+
return 'copilot';
|
|
15
23
|
if (filePath.includes('.cursor/') || filePath.includes('/cursor/'))
|
|
16
24
|
return 'cursor';
|
|
17
25
|
return null;
|
|
@@ -20,7 +28,7 @@ export function pushCommand() {
|
|
|
20
28
|
return new Command('push')
|
|
21
29
|
.description('Upload a single session log file to Halyard')
|
|
22
30
|
.argument('<path>', 'Path to the session log file (.jsonl)')
|
|
23
|
-
.option('--provider <provider>', 'Provider (claude, codex, cursor, other)')
|
|
31
|
+
.option('--provider <provider>', 'Provider (claude, codex, gemini, opencode, copilot, cursor, other)')
|
|
24
32
|
.option('--session-id <id>', 'Session ID (defaults to filename without extension)')
|
|
25
33
|
.action(async function (filePath) {
|
|
26
34
|
const opts = this.opts();
|
|
@@ -41,7 +49,22 @@ export function pushCommand() {
|
|
|
41
49
|
}
|
|
42
50
|
// Determine provider
|
|
43
51
|
const provider = opts.provider ?? detectProvider(filePath) ?? 'other';
|
|
44
|
-
const sessionId = opts.sessionId ?? basename(filePath,
|
|
52
|
+
const sessionId = opts.sessionId ?? basename(filePath, extname(filePath));
|
|
53
|
+
// Preflight: resolve + print the destination org; hard-fail on a
|
|
54
|
+
// binding/credentials org mismatch.
|
|
55
|
+
let target;
|
|
56
|
+
try {
|
|
57
|
+
target = await runPreflight({
|
|
58
|
+
apiUrl,
|
|
59
|
+
binding: findRepoBinding(),
|
|
60
|
+
scopeLabel: filePath,
|
|
61
|
+
verb: 'Pushing',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
45
68
|
// Authenticate
|
|
46
69
|
let authHeaders;
|
|
47
70
|
try {
|
|
@@ -54,8 +77,9 @@ export function pushCommand() {
|
|
|
54
77
|
// Upload
|
|
55
78
|
const sizeKb = (stat.size / 1024).toFixed(1);
|
|
56
79
|
console.log(`Uploading ${filePath} (${sizeKb} KB) as ${provider} session...`);
|
|
80
|
+
const content = readFileSync(filePath);
|
|
57
81
|
try {
|
|
58
|
-
const result = await uploadSession(filePath, provider, sessionId, authHeaders, apiUrl);
|
|
82
|
+
const result = await uploadSession(content, basename(filePath), provider, sessionId, authHeaders, apiUrl);
|
|
59
83
|
if (result.status === 'duplicate') {
|
|
60
84
|
console.log(`Session already exists (ID: ${result.sessionId})`);
|
|
61
85
|
}
|
|
@@ -63,10 +87,9 @@ export function pushCommand() {
|
|
|
63
87
|
console.log(`Uploaded successfully (ID: ${result.sessionId})`);
|
|
64
88
|
}
|
|
65
89
|
// Update sync state
|
|
66
|
-
const content = readFileSync(filePath);
|
|
67
90
|
const hash = hashFileContents(content);
|
|
68
91
|
const syncState = readSyncState();
|
|
69
|
-
markUploaded(syncState, filePath, {
|
|
92
|
+
markUploaded(syncState, target.stateKey, filePath, {
|
|
70
93
|
sessionId: result.sessionId,
|
|
71
94
|
uploadedAt: new Date().toISOString(),
|
|
72
95
|
size: stat.size,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsCnC,wBAAgB,eAAe,IAAI,OAAO,CAqIzC"}
|