@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.
Files changed (142) hide show
  1. package/README.md +115 -0
  2. package/dist/cli.js +30 -3
  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 +170 -65
  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 +3 -0
  28. package/dist/commands/setup.d.ts.map +1 -0
  29. package/dist/commands/setup.js +58 -0
  30. package/dist/commands/setup.js.map +1 -0
  31. package/dist/commands/skills.d.ts +12 -0
  32. package/dist/commands/skills.d.ts.map +1 -0
  33. package/dist/commands/skills.js +171 -0
  34. package/dist/commands/skills.js.map +1 -0
  35. package/dist/commands/sync.d.ts.map +1 -1
  36. package/dist/commands/sync.js +51 -49
  37. package/dist/commands/sync.js.map +1 -1
  38. package/dist/commands/users.d.ts +13 -0
  39. package/dist/commands/users.d.ts.map +1 -0
  40. package/dist/commands/users.js +205 -0
  41. package/dist/commands/users.js.map +1 -0
  42. package/dist/commands/whoami.d.ts +21 -0
  43. package/dist/commands/whoami.d.ts.map +1 -0
  44. package/dist/commands/whoami.js +77 -0
  45. package/dist/commands/whoami.js.map +1 -0
  46. package/dist/lib/api-client.d.ts +64 -2
  47. package/dist/lib/api-client.d.ts.map +1 -1
  48. package/dist/lib/api-client.js +32 -7
  49. package/dist/lib/api-client.js.map +1 -1
  50. package/dist/lib/auth.d.ts +43 -6
  51. package/dist/lib/auth.d.ts.map +1 -1
  52. package/dist/lib/auth.js +106 -25
  53. package/dist/lib/auth.js.map +1 -1
  54. package/dist/lib/config-files.d.ts +6 -0
  55. package/dist/lib/config-files.d.ts.map +1 -0
  56. package/dist/lib/config-files.js +27 -0
  57. package/dist/lib/config-files.js.map +1 -0
  58. package/dist/lib/config.d.ts +13 -7
  59. package/dist/lib/config.d.ts.map +1 -1
  60. package/dist/lib/config.js +22 -8
  61. package/dist/lib/config.js.map +1 -1
  62. package/dist/lib/copilot-export.d.ts +31 -0
  63. package/dist/lib/copilot-export.d.ts.map +1 -0
  64. package/dist/lib/copilot-export.js +129 -0
  65. package/dist/lib/copilot-export.js.map +1 -0
  66. package/dist/lib/discovery.d.ts +60 -2
  67. package/dist/lib/discovery.d.ts.map +1 -1
  68. package/dist/lib/discovery.js +187 -15
  69. package/dist/lib/discovery.js.map +1 -1
  70. package/dist/lib/hook-discovery.d.ts +43 -0
  71. package/dist/lib/hook-discovery.d.ts.map +1 -0
  72. package/dist/lib/hook-discovery.js +90 -0
  73. package/dist/lib/hook-discovery.js.map +1 -0
  74. package/dist/lib/hook-input.d.ts +36 -0
  75. package/dist/lib/hook-input.d.ts.map +1 -0
  76. package/dist/lib/hook-input.js +161 -0
  77. package/dist/lib/hook-input.js.map +1 -0
  78. package/dist/lib/hook-runner.d.ts +48 -0
  79. package/dist/lib/hook-runner.d.ts.map +1 -0
  80. package/dist/lib/hook-runner.js +306 -0
  81. package/dist/lib/hook-runner.js.map +1 -0
  82. package/dist/lib/http.d.ts +18 -0
  83. package/dist/lib/http.d.ts.map +1 -0
  84. package/dist/lib/http.js +54 -0
  85. package/dist/lib/http.js.map +1 -0
  86. package/dist/lib/opencode-export.d.ts +22 -0
  87. package/dist/lib/opencode-export.d.ts.map +1 -0
  88. package/dist/lib/opencode-export.js +53 -0
  89. package/dist/lib/opencode-export.js.map +1 -0
  90. package/dist/lib/output.d.ts +27 -0
  91. package/dist/lib/output.d.ts.map +1 -0
  92. package/dist/lib/output.js +74 -0
  93. package/dist/lib/output.js.map +1 -0
  94. package/dist/lib/preflight.d.ts +35 -0
  95. package/dist/lib/preflight.d.ts.map +1 -0
  96. package/dist/lib/preflight.js +54 -0
  97. package/dist/lib/preflight.js.map +1 -0
  98. package/dist/lib/repo-binding.d.ts +43 -0
  99. package/dist/lib/repo-binding.d.ts.map +1 -0
  100. package/dist/lib/repo-binding.js +158 -0
  101. package/dist/lib/repo-binding.js.map +1 -0
  102. package/dist/lib/repo-identity.d.ts +29 -0
  103. package/dist/lib/repo-identity.d.ts.map +1 -0
  104. package/dist/lib/repo-identity.js +113 -0
  105. package/dist/lib/repo-identity.js.map +1 -0
  106. package/dist/lib/setup-hooks.d.ts +41 -0
  107. package/dist/lib/setup-hooks.d.ts.map +1 -0
  108. package/dist/lib/setup-hooks.js +276 -0
  109. package/dist/lib/setup-hooks.js.map +1 -0
  110. package/dist/lib/setup.d.ts +47 -0
  111. package/dist/lib/setup.d.ts.map +1 -0
  112. package/dist/lib/setup.js +179 -0
  113. package/dist/lib/setup.js.map +1 -0
  114. package/dist/lib/skill-batches.d.ts +16 -0
  115. package/dist/lib/skill-batches.d.ts.map +1 -0
  116. package/dist/lib/skill-batches.js +35 -0
  117. package/dist/lib/skill-batches.js.map +1 -0
  118. package/dist/lib/skill-files.d.ts +4 -0
  119. package/dist/lib/skill-files.d.ts.map +1 -0
  120. package/dist/lib/skill-files.js +36 -0
  121. package/dist/lib/skill-files.js.map +1 -0
  122. package/dist/lib/skill-fingerprint.d.ts +55 -0
  123. package/dist/lib/skill-fingerprint.d.ts.map +1 -0
  124. package/dist/lib/skill-fingerprint.js +204 -0
  125. package/dist/lib/skill-fingerprint.js.map +1 -0
  126. package/dist/lib/skills-discovery.d.ts +57 -0
  127. package/dist/lib/skills-discovery.d.ts.map +1 -0
  128. package/dist/lib/skills-discovery.js +157 -0
  129. package/dist/lib/skills-discovery.js.map +1 -0
  130. package/dist/lib/skills-sync.d.ts +66 -0
  131. package/dist/lib/skills-sync.d.ts.map +1 -0
  132. package/dist/lib/skills-sync.js +251 -0
  133. package/dist/lib/skills-sync.js.map +1 -0
  134. package/dist/lib/sync-runner.d.ts +56 -0
  135. package/dist/lib/sync-runner.d.ts.map +1 -0
  136. package/dist/lib/sync-runner.js +106 -0
  137. package/dist/lib/sync-runner.js.map +1 -0
  138. package/dist/lib/sync-state.d.ts +36 -6
  139. package/dist/lib/sync-state.d.ts.map +1 -1
  140. package/dist/lib/sync-state.js +41 -11
  141. package/dist/lib/sync-state.js.map +1 -1
  142. package/package.json +16 -8
