@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.
Files changed (141) hide show
  1. package/README.md +88 -1
  2. package/dist/cli.js +27 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/api-keys.d.ts +3 -0
  5. package/dist/commands/api-keys.d.ts.map +1 -0
  6. package/dist/commands/api-keys.js +90 -0
  7. package/dist/commands/api-keys.js.map +1 -0
  8. package/dist/commands/hook.d.ts +6 -0
  9. package/dist/commands/hook.d.ts.map +1 -0
  10. package/dist/commands/hook.js +106 -0
  11. package/dist/commands/hook.js.map +1 -0
  12. package/dist/commands/login.d.ts +17 -0
  13. package/dist/commands/login.d.ts.map +1 -1
  14. package/dist/commands/login.js +111 -14
  15. package/dist/commands/login.js.map +1 -1
  16. package/dist/commands/orgs.d.ts +3 -0
  17. package/dist/commands/orgs.d.ts.map +1 -0
  18. package/dist/commands/orgs.js +102 -0
  19. package/dist/commands/orgs.js.map +1 -0
  20. package/dist/commands/push.d.ts.map +1 -1
  21. package/dist/commands/push.js +29 -6
  22. package/dist/commands/push.js.map +1 -1
  23. package/dist/commands/sessions.d.ts +3 -0
  24. package/dist/commands/sessions.d.ts.map +1 -0
  25. package/dist/commands/sessions.js +139 -0
  26. package/dist/commands/sessions.js.map +1 -0
  27. package/dist/commands/setup.d.ts.map +1 -1
  28. package/dist/commands/setup.js +28 -3
  29. package/dist/commands/setup.js.map +1 -1
  30. package/dist/commands/skills.d.ts +12 -0
  31. package/dist/commands/skills.d.ts.map +1 -0
  32. package/dist/commands/skills.js +171 -0
  33. package/dist/commands/skills.js.map +1 -0
  34. package/dist/commands/sync.d.ts.map +1 -1
  35. package/dist/commands/sync.js +51 -49
  36. package/dist/commands/sync.js.map +1 -1
  37. package/dist/commands/users.d.ts +13 -0
  38. package/dist/commands/users.d.ts.map +1 -0
  39. package/dist/commands/users.js +205 -0
  40. package/dist/commands/users.js.map +1 -0
  41. package/dist/commands/whoami.d.ts +21 -0
  42. package/dist/commands/whoami.d.ts.map +1 -0
  43. package/dist/commands/whoami.js +77 -0
  44. package/dist/commands/whoami.js.map +1 -0
  45. package/dist/lib/api-client.d.ts +64 -2
  46. package/dist/lib/api-client.d.ts.map +1 -1
  47. package/dist/lib/api-client.js +32 -7
  48. package/dist/lib/api-client.js.map +1 -1
  49. package/dist/lib/auth.d.ts +42 -6
  50. package/dist/lib/auth.d.ts.map +1 -1
  51. package/dist/lib/auth.js +101 -27
  52. package/dist/lib/auth.js.map +1 -1
  53. package/dist/lib/config-files.d.ts +6 -0
  54. package/dist/lib/config-files.d.ts.map +1 -0
  55. package/dist/lib/config-files.js +27 -0
  56. package/dist/lib/config-files.js.map +1 -0
  57. package/dist/lib/config.d.ts +13 -7
  58. package/dist/lib/config.d.ts.map +1 -1
  59. package/dist/lib/config.js +22 -8
  60. package/dist/lib/config.js.map +1 -1
  61. package/dist/lib/copilot-export.d.ts +31 -0
  62. package/dist/lib/copilot-export.d.ts.map +1 -0
  63. package/dist/lib/copilot-export.js +129 -0
  64. package/dist/lib/copilot-export.js.map +1 -0
  65. package/dist/lib/discovery.d.ts +60 -2
  66. package/dist/lib/discovery.d.ts.map +1 -1
  67. package/dist/lib/discovery.js +187 -15
  68. package/dist/lib/discovery.js.map +1 -1
  69. package/dist/lib/hook-discovery.d.ts +43 -0
  70. package/dist/lib/hook-discovery.d.ts.map +1 -0
  71. package/dist/lib/hook-discovery.js +90 -0
  72. package/dist/lib/hook-discovery.js.map +1 -0
  73. package/dist/lib/hook-input.d.ts +36 -0
  74. package/dist/lib/hook-input.d.ts.map +1 -0
  75. package/dist/lib/hook-input.js +161 -0
  76. package/dist/lib/hook-input.js.map +1 -0
  77. package/dist/lib/hook-runner.d.ts +48 -0
  78. package/dist/lib/hook-runner.d.ts.map +1 -0
  79. package/dist/lib/hook-runner.js +306 -0
  80. package/dist/lib/hook-runner.js.map +1 -0
  81. package/dist/lib/http.d.ts +18 -0
  82. package/dist/lib/http.d.ts.map +1 -0
  83. package/dist/lib/http.js +54 -0
  84. package/dist/lib/http.js.map +1 -0
  85. package/dist/lib/opencode-export.d.ts +22 -0
  86. package/dist/lib/opencode-export.d.ts.map +1 -0
  87. package/dist/lib/opencode-export.js +53 -0
  88. package/dist/lib/opencode-export.js.map +1 -0
  89. package/dist/lib/output.d.ts +27 -0
  90. package/dist/lib/output.d.ts.map +1 -0
  91. package/dist/lib/output.js +74 -0
  92. package/dist/lib/output.js.map +1 -0
  93. package/dist/lib/preflight.d.ts +35 -0
  94. package/dist/lib/preflight.d.ts.map +1 -0
  95. package/dist/lib/preflight.js +54 -0
  96. package/dist/lib/preflight.js.map +1 -0
  97. package/dist/lib/repo-binding.d.ts +43 -0
  98. package/dist/lib/repo-binding.d.ts.map +1 -0
  99. package/dist/lib/repo-binding.js +158 -0
  100. package/dist/lib/repo-binding.js.map +1 -0
  101. package/dist/lib/repo-identity.d.ts +29 -0
  102. package/dist/lib/repo-identity.d.ts.map +1 -0
  103. package/dist/lib/repo-identity.js +113 -0
  104. package/dist/lib/repo-identity.js.map +1 -0
  105. package/dist/lib/setup-hooks.d.ts +41 -0
  106. package/dist/lib/setup-hooks.d.ts.map +1 -0
  107. package/dist/lib/setup-hooks.js +276 -0
  108. package/dist/lib/setup-hooks.js.map +1 -0
  109. package/dist/lib/setup.d.ts +4 -1
  110. package/dist/lib/setup.d.ts.map +1 -1
  111. package/dist/lib/setup.js +20 -31
  112. package/dist/lib/setup.js.map +1 -1
  113. package/dist/lib/skill-batches.d.ts +16 -0
  114. package/dist/lib/skill-batches.d.ts.map +1 -0
  115. package/dist/lib/skill-batches.js +35 -0
  116. package/dist/lib/skill-batches.js.map +1 -0
  117. package/dist/lib/skill-files.d.ts +4 -0
  118. package/dist/lib/skill-files.d.ts.map +1 -0
  119. package/dist/lib/skill-files.js +36 -0
  120. package/dist/lib/skill-files.js.map +1 -0
  121. package/dist/lib/skill-fingerprint.d.ts +55 -0
  122. package/dist/lib/skill-fingerprint.d.ts.map +1 -0
  123. package/dist/lib/skill-fingerprint.js +204 -0
  124. package/dist/lib/skill-fingerprint.js.map +1 -0
  125. package/dist/lib/skills-discovery.d.ts +57 -0
  126. package/dist/lib/skills-discovery.d.ts.map +1 -0
  127. package/dist/lib/skills-discovery.js +157 -0
  128. package/dist/lib/skills-discovery.js.map +1 -0
  129. package/dist/lib/skills-sync.d.ts +66 -0
  130. package/dist/lib/skills-sync.d.ts.map +1 -0
  131. package/dist/lib/skills-sync.js +251 -0
  132. package/dist/lib/skills-sync.js.map +1 -0
  133. package/dist/lib/sync-runner.d.ts +56 -0
  134. package/dist/lib/sync-runner.d.ts.map +1 -0
  135. package/dist/lib/sync-runner.js +106 -0
  136. package/dist/lib/sync-runner.js.map +1 -0
  137. package/dist/lib/sync-state.d.ts +36 -6
  138. package/dist/lib/sync-state.d.ts.map +1 -1
  139. package/dist/lib/sync-state.js +41 -11
  140. package/dist/lib/sync-state.js.map +1 -1
  141. 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"}
