@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,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":"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"}
@@ -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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAkB,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEpE,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,uBAAuB,EAAE,uBAAuB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACvF,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;SACpE,MAAM,CAAC,OAAO,EAAE,qEAAqE,CAAC;SACtF,MAAM,CAAC,KAAK;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAgB,CAAA;QAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,QAA8B,CAAA;QAC1D,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;QAEtB,MAAM,OAAO,GAAG,eAAe,EAAE,CAAA;QACjC,MAAM,MAAM,GAAG,OAAO,KAAK,IAAI,IAAI,CAAC,GAAG,CAAA;QAEvC,iEAAiE;QACjE,wEAAwE;QACxE,uEAAuE;QACvE,yCAAyC;QACzC,IAAI,MAAiB,CAAA;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,YAAY,CAAC;gBAC1B,MAAM;gBACN,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;gBAChC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc;aACtD,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CACT,+EAA+E;gBAC7E,iEAAiE,CACpE,CAAA;QACH,CAAC;QAED,IAAI,WAAmC,CAAA;QACvC,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;QAC1C,MAAM,UAAU,GAAG,sBAAsB,CAAC;YACxC,cAAc;YACd,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SACnD,CAAC,CAAA;QAEF,IAAI,UAAU,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;YACrC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CACT,mHAAmH,CACpH,CAAA;YACH,CAAC;YACD,OAAM;QACR,CAAC;QAED,OAAO,CAAC,GAAG,CACT,MAAM;YACJ,CAAC,CAAC,SAAS,UAAU,CAAC,KAAK,oBAAoB,UAAU,CAAC,QAAQ,CAAC,MAAM,kBAAkB;YAC3F,CAAC,CAAC,SAAS,UAAU,CAAC,KAAK,iBAAiB,CAC/C,CAAA;QACD,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CACT,WAAW,UAAU,CAAC,UAAU,iDAAiD;gBAC/E,8CAA8C,CACjD,CAAA;QACH,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,EAAE,CAAA;QACjC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE;YAClE,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,WAAW;YACX,MAAM;YACN,MAAM;YACN,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,cAAc,CAAC,SAAS,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CACT,kBAAkB,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,OAAO,oBAAoB,MAAM,CAAC,MAAM,SAAS,CACxG,CAAA;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -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"}
@@ -0,0 +1,205 @@
1
+ import { Command } from 'commander';
2
+ import { apiFetch, ApiError } from '../lib/http.js';
3
+ import { printTable, printJson, formatDate, confirm, fail } from '../lib/output.js';
4
+ const ACCESS_ROLES = ['ADMIN', 'MEMBER'];
5
+ const AVAILABILITIES = ['ONLINE', 'AWAY', 'DND'];
6
+ /** Split a comma-separated flag value; empty string clears the list. */
7
+ function splitList(value) {
8
+ if (value.trim() === '')
9
+ return [];
10
+ return value
11
+ .split(',')
12
+ .map((item) => item.trim())
13
+ .filter((item) => item.length > 0);
14
+ }
15
+ /** Build the PATCH body from provided flags only (server treats undefined as no-change). */
16
+ export function buildUserUpdateBody(opts) {
17
+ const body = {};
18
+ if (opts.name !== undefined)
19
+ body['name'] = opts.name;
20
+ if (opts.accessRole !== undefined)
21
+ body['accessRole'] = opts.accessRole;
22
+ if (opts.roles !== undefined)
23
+ body['roles'] = splitList(opts.roles);
24
+ if (opts.skills !== undefined)
25
+ body['skills'] = splitList(opts.skills);
26
+ if (opts.availability !== undefined)
27
+ body['availability'] = opts.availability;
28
+ if (opts.routable !== undefined)
29
+ body['routable'] = opts.routable === 'true';
30
+ return body;
31
+ }
32
+ export function usersCommand() {
33
+ const users = new Command('users').description('Manage users in the current organization');
34
+ users
35
+ .command('list')
36
+ .description('List users in the organization')
37
+ .action(async function () {
38
+ const globalOpts = this.optsWithGlobals();
39
+ const apiUrl = globalOpts.apiUrl;
40
+ let response;
41
+ try {
42
+ response = await apiFetch(apiUrl, '/api/v1/users');
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
+ printTable(response.users, [
52
+ { key: 'id', header: 'ID' },
53
+ { key: 'name', header: 'NAME' },
54
+ { key: 'email', header: 'EMAIL' },
55
+ { key: 'accessRole', header: 'ACCESS' },
56
+ {
57
+ key: 'roles',
58
+ header: 'ROLES',
59
+ format: (v) => {
60
+ const joined = Array.isArray(v) ? v.join(',') : '';
61
+ if (joined === '')
62
+ return '-';
63
+ return joined.length > 30 ? `${joined.slice(0, 27)}...` : joined;
64
+ },
65
+ },
66
+ { key: 'availability', header: 'AVAILABILITY' },
67
+ { key: 'lastLoginAt', header: 'LAST LOGIN', format: formatDate },
68
+ ]);
69
+ });
70
+ users
71
+ .command('describe')
72
+ .description('Show details for a user')
73
+ .argument('<id>', 'User ID (from `halyard users list`)')
74
+ .action(async function (id) {
75
+ const globalOpts = this.optsWithGlobals();
76
+ const apiUrl = globalOpts.apiUrl;
77
+ let response;
78
+ try {
79
+ response = await apiFetch(apiUrl, `/api/v1/users/${id}`);
80
+ }
81
+ catch (err) {
82
+ fail(err instanceof Error ? err.message : String(err));
83
+ }
84
+ if (globalOpts.json) {
85
+ printJson(response);
86
+ return;
87
+ }
88
+ const user = response.user;
89
+ const counts = user['_count'];
90
+ const row = (label, value) => {
91
+ const rendered = value === null || value === undefined || value === ''
92
+ ? '-'
93
+ : Array.isArray(value)
94
+ ? value.length > 0
95
+ ? value.join(', ')
96
+ : '-'
97
+ : String(value);
98
+ console.log(`${label.padEnd(14)}${rendered}`);
99
+ };
100
+ row('ID:', user['id']);
101
+ row('Name:', user['name']);
102
+ row('Email:', user['email']);
103
+ row('Access role:', user['accessRole']);
104
+ row('Roles:', user['roles']);
105
+ row('Skills:', user['skills']);
106
+ row('Availability:', user['availability']);
107
+ row('Last login:', formatDate(user['lastLoginAt']));
108
+ row('Created:', formatDate(user['createdAt']));
109
+ if (counts) {
110
+ row('Sessions:', counts.sessions ?? 0);
111
+ row('Messages:', counts.messages ?? 0);
112
+ }
113
+ });
114
+ users
115
+ .command('update')
116
+ .description('Update a user (self, or others as admin)')
117
+ .argument('<id>', 'User ID')
118
+ .option('--name <name>', 'Display name')
119
+ .option('--access-role <role>', `Org access role (${ACCESS_ROLES.join('|')})`)
120
+ .option('--roles <roles>', 'Comma-separated role list; "" clears')
121
+ .option('--skills <skills>', 'Comma-separated skill list; "" clears')
122
+ .option('--availability <availability>', `Availability (${AVAILABILITIES.join('|')})`)
123
+ .option('--routable <true|false>', 'Whether teammate questions are routed to this user')
124
+ .action(async function (id) {
125
+ const globalOpts = this.optsWithGlobals();
126
+ const apiUrl = globalOpts.apiUrl;
127
+ const opts = this.opts();
128
+ const body = buildUserUpdateBody(opts);
129
+ if (Object.keys(body).length === 0) {
130
+ fail('Nothing to update; pass at least one of --name/--access-role/--roles/--skills/--availability/--routable');
131
+ }
132
+ if (opts.accessRole !== undefined &&
133
+ !ACCESS_ROLES.includes(opts.accessRole)) {
134
+ fail(`--access-role must be one of: ${ACCESS_ROLES.join(', ')}`);
135
+ }
136
+ if (opts.availability !== undefined &&
137
+ !AVAILABILITIES.includes(opts.availability)) {
138
+ fail(`--availability must be one of: ${AVAILABILITIES.join(', ')}`);
139
+ }
140
+ if (opts.routable !== undefined && !['true', 'false'].includes(opts.routable)) {
141
+ fail('--routable must be true or false');
142
+ }
143
+ let response;
144
+ try {
145
+ response = await apiFetch(apiUrl, `/api/v1/users/${id}`, {
146
+ method: 'PATCH',
147
+ body,
148
+ });
149
+ }
150
+ catch (err) {
151
+ fail(err instanceof Error ? err.message : String(err));
152
+ }
153
+ if (globalOpts.json) {
154
+ printJson(response);
155
+ return;
156
+ }
157
+ console.log(`Updated user ${response.user.name ?? response.user.id}.`);
158
+ });
159
+ users
160
+ .command('invite')
161
+ .description('Invite a person by email. Invites are email-only and not tracked - there is no list or cancel.')
162
+ .argument('<email>', 'Email address to invite')
163
+ .action(async function (email) {
164
+ const globalOpts = this.optsWithGlobals();
165
+ const apiUrl = globalOpts.apiUrl;
166
+ try {
167
+ await apiFetch(apiUrl, '/api/v1/users/invite', { method: 'POST', body: { email } });
168
+ }
169
+ catch (err) {
170
+ fail(err instanceof Error ? err.message : String(err));
171
+ }
172
+ if (globalOpts.json) {
173
+ printJson({ success: true, email });
174
+ return;
175
+ }
176
+ console.log(`Invite sent to ${email}.`);
177
+ console.log('Note: pending invites cannot be listed or canceled.');
178
+ });
179
+ users
180
+ .command('remove')
181
+ .description('Remove a user from the organization (admin only)')
182
+ .argument('<id>', 'User ID')
183
+ .option('-f, --force', 'Skip the confirmation prompt')
184
+ .action(async function (id) {
185
+ const globalOpts = this.optsWithGlobals();
186
+ const apiUrl = globalOpts.apiUrl;
187
+ const force = !!this.opts().force;
188
+ const confirmed = await confirm(`Remove user ${id}? This permanently deletes the user and their knowledge grants.`, { force });
189
+ if (!confirmed) {
190
+ fail('Aborted.');
191
+ }
192
+ try {
193
+ await apiFetch(apiUrl, `/api/v1/users/${id}`, { method: 'DELETE' });
194
+ }
195
+ catch (err) {
196
+ if (err instanceof ApiError && err.status === 404) {
197
+ fail('User not found in this organization.');
198
+ }
199
+ fail(err instanceof Error ? err.message : String(err));
200
+ }
201
+ console.log('User removed.');
202
+ });
203
+ return users;
204
+ }
205
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/commands/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Command } from 'commander';
2
+ export interface MeResponse {
3
+ user: {
4
+ id: string;
5
+ email: string | null;
6
+ name: string | null;
7
+ accessRole: string;
8
+ isAdmin: boolean;
9
+ };
10
+ organization: {
11
+ id: string;
12
+ name: string;
13
+ slug: string;
14
+ } | null;
15
+ authenticatedVia?: {
16
+ type: string;
17
+ clientName: string | null;
18
+ };
19
+ }
20
+ export declare function whoamiCommand(): Command;
21
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACnB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,OAAO,CAAA;KACjB,CAAA;IACD,YAAY,EAAE;QACZ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,GAAG,IAAI,CAAA;IACR,gBAAgB,CAAC,EAAE;QACjB,IAAI,EAAE,MAAM,CAAA;QACZ,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAC1B,CAAA;CACF;AA4BD,wBAAgB,aAAa,IAAI,OAAO,CAuDvC"}