@@ -0,0 +1,139 @@
1
+ import { Command } from 'commander';
2
+ import { apiFetch, ApiError } from '../lib/http.js';
3
+ import { printTable, printJson, formatDate, fail } from '../lib/output.js';
4
+ function formatSize(value) {
5
+ if (typeof value !== 'number')
6
+ return '-';
7
+ return `${(value / 1024).toFixed(1)} KB`;
8
+ }
9
+ /** Wall-clock span between first and last activity on the session. */
10
+ function formatDuration(row) {
11
+ const start = new Date(String(row['createdAt'])).getTime();
12
+ const end = new Date(String(row['updatedAt'])).getTime();
13
+ if (Number.isNaN(start) || Number.isNaN(end) || end < start)
14
+ return '-';
15
+ const totalMinutes = Math.round((end - start) / 60_000);
16
+ const hours = Math.floor(totalMinutes / 60);
17
+ const minutes = totalMinutes % 60;
18
+ return hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;
19
+ }
20
+ export function sessionsCommand() {
21
+ const sessions = new Command('sessions').description('Inspect uploaded agent sessions (use --json for machine-readable output)');
22
+ sessions
23
+ .command('list')
24
+ .description('List sessions in the organization')
25
+ .option('--state <state>', 'Filter by state (RUNNING, NEEDS_INPUT, COMPLETED, FAILED)')
26
+ .option('--limit <n>', 'Max sessions to return (default 50)')
27
+ .option('--offset <n>', 'Pagination offset')
28
+ .action(async function () {
29
+ const globalOpts = this.optsWithGlobals();
30
+ const apiUrl = globalOpts.apiUrl;
31
+ const opts = this.opts();
32
+ const params = new URLSearchParams();
33
+ if (opts.state)
34
+ params.set('state', opts.state);
35
+ if (opts.limit)
36
+ params.set('limit', opts.limit);
37
+ if (opts.offset)
38
+ params.set('offset', opts.offset);
39
+ const query = params.size > 0 ? `?${params.toString()}` : '';
40
+ let response;
41
+ try {
42
+ response = await apiFetch(apiUrl, `/api/v1/sessions${query}`);
43
+ }
44
+ catch (err) {
45
+ fail(err instanceof Error ? err.message : String(err));
46
+ }
47
+ if (globalOpts.json) {
48
+ printJson(response);
49
+ return;
50
+ }
51
+ if (response.sessions.length === 0) {
52
+ console.log('No sessions found.');
53
+ return;
54
+ }
55
+ const rows = response.sessions.map((session) => ({
56
+ ...session,
57
+ duration: formatDuration(session),
58
+ }));
59
+ printTable(rows, [
60
+ { key: 'id', header: 'ID' },
61
+ { key: 'source', header: 'SOURCE' },
62
+ { key: 'state', header: 'STATE' },
63
+ { key: 'name', header: 'NAME' },
64
+ { key: 'eventCount', header: 'EVENTS' },
65
+ { key: 'rawLogSizeBytes', header: 'LOG SIZE', format: formatSize },
66
+ { key: 'createdAt', header: 'STARTED', format: formatDate },
67
+ { key: 'duration', header: 'DURATION' },
68
+ ]);
69
+ console.log('');
70
+ console.log(`${response.sessions.length} of ${response.total} session(s)`);
71
+ });
72
+ sessions
73
+ .command('describe')
74
+ .description('Show full session details (conversations, latest events, client)')
75
+ .argument('<id>', 'Session ID (from `halyard sessions list`)')
76
+ .action(async function (id) {
77
+ const globalOpts = this.optsWithGlobals();
78
+ const apiUrl = globalOpts.apiUrl;
79
+ let response;
80
+ try {
81
+ response = await apiFetch(apiUrl, `/api/v1/sessions/${id}`);
82
+ }
83
+ catch (err) {
84
+ if (err instanceof ApiError && err.status === 404) {
85
+ fail('Session not found in this organization.');
86
+ }
87
+ fail(err instanceof Error ? err.message : String(err));
88
+ }
89
+ if (globalOpts.json) {
90
+ printJson(response);
91
+ return;
92
+ }
93
+ const s = response.session;
94
+ const row = (label, value) => console.log(`${label.padEnd(12)}${value}`);
95
+ row('ID:', String(s['id']));
96
+ row('Name:', s['name'] ? String(s['name']) : '-');
97
+ row('Source:', String(s['source']));
98
+ row('State:', String(s['state']));
99
+ row('Started:', formatDate(s['createdAt']));
100
+ row('Updated:', formatDate(s['updatedAt']));
101
+ row('Duration:', formatDuration(s));
102
+ row('Log size:', formatSize(s['rawLogSizeBytes']));
103
+ const events = s['events'];
104
+ const conversations = s['conversations'];
105
+ row('Events:', String(events?.length ?? 0) + ' (latest 100; use `sessions events` for all)');
106
+ row('Convos:', String(conversations?.length ?? 0));
107
+ });
108
+ sessions
109
+ .command('events')
110
+ .description('Fetch session events as JSON (payloads for cost/length analysis)')
111
+ .argument('<id>', 'Session ID')
112
+ .option('--limit <n>', 'Max events to return (default 50)')
113
+ .option('--offset <n>', 'Pagination offset')
114
+ .action(async function (id) {
115
+ const globalOpts = this.optsWithGlobals();
116
+ const apiUrl = globalOpts.apiUrl;
117
+ const opts = this.opts();
118
+ const params = new URLSearchParams();
119
+ if (opts.limit)
120
+ params.set('limit', opts.limit);
121
+ if (opts.offset)
122
+ params.set('offset', opts.offset);
123
+ const query = params.size > 0 ? `?${params.toString()}` : '';
124
+ let response;
125
+ try {
126
+ response = await apiFetch(apiUrl, `/api/v1/sessions/${id}/events${query}`);
127
+ }
128
+ catch (err) {
129
+ if (err instanceof ApiError && err.status === 404) {
130
+ fail('Session not found in this organization.');
131
+ }
132
+ fail(err instanceof Error ? err.message : String(err));
133
+ }
134
+ // Event payloads are arbitrary JSON - always emit JSON here.
135
+ printJson(response);
136
+ });
137
+ return sessions;
138
+ }
139
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAoB1E,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA;IACzC,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;AAC1C,CAAC;AAED,sEAAsE;AACtE,SAAS,cAAc,CAAC,GAA4B;IAClD,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;IAC1D,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;IACxD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,KAAK;QAAE,OAAO,GAAG,CAAA;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAA;IACjC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAA;AAC5D,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAClD,0EAA0E,CAC3E,CAAA;IAED,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,2DAA2D,CAAC;SACtF,MAAM,CAAC,aAAa,EAAE,qCAAqC,CAAC;SAC5D,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;SAC3C,MAAM,CAAC,KAAK;QACX,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAgB,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAExB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;QACpC,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAe,CAAC,CAAA;QACzD,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAe,CAAC,CAAA;QACzD,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAgB,CAAC,CAAA;QAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAE5D,IAAI,QAA6B,CAAA;QACjC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,QAAQ,CAAsB,MAAM,EAAE,mBAAmB,KAAK,EAAE,CAAC,CAAA;QACpF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YACpB,SAAS,CAAC,QAAQ,CAAC,CAAA;YACnB,OAAM;QACR,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;YACjC,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/C,GAAG,OAAO;YACV,QAAQ,EAAE,cAAc,CAAC,OAA6C,CAAC;SACxE,CAAC,CAAC,CAAA;QACH,UAAU,CAAC,IAA4C,EAAE;YACvD,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;YAC3B,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;YACnC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;YACjC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;YAC/B,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE;YACvC,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE;YAClE,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE;YAC3D,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE;SACxC,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,OAAO,QAAQ,CAAC,KAAK,aAAa,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEJ,QAAQ;SACL,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,QAAQ,CAAC,MAAM,EAAE,2CAA2C,CAAC;SAC7D,MAAM,CAAC,KAAK,WAA0B,EAAU;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAgB,CAAA;QAE1C,IAAI,QAA8C,CAAA;QAClD,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,QAAQ,CACvB,MAAM,EACN,oBAAoB,EAAE,EAAE,CACzB,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAClD,IAAI,CAAC,yCAAyC,CAAC,CAAA;YACjD,CAAC;YACD,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YACpB,SAAS,CAAC,QAAQ,CAAC,CAAA;YACnB,OAAM;QACR,CAAC;QAED,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC1B,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAA;QACxF,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC3B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACjD,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACnC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACjC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QAC3C,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QAC3C,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;QACnC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAA0B,CAAA;QACnD,MAAM,aAAa,GAAG,CAAC,CAAC,eAAe,CAA0B,CAAA;QACjE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,8CAA8C,CAAC,CAAA;QAC5F,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEJ,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,aAAa,EAAE,mCAAmC,CAAC;SAC1D,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;SAC3C,MAAM,CAAC,KAAK,WAA0B,EAAU;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAgB,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAExB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;QACpC,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAe,CAAC,CAAA;QACzD,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAgB,CAAC,CAAA;QAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAE5D,IAAI,QAA8C,CAAA;QAClD,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,QAAQ,CACvB,MAAM,EACN,oBAAoB,EAAE,UAAU,KAAK,EAAE,CACxC,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAClD,IAAI,CAAC,yCAAyC,CAAC,CAAA;YACjD,CAAC;YACD,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QACxD,CAAC;QAED,6DAA6D;QAC7D,SAAS,CAAC,QAAQ,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;IAEJ,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function setupCommand(): Command;
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,wBAAgB,YAAY,IAAI,OAAO,CAwDtC"}
@@ -0,0 +1,58 @@
1
+ import { Command } from 'commander';
2
+ import { runSetup } from '../lib/setup.js';
3
+ import { writeRepoBinding } from '../lib/repo-binding.js';
4
+ export function setupCommand() {
5
+ return new Command('setup')
6
+ .alias('init')
7
+ .description('Scaffold Halyard for Claude Code, Cursor, and Codex')
8
+ .option('--dry-run', 'Show the changes without writing config files')
9
+ .option('--org <slug>', 'Bind this repo to an organization (writes .halyard.json; sync, push and the session-upload hooks refuse credentials for any other org)')
10
+ .option('--force', 'Overwrite an existing .halyard.json bound to a different org')
11
+ .option('--no-hooks', 'Skip the session-upload hooks (launcher + per-client lifecycle hook config)')
12
+ .action(async function () {
13
+ const opts = this.opts();
14
+ const dryRun = !!opts.dryRun;
15
+ const org = opts.org;
16
+ if (org) {
17
+ try {
18
+ const binding = writeRepoBinding({ org, force: !!opts.force, dryRun });
19
+ console.log(formatBindingResult(binding.status, binding.filePath, org, dryRun));
20
+ }
21
+ catch (err) {
22
+ console.error(err instanceof Error ? err.message : String(err));
23
+ process.exit(1);
24
+ }
25
+ }
26
+ const results = runSetup({ dryRun, hooks: opts.hooks !== false });
27
+ console.log(dryRun
28
+ ? 'Previewing Halyard scaffold for this repository...'
29
+ : 'Scaffolding Halyard for this repository...');
30
+ for (const entry of results) {
31
+ console.log(formatResult(entry));
32
+ }
33
+ console.log('');
34
+ console.log(dryRun
35
+ ? 'Dry run only. Re-run without `--dry-run` to write the scaffold.'
36
+ : 'Scaffold complete. Claude/Cursor/Codex will prompt for OAuth the first time Halyard is used;\n' +
37
+ 'every client now uploads its sessions through .halyard/hook.sh -> `halyard hook` (see `halyard hook --help`).');
38
+ console.log('Zero-install usage: `bunx @halyard/cli init` or `pnpm dlx @halyard/cli init` from your repo root.');
39
+ if (results.some((entry) => entry.status === 'error')) {
40
+ process.exit(1);
41
+ }
42
+ });
43
+ }
44
+ function formatBindingResult(status, filePath, org, dryRun) {
45
+ if (status === 'unchanged') {
46
+ return `Repo already bound to "${org}" (${filePath}).`;
47
+ }
48
+ const verb = status === 'created' ? 'Bound' : 'Rebound';
49
+ return dryRun
50
+ ? `[dry-run] Would ${verb.toLowerCase()} this repo to "${org}" (${filePath}).`
51
+ : `${verb} this repo to "${org}" (${filePath}).`;
52
+ }
53
+ function formatResult(entry) {
54
+ const status = entry.status.padEnd(9, ' ');
55
+ const label = `${entry.target}:${entry.scope}`.padEnd(18, ' ');
56
+ return ` ${status} ${label} ${entry.location} - ${entry.detail}`;
57
+ }
58
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Command } from 'commander';
2
+ import type { SkillUpload } from '../lib/api-client.js';
3
+ import { type DiscoveredSkill } from '../lib/skills-discovery.js';
4
+ /**
5
+ * One `skills list` row. `upload` says how many manifest files would go up
6
+ * with their bytes — SKILL.md rides as front-matter + body, so a lone
7
+ * SKILL.md reads `0/1 files` — which keeps the dry run honest about what
8
+ * the sync sends.
9
+ */
10
+ export declare function skillListRow(skill: DiscoveredSkill, upload: SkillUpload): Record<string, unknown>;
11
+ export declare function skillsCommand(): Command;
12
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAavD,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAA;AAqBnC;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAcjG;AAsHD,wBAAgB,aAAa,IAAI,OAAO,CAoBvC"}
@@ -0,0 +1,171 @@
1
+ import { homedir } from 'node:os';
2
+ import { Command } from 'commander';
3
+ import { getAuthHeaders } from '../lib/auth.js';
4
+ import { printJson, printTable } from '../lib/output.js';
5
+ import { runPreflight } from '../lib/preflight.js';
6
+ import { findRepoBinding, gitToplevel } from '../lib/repo-binding.js';
7
+ import { discoverSelectedSkills, prepareSkill, projectScopeKey, runSkillsSync, } from '../lib/skills-sync.js';
8
+ import { USER_SKILL_LOCATIONS, PROJECT_SKILL_LOCATIONS, } from '../lib/skills-discovery.js';
9
+ function parseScope(value) {
10
+ if (value === 'user' || value === 'project' || value === 'all')
11
+ return value;
12
+ if (value === undefined)
13
+ return 'all';
14
+ console.error(`Invalid --scope "${String(value)}": expected user, project or all`);
15
+ process.exit(1);
16
+ }
17
+ /** The repo whose skills count as project scope: the binding root, else the git toplevel. */
18
+ function resolveProjectRoot() {
19
+ return findRepoBinding()?.rootDir ?? gitToplevel(process.cwd()) ?? undefined;
20
+ }
21
+ function lookedIn(scope) {
22
+ const user = USER_SKILL_LOCATIONS.map((l) => `~/${l.dir}`);
23
+ const project = PROJECT_SKILL_LOCATIONS.map((l) => `<repo>/${l.dir}`);
24
+ const dirs = scope === 'user' ? user : scope === 'project' ? project : [...user, ...project];
25
+ return `Looked in: ${dirs.join(', ')}`;
26
+ }
27
+ /**
28
+ * One `skills list` row. `upload` says how many manifest files would go up
29
+ * with their bytes — SKILL.md rides as front-matter + body, so a lone
30
+ * SKILL.md reads `0/1 files` — which keeps the dry run honest about what
31
+ * the sync sends.
32
+ */
33
+ export function skillListRow(skill, upload) {
34
+ const withContent = upload.files.filter((f) => f.content !== undefined).length;
35
+ return {
36
+ name: upload.name,
37
+ scope: skill.scope,
38
+ harnesses: skill.harnesses.join(','),
39
+ path: skill.relativePath,
40
+ files: upload.files.length,
41
+ upload: `${withContent}/${upload.files.length} files`,
42
+ hash: upload.treeHash.slice(0, 12),
43
+ description: upload.description ?? '',
44
+ locations: skill.locations,
45
+ dir: skill.dir,
46
+ };
47
+ }
48
+ function listAction() {
49
+ const opts = this.opts();
50
+ const scope = parseScope(opts.scope);
51
+ const json = !!this.optsWithGlobals().json;
52
+ const projectRoot = resolveProjectRoot();
53
+ const skills = discoverSelectedSkills({ scope, homeDir: homedir(), projectRoot });
54
+ const projectKey = projectRoot ? projectScopeKey(projectRoot) : '';
55
+ const rows = [];
56
+ for (const skill of skills) {
57
+ try {
58
+ const { upload, warnings } = prepareSkill(skill, skill.scope === 'project' ? projectKey : '');
59
+ for (const warning of warnings)
60
+ console.error(`warning: ${skill.relativePath}: ${warning}`);
61
+ rows.push(skillListRow(skill, upload));
62
+ }
63
+ catch (err) {
64
+ console.error(`error: ${skill.relativePath}: ${err instanceof Error ? err.message : String(err)}`);
65
+ process.exitCode = 1;
66
+ }
67
+ }
68
+ if (json) {
69
+ printJson(rows);
70
+ return;
71
+ }
72
+ if (rows.length === 0) {
73
+ console.log('No skills found.');
74
+ console.log(lookedIn(scope));
75
+ return;
76
+ }
77
+ printTable(rows, [
78
+ { key: 'name', header: 'NAME' },
79
+ { key: 'scope', header: 'SCOPE' },
80
+ { key: 'harnesses', header: 'HARNESSES' },
81
+ { key: 'path', header: 'PATH' },
82
+ { key: 'files', header: 'FILES' },
83
+ { key: 'upload', header: 'UPLOAD' },
84
+ { key: 'hash', header: 'HASH' },
85
+ ]);
86
+ }
87
+ async function syncAction() {
88
+ const opts = this.opts();
89
+ const globalOpts = this.optsWithGlobals();
90
+ const apiUrl = globalOpts.apiUrl;
91
+ const json = !!globalOpts.json;
92
+ const scope = parseScope(opts.scope);
93
+ const dryRun = !!opts.dryRun;
94
+ const force = !!opts.force;
95
+ const projectRoot = resolveProjectRoot();
96
+ const binding = findRepoBinding();
97
+ // --json keeps stdout for the summary object; progress goes to stderr.
98
+ const log = json ? console.error : console.log;
99
+ let target;
100
+ let authHeaders;
101
+ try {
102
+ target = await runPreflight({
103
+ apiUrl,
104
+ binding,
105
+ scopeLabel: scope === 'user' ? 'personal skills' : 'skills',
106
+ print: log,
107
+ });
108
+ authHeaders = await getAuthHeaders(apiUrl);
109
+ }
110
+ catch (err) {
111
+ console.error(err instanceof Error ? err.message : String(err));
112
+ process.exit(1);
113
+ }
114
+ if (scope !== 'user' && !projectRoot) {
115
+ log(scope === 'project'
116
+ ? 'Not inside a git repository - no project skills to sync.'
117
+ : 'Not inside a git repository - syncing personal skills only.');
118
+ }
119
+ log('Discovering skills...');
120
+ const summary = await runSkillsSync({
121
+ homeDir: homedir(),
122
+ projectRoot,
123
+ scope,
124
+ stateKey: target.stateKey,
125
+ authHeaders,
126
+ apiUrl,
127
+ dryRun,
128
+ force,
129
+ log,
130
+ });
131
+ if (json) {
132
+ printJson(summary);
133
+ }
134
+ else if (summary.found === 0) {
135
+ console.log('No skills found.');
136
+ console.log(lookedIn(scope));
137
+ }
138
+ else {
139
+ console.log('');
140
+ console.log(summaryLine(summary, dryRun));
141
+ }
142
+ if (summary.failed > 0)
143
+ process.exitCode = 1;
144
+ }
145
+ function summaryLine(summary, dryRun) {
146
+ if (dryRun) {
147
+ const pending = summary.found - summary.skipped - summary.failed;
148
+ return (`Dry run: ${summary.found} found, ${pending} would sync, ` +
149
+ `${summary.skipped} already synced, ${summary.failed} unreadable`);
150
+ }
151
+ return (`Skills sync complete: ${summary.found} found, ${summary.created} created, ` +
152
+ `${summary.updated} updated, ${summary.unchanged} unchanged, ` +
153
+ `${summary.skipped} already synced, ${summary.failed} failed`);
154
+ }
155
+ export function skillsCommand() {
156
+ const skills = new Command('skills').description('Discover agent skills (SKILL.md folders) on this machine and sync them to Halyard');
157
+ skills
158
+ .command('list')
159
+ .description('List the skills discovered in the user and project skill directories')
160
+ .option('--scope <scope>', 'user | project | all (default: all)')
161
+ .action(listAction);
162
+ skills
163
+ .command('sync')
164
+ .description('Upload new or changed skills to the knowledge base (fingerprint-deduplicated)')
165
+ .option('--scope <scope>', 'user | project | all (default: all)')
166
+ .option('--dry-run', 'Show what would be synced without uploading')
167
+ .option('--force', 'Ignore the local ledger and re-send every skill (server still dedupes)')
168
+ .action(syncAction);
169
+ return skills;
170
+ }
171
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAkB,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,eAAe,EACf,aAAa,GAGd,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,4BAA4B,CAAA;AAEnC,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAA;IAC5E,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACrC,OAAO,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,6FAA6F;AAC7F,SAAS,kBAAkB;IACzB,OAAO,eAAe,EAAE,EAAE,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,SAAS,CAAA;AAC9E,CAAC;AAED,SAAS,QAAQ,CAAC,KAA0B;IAC1C,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;IAC1D,MAAM,OAAO,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;IACrE,MAAM,IAAI,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,CAAA;IAC5F,OAAO,cAAc,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAsB,EAAE,MAAmB;IACtE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,MAAM,CAAA;IAC9E,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACpC,IAAI,EAAE,KAAK,CAAC,YAAY;QACxB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;QAC1B,MAAM,EAAE,GAAG,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ;QACrD,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAClC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;QACrC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAA;AACH,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IACxB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC1C,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAA;IACxC,MAAM,MAAM,GAAG,sBAAsB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;IACjF,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAClE,MAAM,IAAI,GAA8B,EAAE,CAAA;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAC7F,KAAK,MAAM,OAAO,IAAI,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC,CAAA;YAC3F,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,UAAU,KAAK,CAAC,YAAY,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpF,CAAA;YACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,SAAS,CAAC,IAAI,CAAC,CAAA;QACf,OAAM;IACR,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;QAC5B,OAAM;IACR,CAAC;IACD,UAAU,CAAC,IAAI,EAAE;QACf,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;QAC/B,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QACjC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE;QACzC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;QAC/B,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QACjC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;QACnC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAgB,CAAA;IAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAA;IAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;IAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;IAC1B,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAA;IACjC,uEAAuE;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAA;IAE9C,IAAI,MAAiB,CAAA;IACrB,IAAI,WAAmC,CAAA;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,YAAY,CAAC;YAC1B,MAAM;YACN,OAAO;YACP,UAAU,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ;YAC3D,KAAK,EAAE,GAAG;SACX,CAAC,CAAA;QACF,WAAW,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAA;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,GAAG,CACD,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,0DAA0D;YAC5D,CAAC,CAAC,6DAA6D,CAClE,CAAA;IACH,CAAC;IAED,GAAG,CAAC,uBAAuB,CAAC,CAAA;IAC5B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE;QAClB,WAAW;QACX,KAAK;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW;QACX,MAAM;QACN,MAAM;QACN,KAAK;QACL,GAAG;KACJ,CAAC,CAAA;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,SAAS,CAAC,OAAO,CAAC,CAAA;IACpB,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,OAA0B,EAAE,MAAe;IAC9D,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;QAChE,OAAO,CACL,YAAY,OAAO,CAAC,KAAK,WAAW,OAAO,eAAe;YAC1D,GAAG,OAAO,CAAC,OAAO,oBAAoB,OAAO,CAAC,MAAM,aAAa,CAClE,CAAA;IACH,CAAC;IACD,OAAO,CACL,yBAAyB,OAAO,CAAC,KAAK,WAAW,OAAO,CAAC,OAAO,YAAY;QAC5E,GAAG,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC,SAAS,cAAc;QAC9D,GAAG,OAAO,CAAC,OAAO,oBAAoB,OAAO,CAAC,MAAM,SAAS,CAC9D,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAC9C,mFAAmF,CACpF,CAAA;IAED,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,UAAU,CAAC,CAAA;IAErB,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,+EAA+E,CAAC;SAC5F,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;SAClE,MAAM,CAAC,SAAS,EAAE,wEAAwE,CAAC;SAC3F,MAAM,CAAC,UAAU,CAAC,CAAA;IAErB,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYnC,wBAAgB,WAAW,IAAI,OAAO,CAgGrC"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,wBAAgB,WAAW,IAAI,OAAO,CA6FrC"}
@@ -1,21 +1,45 @@
1
- import { readFileSync } from 'node:fs';
2
1
  import { Command } from 'commander';
