@halyard/cli 0.1.2 → 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 +88 -1
- package/dist/cli.js +27 -4
- 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 +111 -14
- 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.map +1 -1
- package/dist/commands/setup.js +28 -3
- package/dist/commands/setup.js.map +1 -1
- 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 +42 -6
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +101 -27
- 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 +4 -1
- package/dist/lib/setup.d.ts.map +1 -1
- package/dist/lib/setup.js +20 -31
- package/dist/lib/setup.js.map +1 -1
- 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 +10 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-runner.js","sourceRoot":"","sources":["../../src/lib/hook-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class ApiError extends Error {
|
|
2
|
+
status: number;
|
|
3
|
+
body: string;
|
|
4
|
+
constructor(message: string, status: number, body: string);
|
|
5
|
+
}
|
|
6
|
+
export interface ApiFetchOptions {
|
|
7
|
+
method?: string;
|
|
8
|
+
body?: unknown;
|
|
9
|
+
/** Injectable fetch for tests */
|
|
10
|
+
fetchImpl?: typeof fetch;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Authenticated JSON request against the Halyard API.
|
|
14
|
+
* Wraps getAuthHeaders (token refresh + HALYARD_TOKEN handling) and maps
|
|
15
|
+
* error responses to actionable messages in one place.
|
|
16
|
+
*/
|
|
17
|
+
export declare function apiFetch<T>(apiUrl: string, path: string, options?: ApiFetchOptions): Promise<T>;
|
|
18
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAEA,qBAAa,QAAS,SAAQ,KAAK;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;gBAEA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAM1D;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,iCAAiC;IACjC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAeD;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,CAAC,CAAC,CAmCZ"}
|
package/dist/lib/http.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { getAuthHeaders } from './auth.js';
|
|
2
|
+
export class ApiError extends Error {
|
|
3
|
+
status;
|
|
4
|
+
body;
|
|
5
|
+
constructor(message, status, body) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'ApiError';
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.body = body;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Extract the `{ error }` field every API route uses, falling back to raw text. */
|
|
13
|
+
function extractErrorMessage(body) {
|
|
14
|
+
try {
|
|
15
|
+
const parsed = JSON.parse(body);
|
|
16
|
+
if (typeof parsed.error === 'string' && parsed.error.length > 0) {
|
|
17
|
+
return parsed.error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// not JSON
|
|
22
|
+
}
|
|
23
|
+
return body;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Authenticated JSON request against the Halyard API.
|
|
27
|
+
* Wraps getAuthHeaders (token refresh + HALYARD_TOKEN handling) and maps
|
|
28
|
+
* error responses to actionable messages in one place.
|
|
29
|
+
*/
|
|
30
|
+
export async function apiFetch(apiUrl, path, options = {}) {
|
|
31
|
+
const { method = 'GET', body, fetchImpl = fetch } = options;
|
|
32
|
+
const authHeaders = await getAuthHeaders(apiUrl);
|
|
33
|
+
const headers = { ...authHeaders };
|
|
34
|
+
if (body !== undefined) {
|
|
35
|
+
headers['Content-Type'] = 'application/json';
|
|
36
|
+
}
|
|
37
|
+
const res = await fetchImpl(`${apiUrl}${path}`, {
|
|
38
|
+
method,
|
|
39
|
+
headers,
|
|
40
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
41
|
+
});
|
|
42
|
+
if (!res.ok) {
|
|
43
|
+
const rawBody = await res.text();
|
|
44
|
+
if (res.status === 401) {
|
|
45
|
+
throw new ApiError('Authentication failed or token revoked. Run `halyard login` (or check HALYARD_TOKEN).', res.status, rawBody);
|
|
46
|
+
}
|
|
47
|
+
if (res.status === 403) {
|
|
48
|
+
throw new ApiError(`Permission denied: ${extractErrorMessage(rawBody)}`, res.status, rawBody);
|
|
49
|
+
}
|
|
50
|
+
throw new ApiError(`Request failed (${res.status}): ${extractErrorMessage(rawBody)}`, res.status, rawBody);
|
|
51
|
+
}
|
|
52
|
+
return (await res.json());
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,MAAM,CAAQ;IACd,IAAI,CAAQ;IAEZ,YAAY,OAAe,EAAE,MAAc,EAAE,IAAY;QACvD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AASD,oFAAoF;AACpF,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAwB,CAAA;QACtD,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC,KAAK,CAAA;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,WAAW;IACb,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAc,EACd,IAAY,EACZ,UAA2B,EAAE;IAE7B,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,OAAO,CAAA;IAC3D,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAA;IAEhD,MAAM,OAAO,GAA2B,EAAE,GAAG,WAAW,EAAE,CAAA;IAC1D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAA;IAC9C,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE;QAC9C,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC,CAAA;IAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAChC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAChB,uFAAuF,EACvF,GAAG,CAAC,MAAM,EACV,OAAO,CACR,CAAA;QACH,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAAC,sBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC/F,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,mBAAmB,GAAG,CAAC,MAAM,MAAM,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACjE,GAAG,CAAC,MAAM,EACV,OAAO,CACR,CAAA;IACH,CAAC;IAED,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode (opencode.ai / sst) integration.
|
|
3
|
+
*
|
|
4
|
+
* OpenCode ≥1.x stores sessions in a SQLite database
|
|
5
|
+
* (`~/.local/share/opencode/opencode.db`) rather than per-session files.
|
|
6
|
+
* Instead of parsing their schema ourselves, we drive the `opencode` CLI:
|
|
7
|
+
* `opencode db "<sql>" --format json` for listing and `opencode export
|
|
8
|
+
* <sessionID>` for the full self-describing session document — both stable,
|
|
9
|
+
* first-class commands, and the export stays valid across their internal
|
|
10
|
+
* schema migrations.
|
|
11
|
+
*
|
|
12
|
+
* Everything here degrades to "no sessions" when opencode isn't installed
|
|
13
|
+
* or the commands fail — discovery must never break `halyard sync` for the
|
|
14
|
+
* other providers.
|
|
15
|
+
*/
|
|
16
|
+
export interface OpencodeSessionRef {
|
|
17
|
+
id: string;
|
|
18
|
+
timeUpdated: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function listOpencodeSessions(): OpencodeSessionRef[];
|
|
21
|
+
export declare function exportOpencodeSession(sessionId: string): Buffer;
|
|
22
|
+
//# sourceMappingURL=opencode-export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-export.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-export.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;CACpB;AAWD,wBAAgB,oBAAoB,IAAI,kBAAkB,EAAE,CA2B3D;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAU/D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { execFileSync } from 'node:child_process';
|
|
5
|
+
const LIST_QUERY = 'SELECT s.id AS id, s.time_updated AS time_updated FROM session s WHERE EXISTS (SELECT 1 FROM message m WHERE m.session_id = s.id)';
|
|
6
|
+
function opencodeDataDir() {
|
|
7
|
+
if (process.env.OPENCODE_DATA_DIR)
|
|
8
|
+
return process.env.OPENCODE_DATA_DIR;
|
|
9
|
+
const xdg = process.env.XDG_DATA_HOME;
|
|
10
|
+
return xdg ? join(xdg, 'opencode') : join(homedir(), '.local', 'share', 'opencode');
|
|
11
|
+
}
|
|
12
|
+
export function listOpencodeSessions() {
|
|
13
|
+
// Cheap pre-check: no database file means opencode was never used here.
|
|
14
|
+
if (!existsSync(join(opencodeDataDir(), 'opencode.db')))
|
|
15
|
+
return [];
|
|
16
|
+
let stdout;
|
|
17
|
+
try {
|
|
18
|
+
stdout = execFileSync('opencode', ['db', LIST_QUERY, '--format', 'json'], {
|
|
19
|
+
encoding: 'utf-8',
|
|
20
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
21
|
+
timeout: 30_000,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const rows = JSON.parse(stdout);
|
|
29
|
+
if (!Array.isArray(rows))
|
|
30
|
+
return [];
|
|
31
|
+
return rows
|
|
32
|
+
.filter((r) => typeof r.id === 'string')
|
|
33
|
+
.map((r) => ({
|
|
34
|
+
id: r.id,
|
|
35
|
+
timeUpdated: typeof r.time_updated === 'number' ? r.time_updated : 0,
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function exportOpencodeSession(sessionId) {
|
|
43
|
+
const stdout = execFileSync('opencode', ['export', sessionId], {
|
|
44
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
45
|
+
timeout: 60_000,
|
|
46
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
47
|
+
});
|
|
48
|
+
if (stdout.length === 0) {
|
|
49
|
+
throw new Error(`opencode export produced no output for session ${sessionId}`);
|
|
50
|
+
}
|
|
51
|
+
return stdout;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=opencode-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-export.js","sourceRoot":"","sources":["../../src/lib/opencode-export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAuBjD,MAAM,UAAU,GACd,mIAAmI,CAAA;AAErI,SAAS,eAAe;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;IACvE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAA;IACrC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;AACrF,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,wEAAwE;IACxE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAElE,IAAI,MAAc,CAAA;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;YACxE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,OAAO,EAAE,MAAM;SAChB,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA+C,CAAA;QAC7E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAA;QACnC,OAAO,IAAI;aACR,MAAM,CAAC,CAAC,CAAC,EAA6C,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;aAClF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,WAAW,EAAE,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SACrE,CAAC,CAAC,CAAA;IACP,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;QAC7D,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;QACnC,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAA;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,kDAAkD,SAAS,EAAE,CAAC,CAAA;IAChF,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface Column {
|
|
2
|
+
key: string;
|
|
3
|
+
header: string;
|
|
4
|
+
format?: (value: unknown) => string;
|
|
5
|
+
}
|
|
6
|
+
/** Render rows as a plain-ASCII table (space-padded columns, no borders). */
|
|
7
|
+
export declare function renderTable(rows: Record<string, unknown>[], columns: Column[]): string;
|
|
8
|
+
export declare function printTable(rows: Record<string, unknown>[], columns: Column[]): void;
|
|
9
|
+
export declare function printJson(data: unknown): void;
|
|
10
|
+
/** Format an ISO date for table cells; `-` for null/undefined. */
|
|
11
|
+
export declare function formatDate(value: unknown): string;
|
|
12
|
+
export interface ConfirmOptions {
|
|
13
|
+
force?: boolean;
|
|
14
|
+
/** Injectable prompt for tests; returns the raw answer string. */
|
|
15
|
+
promptImpl?: (question: string) => Promise<string>;
|
|
16
|
+
/** Injectable TTY check for tests. */
|
|
17
|
+
isTty?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Gate for destructive operations: prompt y/N by default, bypass with --force.
|
|
21
|
+
* When stdin is not a TTY, --force is required so scripts fail fast instead of
|
|
22
|
+
* hanging on an invisible prompt.
|
|
23
|
+
*/
|
|
24
|
+
export declare function confirm(message: string, options?: ConfirmOptions): Promise<boolean>;
|
|
25
|
+
/** Print an error and exit non-zero. */
|
|
26
|
+
export declare function fail(message: string): never;
|
|
27
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAA;CACpC;AASD,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAmBtF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAEnF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMjD;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAClD,sCAAsC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAsB7F;AAED,wCAAwC;AACxC,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAG3C"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline/promises';
|
|
2
|
+
function cell(row, column) {
|
|
3
|
+
const value = row[column.key];
|
|
4
|
+
if (column.format)
|
|
5
|
+
return column.format(value);
|
|
6
|
+
if (value === null || value === undefined || value === '')
|
|
7
|
+
return '-';
|
|
8
|
+
return String(value);
|
|
9
|
+
}
|
|
10
|
+
/** Render rows as a plain-ASCII table (space-padded columns, no borders). */
|
|
11
|
+
export function renderTable(rows, columns) {
|
|
12
|
+
const widths = columns.map((col) => Math.max(col.header.length, ...rows.map((row) => cell(row, col).length)));
|
|
13
|
+
const lines = [
|
|
14
|
+
columns
|
|
15
|
+
.map((col, i) => col.header.padEnd(widths[i]))
|
|
16
|
+
.join(' ')
|
|
17
|
+
.trimEnd(),
|
|
18
|
+
];
|
|
19
|
+
for (const row of rows) {
|
|
20
|
+
lines.push(columns
|
|
21
|
+
.map((col, i) => cell(row, col).padEnd(widths[i]))
|
|
22
|
+
.join(' ')
|
|
23
|
+
.trimEnd());
|
|
24
|
+
}
|
|
25
|
+
return lines.join('\n');
|
|
26
|
+
}
|
|
27
|
+
export function printTable(rows, columns) {
|
|
28
|
+
console.log(renderTable(rows, columns));
|
|
29
|
+
}
|
|
30
|
+
export function printJson(data) {
|
|
31
|
+
console.log(JSON.stringify(data, null, 2));
|
|
32
|
+
}
|
|
33
|
+
/** Format an ISO date for table cells; `-` for null/undefined. */
|
|
34
|
+
export function formatDate(value) {
|
|
35
|
+
if (!value)
|
|
36
|
+
return '-';
|
|
37
|
+
const date = new Date(String(value));
|
|
38
|
+
if (Number.isNaN(date.getTime()))
|
|
39
|
+
return '-';
|
|
40
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
41
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Gate for destructive operations: prompt y/N by default, bypass with --force.
|
|
45
|
+
* When stdin is not a TTY, --force is required so scripts fail fast instead of
|
|
46
|
+
* hanging on an invisible prompt.
|
|
47
|
+
*/
|
|
48
|
+
export async function confirm(message, options = {}) {
|
|
49
|
+
if (options.force)
|
|
50
|
+
return true;
|
|
51
|
+
const isTty = options.isTty ?? process.stdin.isTTY === true;
|
|
52
|
+
if (!isTty && !options.promptImpl) {
|
|
53
|
+
console.error(`${message}\nRefusing to prompt without a TTY. Pass --force to proceed.`);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const ask = options.promptImpl ??
|
|
57
|
+
(async (question) => {
|
|
58
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
59
|
+
try {
|
|
60
|
+
return await rl.question(question);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
rl.close();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
const answer = await ask(`${message} [y/N] `);
|
|
67
|
+
return answer.trim().toLowerCase() === 'y' || answer.trim().toLowerCase() === 'yes';
|
|
68
|
+
}
|
|
69
|
+
/** Print an error and exit non-zero. */
|
|
70
|
+
export function fail(message) {
|
|
71
|
+
console.error(message);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { RepoBinding } from './repo-binding.js';
|
|
2
|
+
export interface TargetOrg {
|
|
3
|
+
/**
|
|
4
|
+
* Bucket key for org-scoped sync state: the orgId for OAuth chains, or
|
|
5
|
+
* `api-key:<keyId>` for sk_ keys (whose org the API does not expose;
|
|
6
|
+
* server-side ingest dedupe keeps re-uploads harmless either way).
|
|
7
|
+
*/
|
|
8
|
+
stateKey: string;
|
|
9
|
+
/** Org slug when resolvable (OAuth); null for sk_ API keys. */
|
|
10
|
+
slug: string | null;
|
|
11
|
+
/** Human-readable destination, e.g. `Halyard Studio (halyard-studio)`. */
|
|
12
|
+
label: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve which organization uploads will land in.
|
|
16
|
+
* sk_ API keys authenticate against /api/v1/api-keys/me (the OAuth-only
|
|
17
|
+
* /api/v1/me 401s for them); OAuth chains use /api/v1/me.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveTargetOrg(apiUrl: string): Promise<TargetOrg>;
|
|
20
|
+
/**
|
|
21
|
+
* Upload preflight shared by `sync` and `push`: resolve the target org, print
|
|
22
|
+
* where uploads are going, and hard-fail (throw) when the repo binding and the
|
|
23
|
+
* credentials disagree about the org. Runs before any upload, including
|
|
24
|
+
* --dry-run.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runPreflight(options: {
|
|
27
|
+
apiUrl: string;
|
|
28
|
+
binding: RepoBinding | null;
|
|
29
|
+
/** What is being uploaded: repo root, `all sessions`, or a file path. */
|
|
30
|
+
scopeLabel: string;
|
|
31
|
+
verb?: string;
|
|
32
|
+
/** Where the `Syncing … → org` line goes (stderr for --json callers). Default: stdout. */
|
|
33
|
+
print?: (line: string) => void;
|
|
34
|
+
}): Promise<TargetOrg>;
|
|
35
|
+
//# sourceMappingURL=preflight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/lib/preflight.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAA;CACd;AAWD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA0BzE;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;IAC3B,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0FAA0F;IAC1F,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B,GAAG,OAAO,CAAC,SAAS,CAAC,CAsBrB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { apiFetch } from './http.js';
|
|
2
|
+
import { getCredentials } from './auth.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve which organization uploads will land in.
|
|
5
|
+
* sk_ API keys authenticate against /api/v1/api-keys/me (the OAuth-only
|
|
6
|
+
* /api/v1/me 401s for them); OAuth chains use /api/v1/me.
|
|
7
|
+
*/
|
|
8
|
+
export async function resolveTargetOrg(apiUrl) {
|
|
9
|
+
const creds = getCredentials();
|
|
10
|
+
if (!creds) {
|
|
11
|
+
throw new Error('Not authenticated. Run `halyard login` or set the HALYARD_TOKEN environment variable.');
|
|
12
|
+
}
|
|
13
|
+
if (creds.accessToken.startsWith('sk_halyard_')) {
|
|
14
|
+
const key = await apiFetch(apiUrl, '/api/v1/api-keys/me');
|
|
15
|
+
return {
|
|
16
|
+
stateKey: `api-key:${key.id}`,
|
|
17
|
+
slug: null,
|
|
18
|
+
label: `organization bound to API key ${key.id}`,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const me = await apiFetch(apiUrl, '/api/v1/me');
|
|
22
|
+
if (!me.organization) {
|
|
23
|
+
throw new Error('Your account has no active organization. Run `halyard orgs list`.');
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
stateKey: me.organization.id,
|
|
27
|
+
slug: me.organization.slug,
|
|
28
|
+
label: `${me.organization.name} (${me.organization.slug})`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Upload preflight shared by `sync` and `push`: resolve the target org, print
|
|
33
|
+
* where uploads are going, and hard-fail (throw) when the repo binding and the
|
|
34
|
+
* credentials disagree about the org. Runs before any upload, including
|
|
35
|
+
* --dry-run.
|
|
36
|
+
*/
|
|
37
|
+
export async function runPreflight(options) {
|
|
38
|
+
const { apiUrl, binding, scopeLabel, verb = 'Syncing', print = console.log } = options;
|
|
39
|
+
const target = await resolveTargetOrg(apiUrl);
|
|
40
|
+
print(`${verb} ${scopeLabel} → ${target.label}`);
|
|
41
|
+
if (binding) {
|
|
42
|
+
if (target.slug === null) {
|
|
43
|
+
console.error(`Warning: this repo is bound to "${binding.org}" but an API key's organization ` +
|
|
44
|
+
`cannot be verified from the CLI - uploads go to the org the key belongs to.`);
|
|
45
|
+
}
|
|
46
|
+
else if (target.slug !== binding.org) {
|
|
47
|
+
throw new Error(`Organization mismatch: your credentials are for "${target.slug}" but this repo is ` +
|
|
48
|
+
`bound to "${binding.org}" (${binding.rootDir}/.halyard.json).\n` +
|
|
49
|
+
`Run \`halyard login\` inside this repo to store credentials for "${binding.org}".`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return target;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/lib/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAyB1C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc;IACnD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAA;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAA;IACH,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAmB,MAAM,EAAE,qBAAqB,CAAC,CAAA;QAC3E,OAAO;YACL,QAAQ,EAAE,WAAW,GAAG,CAAC,EAAE,EAAE;YAC7B,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,iCAAiC,GAAG,CAAC,EAAE,EAAE;SACjD,CAAA;IACH,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAgB,MAAM,EAAE,YAAY,CAAC,CAAA;IAC9D,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;IACtF,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE;QAC5B,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI;QAC1B,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG;KAC3D,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAQlC;IACC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,GAAG,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAA;IAEtF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC7C,KAAK,CAAC,GAAG,IAAI,IAAI,UAAU,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;IAEhD,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CACX,mCAAmC,OAAO,CAAC,GAAG,kCAAkC;gBAC9E,6EAA6E,CAChF,CAAA;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,oDAAoD,MAAM,CAAC,IAAI,qBAAqB;gBAClF,aAAa,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,OAAO,oBAAoB;gBACjE,oEAAoE,OAAO,CAAC,GAAG,IAAI,CACtF,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare const REPO_BINDING_FILENAME = ".halyard.json";
|
|
2
|
+
export interface RepoBinding {
|
|
3
|
+
/** Organization slug this repo is bound to. */
|
|
4
|
+
org: string;
|
|
5
|
+
/** Directory containing the binding file (main repo root for worktrees). */
|
|
6
|
+
rootDir: string;
|
|
7
|
+
}
|
|
8
|
+
/** Reset the per-process binding cache (tests). */
|
|
9
|
+
export declare function clearRepoBindingCache(): void;
|
|
10
|
+
/**
|
|
11
|
+
* Find the `.halyard.json` repo binding for a directory.
|
|
12
|
+
*
|
|
13
|
+
* Walks up from `startDir` looking for the binding file. If none is found and
|
|
14
|
+
* the directory is inside a git repo, falls back to the MAIN repo root (parent
|
|
15
|
+
* of `git rev-parse --git-common-dir`) so detached worktrees (~/.codex/worktrees
|
|
16
|
+
* and friends) inherit the binding committed at the main checkout.
|
|
17
|
+
*/
|
|
18
|
+
export declare function findRepoBinding(startDir?: string): RepoBinding | null;
|
|
19
|
+
export interface WriteBindingResult {
|
|
20
|
+
status: 'created' | 'updated' | 'unchanged';
|
|
21
|
+
filePath: string;
|
|
22
|
+
org: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Write a `.halyard.json` binding at the git toplevel of `cwd`.
|
|
26
|
+
* Throws when not inside a git repo, or when an existing binding names a
|
|
27
|
+
* different org and `force` is not set. Extra fields in an existing file are
|
|
28
|
+
* preserved on rebind.
|
|
29
|
+
*/
|
|
30
|
+
export declare function writeRepoBinding(options: {
|
|
31
|
+
org: string;
|
|
32
|
+
cwd?: string;
|
|
33
|
+
force?: boolean;
|
|
34
|
+
dryRun?: boolean;
|
|
35
|
+
}): WriteBindingResult;
|
|
36
|
+
/** Resolve the git toplevel of a directory, or null when not in a repo. */
|
|
37
|
+
export declare function gitToplevel(dir: string): string | null;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve the MAIN repo root for a directory via `git rev-parse --git-common-dir`.
|
|
40
|
+
* Returns null when git is unavailable or the directory is not inside a repo.
|
|
41
|
+
*/
|
|
42
|
+
export declare function gitMainRepoRoot(dir: string): string | null;
|
|
43
|
+
//# sourceMappingURL=repo-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-binding.d.ts","sourceRoot":"","sources":["../../src/lib/repo-binding.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,kBAAkB,CAAA;AAEpD,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAA;IACX,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAA;CAChB;AAID,mDAAmD;AACnD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,WAAW,GAAG,IAAI,CAOpF;AA0CD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAA;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,GAAG,kBAAkB,CAmDrB;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYtD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB1D"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
4
|
+
export const REPO_BINDING_FILENAME = '.halyard.json';
|
|
5
|
+
const bindingCache = new Map();
|
|
6
|
+
/** Reset the per-process binding cache (tests). */
|
|
7
|
+
export function clearRepoBindingCache() {
|
|
8
|
+
bindingCache.clear();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Find the `.halyard.json` repo binding for a directory.
|
|
12
|
+
*
|
|
13
|
+
* Walks up from `startDir` looking for the binding file. If none is found and
|
|
14
|
+
* the directory is inside a git repo, falls back to the MAIN repo root (parent
|
|
15
|
+
* of `git rev-parse --git-common-dir`) so detached worktrees (~/.codex/worktrees
|
|
16
|
+
* and friends) inherit the binding committed at the main checkout.
|
|
17
|
+
*/
|
|
18
|
+
export function findRepoBinding(startDir = process.cwd()) {
|
|
19
|
+
const start = resolve(startDir);
|
|
20
|
+
const cached = bindingCache.get(start);
|
|
21
|
+
if (cached !== undefined)
|
|
22
|
+
return cached;
|
|
23
|
+
const binding = locateBinding(start);
|
|
24
|
+
bindingCache.set(start, binding);
|
|
25
|
+
return binding;
|
|
26
|
+
}
|
|
27
|
+
function locateBinding(start) {
|
|
28
|
+
let dir = start;
|
|
29
|
+
for (;;) {
|
|
30
|
+
const binding = readBindingFile(dir);
|
|
31
|
+
if (binding)
|
|
32
|
+
return binding;
|
|
33
|
+
const parent = dirname(dir);
|
|
34
|
+
if (parent === dir)
|
|
35
|
+
break;
|
|
36
|
+
dir = parent;
|
|
37
|
+
}
|
|
38
|
+
// Detached worktree fallback: the binding file lives in the main checkout,
|
|
39
|
+
// which is not an ancestor of the worktree directory.
|
|
40
|
+
const mainRoot = gitMainRepoRoot(start);
|
|
41
|
+
if (mainRoot && mainRoot !== start) {
|
|
42
|
+
return readBindingFile(mainRoot);
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse a `.halyard.json` in `dir`. Unknown extra fields are tolerated;
|
|
48
|
+
* invalid JSON or a missing `org` field is treated as not found (with a
|
|
49
|
+
* one-line warning so a broken binding is not silently ignored).
|
|
50
|
+
*/
|
|
51
|
+
function readBindingFile(dir) {
|
|
52
|
+
const filePath = join(dir, REPO_BINDING_FILENAME);
|
|
53
|
+
if (!existsSync(filePath))
|
|
54
|
+
return null;
|
|
55
|
+
try {
|
|
56
|
+
const parsed = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
57
|
+
if (typeof parsed.org === 'string' && parsed.org.trim().length > 0) {
|
|
58
|
+
return { org: parsed.org.trim(), rootDir: dir };
|
|
59
|
+
}
|
|
60
|
+
console.error(`Warning: ${filePath} has no "org" field - ignoring repo binding.`);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
console.error(`Warning: ${filePath} is not valid JSON - ignoring repo binding.`);
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Write a `.halyard.json` binding at the git toplevel of `cwd`.
|
|
69
|
+
* Throws when not inside a git repo, or when an existing binding names a
|
|
70
|
+
* different org and `force` is not set. Extra fields in an existing file are
|
|
71
|
+
* preserved on rebind.
|
|
72
|
+
*/
|
|
73
|
+
export function writeRepoBinding(options) {
|
|
74
|
+
const { org, cwd = process.cwd(), force = false, dryRun = false } = options;
|
|
75
|
+
const toplevel = gitToplevel(cwd);
|
|
76
|
+
if (!toplevel) {
|
|
77
|
+
throw new Error('Not inside a git repository. Run `halyard setup --org` from a repo, or create .halyard.json manually.');
|
|
78
|
+
}
|
|
79
|
+
const filePath = join(toplevel, REPO_BINDING_FILENAME);
|
|
80
|
+
let extraFields = {};
|
|
81
|
+
let status = 'created';
|
|
82
|
+
if (existsSync(filePath)) {
|
|
83
|
+
let existing = null;
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
86
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
87
|
+
existing = parsed;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// fall through - unparseable counts as a conflicting file
|
|
92
|
+
}
|
|
93
|
+
const existingOrg = typeof existing?.['org'] === 'string' ? existing['org'] : null;
|
|
94
|
+
if (existingOrg === org) {
|
|
95
|
+
return { status: 'unchanged', filePath, org };
|
|
96
|
+
}
|
|
97
|
+
if (!force) {
|
|
98
|
+
throw new Error(existingOrg
|
|
99
|
+
? `${filePath} already binds this repo to "${existingOrg}". Pass --force to rebind to "${org}".`
|
|
100
|
+
: `${filePath} exists but has no valid "org" field. Pass --force to overwrite.`);
|
|
101
|
+
}
|
|
102
|
+
if (existing) {
|
|
103
|
+
const { org: _org, ...rest } = existing;
|
|
104
|
+
extraFields = rest;
|
|
105
|
+
}
|
|
106
|
+
status = 'updated';
|
|
107
|
+
}
|
|
108
|
+
if (!dryRun) {
|
|
109
|
+
const hasExtras = Object.keys(extraFields).length > 0;
|
|
110
|
+
const content = hasExtras
|
|
111
|
+
? `${JSON.stringify({ org, ...extraFields }, null, 2)}\n`
|
|
112
|
+
: `{ "org": ${JSON.stringify(org)} }\n`;
|
|
113
|
+
writeFileSync(filePath, content);
|
|
114
|
+
}
|
|
115
|
+
clearRepoBindingCache();
|
|
116
|
+
return { status, filePath, org };
|
|
117
|
+
}
|
|
118
|
+
/** Resolve the git toplevel of a directory, or null when not in a repo. */
|
|
119
|
+
export function gitToplevel(dir) {
|
|
120
|
+
try {
|
|
121
|
+
const res = spawnSync('git', ['-C', dir, 'rev-parse', '--show-toplevel'], {
|
|
122
|
+
encoding: 'utf-8',
|
|
123
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
124
|
+
});
|
|
125
|
+
if (res.error || res.status !== 0)
|
|
126
|
+
return null;
|
|
127
|
+
const out = res.stdout.trim();
|
|
128
|
+
return out.length > 0 ? resolve(out) : null;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Resolve the MAIN repo root for a directory via `git rev-parse --git-common-dir`.
|
|
136
|
+
* Returns null when git is unavailable or the directory is not inside a repo.
|
|
137
|
+
*/
|
|
138
|
+
export function gitMainRepoRoot(dir) {
|
|
139
|
+
try {
|
|
140
|
+
const res = spawnSync('git', ['-C', dir, 'rev-parse', '--git-common-dir'], {
|
|
141
|
+
encoding: 'utf-8',
|
|
142
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
143
|
+
});
|
|
144
|
+
if (res.error || res.status !== 0)
|
|
145
|
+
return null;
|
|
146
|
+
const out = res.stdout.trim();
|
|
147
|
+
if (!out)
|
|
148
|
+
return null;
|
|
149
|
+
// Relative when run from the toplevel (".git"), absolute from subdirs and
|
|
150
|
+
// worktrees - resolve against the queried dir to normalize.
|
|
151
|
+
const commonDir = resolve(dir, out);
|
|
152
|
+
return basename(commonDir) === '.git' ? dirname(commonDir) : commonDir;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=repo-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-binding.js","sourceRoot":"","sources":["../../src/lib/repo-binding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAA;AASpD,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8B,CAAA;AAE1D,mDAAmD;AACnD,MAAM,UAAU,qBAAqB;IACnC,YAAY,CAAC,KAAK,EAAE,CAAA;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACtC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IACvC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACpC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAChC,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,GAAG,GAAG,KAAK,CAAA;IACf,SAAS,CAAC;QACR,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI,OAAO;YAAE,OAAO,OAAO,CAAA;QAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAK;QACzB,GAAG,GAAG,MAAM,CAAA;IACd,CAAC;IAED,2EAA2E;IAC3E,sDAAsD;IACtD,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACvC,IAAI,QAAQ,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACnC,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAA;IACjD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAA;IAEtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAsB,CAAA;QAC/E,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAA;QACjD,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,YAAY,QAAQ,8CAA8C,CAAC,CAAA;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,YAAY,QAAQ,6CAA6C,CAAC,CAAA;IAClF,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAQD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAKhC;IACC,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAA;IAE3E,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,uGAAuG,CACxG,CAAA;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAA;IAEtD,IAAI,WAAW,GAA4B,EAAE,CAAA;IAC7C,IAAI,MAAM,GAAiC,SAAS,CAAA;IACpD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,QAAQ,GAAmC,IAAI,CAAA;QACnD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAY,CAAA;YACrE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,QAAQ,GAAG,MAAiC,CAAA;YAC9C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,QAAQ,CAAC,KAAK,CAAY,CAAC,CAAC,CAAC,IAAI,CAAA;QAC9F,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;YACxB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;QAC/C,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,WAAW;gBACT,CAAC,CAAC,GAAG,QAAQ,gCAAgC,WAAW,iCAAiC,GAAG,IAAI;gBAChG,CAAC,CAAC,GAAG,QAAQ,kEAAkE,CAClF,CAAA;QACH,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAA;YACvC,WAAW,GAAG,IAAI,CAAA;QACpB,CAAC;QACD,MAAM,GAAG,SAAS,CAAA;IACpB,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;QACrD,MAAM,OAAO,GAAG,SAAS;YACvB,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;YACzD,CAAC,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAA;QACzC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAClC,CAAC;IACD,qBAAqB,EAAE,CAAA;IACvB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;AAClC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE;YACxE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAA;QACF,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QAC7B,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,kBAAkB,CAAC,EAAE;YACzE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAA;QACF,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QAC7B,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACrB,0EAA0E;QAC1E,4DAA4D;QAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACnC,OAAO,QAAQ,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
|