@@ -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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAQxD,SAAS,IAAI,CAAC,GAA4B,EAAE,MAAc;IACxD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC7B,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,GAAG,CAAA;IACrE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,IAA+B,EAAE,OAAiB;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CACzE,CAAA;IACD,MAAM,KAAK,GAAG;QACZ,OAAO;aACJ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;aAC9C,IAAI,CAAC,IAAI,CAAC;aACV,OAAO,EAAE;KACb,CAAA;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CACR,OAAO;aACJ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;aAClD,IAAI,CAAC,IAAI,CAAC;aACV,OAAO,EAAE,CACb,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAA+B,EAAE,OAAiB;IAC3E,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAA;IACtB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACpC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,GAAG,CAAA;IAC5C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACrD,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAA;AACrI,CAAC;AAUD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,UAA0B,EAAE;IACzE,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAE9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAA;IAC3D,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,8DAA8D,CAAC,CAAA;QACvF,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,GAAG,GACP,OAAO,CAAC,UAAU;QAClB,CAAC,KAAK,EAAE,QAAgB,EAAE,EAAE;YAC1B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;YAC5E,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YACpC,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAA;YACZ,CAAC;QACH,CAAC,CAAC,CAAA;IAEJ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,OAAO,SAAS,CAAC,CAAA;IAC7C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAA;AACrF,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC"}
@@ -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":"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"}