3
2
  import { getAuthHeaders } from '../lib/auth.js';
4
- import { discoverAllSessions } from '../lib/discovery.js';
5
- import { readSyncState, writeSyncState, isUploaded, markUploaded, hashFileContents, } from '../lib/sync-state.js';
6
- import { uploadSession } from '../lib/api-client.js';
3
+ import { SESSION_PROVIDERS } from '../lib/discovery.js';
4
+ import { findRepoBinding } from '../lib/repo-binding.js';
5
+ import { runPreflight } from '../lib/preflight.js';
6
+ import { discoverScopedSessions, uploadSessions } from '../lib/sync-runner.js';
7
+ import { readSyncState, writeSyncState } from '../lib/sync-state.js';
7
8
  export function syncCommand() {
8
9
  return new Command('sync')
9
10
  .description('Discover and upload new session logs to Halyard')
10
- .option('--provider <provider>', 'Filter by provider (claude, codex)')
11
+ .option('--provider <provider>', `Filter by provider (${SESSION_PROVIDERS.join(', ')})`)
11
12
  .option('--dry-run', 'Show what would be uploaded without uploading')
13
+ .option('--all', 'Sync every session on this machine, ignoring the repo binding scope')
12
14
  .action(async function () {
13
15
  const opts = this.opts();
14
16
  const globalOpts = this.optsWithGlobals();
15
17
  const apiUrl = globalOpts.apiUrl;
16
18
  const providerFilter = opts.provider;
17
19
  const dryRun = !!opts.dryRun;
18
- // Authenticate
20
+ const all = !!opts.all;
21
+ const binding = findRepoBinding();
22
+ const scoped = binding !== null && !all;
23
+ // Preflight: resolve + print the destination org; hard-fail on a
24
+ // binding/credentials org mismatch (also under --dry-run). --all is the
25
+ // explicit machine-wide escape hatch, so it bypasses the binding guard
26
+ // along with the scoping (old behavior).
27
+ let target;
28
+ try {
29
+ target = await runPreflight({
30
+ apiUrl,
31
+ binding: scoped ? binding : null,
32
+ scopeLabel: scoped ? binding.rootDir : 'all sessions',
33
+ });
34
+ }
35
+ catch (err) {
36
+ console.error(err instanceof Error ? err.message : String(err));
37
+ process.exit(1);
38
+ }
39
+ if (!binding && !all) {
40
+ console.log('No .halyard.json repo binding found - syncing all sessions on this machine.\n' +
41
+ 'Run `halyard setup --org <slug>` in a repo to scope sync to it.');
42
+ }
19
43
  let authHeaders;
20
44
  try {
21
45
  authHeaders = await getAuthHeaders(apiUrl);
@@ -24,60 +48,38 @@ export function syncCommand() {
24
48
  console.error(err instanceof Error ? err.message : String(err));
25
49
  process.exit(1);
26
50
  }
27
- // Discover sessions
28
51
  console.log('Discovering session logs...');
29
- const sessions = discoverAllSessions(providerFilter);
30
- if (sessions.length === 0) {
52
+ const discovered = discoverScopedSessions({
53
+ providerFilter,
54
+ scopeRootDir: scoped ? binding.rootDir : undefined,
55
+ });
56
+ if (discovered.found === 0) {
31
57
  console.log('No session logs found.');
32
58
  if (!providerFilter) {
33
- console.log('Looked in: ~/.claude/projects/ and ~/.codex/sessions/');
59
+ console.log('Looked in: ~/.claude/projects/, ~/.codex/sessions/, ~/.gemini/tmp/, the OpenCode store, and the Copilot CLI store');
34
60
  }
35
61
  return;
36
62
  }
37
- console.log(`Found ${sessions.length} session log(s)`);
38
- // Load sync state and filter out already-uploaded files
39
- const syncState = readSyncState();
40
- let uploaded = 0;
41
- let skipped = 0;
42
- let failed = 0;
43
- for (const session of sessions) {
44
- const content = readFileSync(session.filePath);
45
- const hash = hashFileContents(content);
46
- if (isUploaded(syncState, session.filePath, hash)) {
47
- skipped++;
48
- continue;
49
- }
50
- if (dryRun) {
51
- const sizeKb = (session.sizeBytes / 1024).toFixed(1);
52
- console.log(` [dry-run] Would upload: ${session.filePath} (${sizeKb} KB)`);
53
- uploaded++;
54
- continue;
55
- }
56
- try {
57
- const result = await uploadSession(session.filePath, session.provider, session.sessionId, authHeaders, apiUrl);
58
- markUploaded(syncState, session.filePath, {
59
- sessionId: result.sessionId,
60
- uploadedAt: new Date().toISOString(),
61
- size: session.sizeBytes,
62
- hash,
63
- });
64
- const sizeKb = (session.sizeBytes / 1024).toFixed(1);
65
- const status = result.status === 'duplicate' ? 'already exists' : 'uploaded';
66
- console.log(` ${status}: ${session.filePath} (${sizeKb} KB)`);
67
- uploaded++;
68
- }
69
- catch (err) {
70
- console.error(` failed: ${session.filePath} - ${err instanceof Error ? err.message : String(err)}`);
71
- failed++;
72
- }
63
+ console.log(scoped
64
+ ? `Found ${discovered.found} session log(s); ${discovered.sessions.length} match this repo`
65
+ : `Found ${discovered.found} session log(s)`);
66
+ if (discovered.unresolved > 0) {
67
+ console.log(`Skipped ${discovered.unresolved} session(s) whose repo could not be determined ` +
68
+ `(\`halyard sync --all\` includes everything)`);
73
69
  }
74
- // Save sync state
70
+ const syncState = readSyncState();
71
+ const totals = await uploadSessions(discovered.sessions, syncState, {
72
+ stateKey: target.stateKey,
73
+ authHeaders,
74
+ apiUrl,
75
+ dryRun,
76
+ log: console.log,
77
+ });
75
78
  if (!dryRun) {
76
79
  writeSyncState(syncState);
77
80
  }
78
- // Summary
79
81
  console.log('');
80
- console.log(`Sync complete: ${uploaded} uploaded, ${skipped} already synced, ${failed} failed`);
82
+ console.log(`Sync complete: ${totals.uploaded} uploaded, ${totals.skipped} already synced, ${totals.failed} failed`);
81
83
  });
82
84
  }
83
85
  //# sourceMappingURL=sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Command } from 'commander';
2
+ export interface UserUpdateOpts {
3
+ name?: string;
4
+ accessRole?: string;
5
+ roles?: string;
6
+ skills?: string;
7
+ availability?: string;
8
+ routable?: string;
9
+ }
10
+ /** Build the PATCH body from provided flags only (server treats undefined as no-change). */
11
+ export declare function buildUserUpdateBody(opts: UserUpdateOpts): Record<string, unknown>;
12
+ export declare function usersCommand(): Command;
13
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/commands/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmBnC,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAWD,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASjF;AAED,wBAAgB,YAAY,IAAI,OAAO,CAwMtC"}