@halyard/cli 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -1
- package/dist/cli.js +27 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/api-keys.d.ts +3 -0
- package/dist/commands/api-keys.d.ts.map +1 -0
- package/dist/commands/api-keys.js +90 -0
- package/dist/commands/api-keys.js.map +1 -0
- package/dist/commands/hook.d.ts +6 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +106 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/login.d.ts +17 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +111 -14
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/orgs.d.ts +3 -0
- package/dist/commands/orgs.d.ts.map +1 -0
- package/dist/commands/orgs.js +102 -0
- package/dist/commands/orgs.js.map +1 -0
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +29 -6
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/sessions.d.ts +3 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +139 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +28 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skills.d.ts +12 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +171 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +51 -49
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/users.d.ts +13 -0
- package/dist/commands/users.d.ts.map +1 -0
- package/dist/commands/users.js +205 -0
- package/dist/commands/users.js.map +1 -0
- package/dist/commands/whoami.d.ts +21 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +77 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/lib/api-client.d.ts +64 -2
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +32 -7
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/auth.d.ts +42 -6
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +101 -27
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/config-files.d.ts +6 -0
- package/dist/lib/config-files.d.ts.map +1 -0
- package/dist/lib/config-files.js +27 -0
- package/dist/lib/config-files.js.map +1 -0
- package/dist/lib/config.d.ts +13 -7
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +22 -8
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/copilot-export.d.ts +31 -0
- package/dist/lib/copilot-export.d.ts.map +1 -0
- package/dist/lib/copilot-export.js +129 -0
- package/dist/lib/copilot-export.js.map +1 -0
- package/dist/lib/discovery.d.ts +60 -2
- package/dist/lib/discovery.d.ts.map +1 -1
- package/dist/lib/discovery.js +187 -15
- package/dist/lib/discovery.js.map +1 -1
- package/dist/lib/hook-discovery.d.ts +43 -0
- package/dist/lib/hook-discovery.d.ts.map +1 -0
- package/dist/lib/hook-discovery.js +90 -0
- package/dist/lib/hook-discovery.js.map +1 -0
- package/dist/lib/hook-input.d.ts +36 -0
- package/dist/lib/hook-input.d.ts.map +1 -0
- package/dist/lib/hook-input.js +161 -0
- package/dist/lib/hook-input.js.map +1 -0
- package/dist/lib/hook-runner.d.ts +48 -0
- package/dist/lib/hook-runner.d.ts.map +1 -0
- package/dist/lib/hook-runner.js +306 -0
- package/dist/lib/hook-runner.js.map +1 -0
- package/dist/lib/http.d.ts +18 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +54 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/opencode-export.d.ts +22 -0
- package/dist/lib/opencode-export.d.ts.map +1 -0
- package/dist/lib/opencode-export.js +53 -0
- package/dist/lib/opencode-export.js.map +1 -0
- package/dist/lib/output.d.ts +27 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +74 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/preflight.d.ts +35 -0
- package/dist/lib/preflight.d.ts.map +1 -0
- package/dist/lib/preflight.js +54 -0
- package/dist/lib/preflight.js.map +1 -0
- package/dist/lib/repo-binding.d.ts +43 -0
- package/dist/lib/repo-binding.d.ts.map +1 -0
- package/dist/lib/repo-binding.js +158 -0
- package/dist/lib/repo-binding.js.map +1 -0
- package/dist/lib/repo-identity.d.ts +29 -0
- package/dist/lib/repo-identity.d.ts.map +1 -0
- package/dist/lib/repo-identity.js +113 -0
- package/dist/lib/repo-identity.js.map +1 -0
- package/dist/lib/setup-hooks.d.ts +41 -0
- package/dist/lib/setup-hooks.d.ts.map +1 -0
- package/dist/lib/setup-hooks.js +276 -0
- package/dist/lib/setup-hooks.js.map +1 -0
- package/dist/lib/setup.d.ts +4 -1
- package/dist/lib/setup.d.ts.map +1 -1
- package/dist/lib/setup.js +20 -31
- package/dist/lib/setup.js.map +1 -1
- package/dist/lib/skill-batches.d.ts +16 -0
- package/dist/lib/skill-batches.d.ts.map +1 -0
- package/dist/lib/skill-batches.js +35 -0
- package/dist/lib/skill-batches.js.map +1 -0
- package/dist/lib/skill-files.d.ts +4 -0
- package/dist/lib/skill-files.d.ts.map +1 -0
- package/dist/lib/skill-files.js +36 -0
- package/dist/lib/skill-files.js.map +1 -0
- package/dist/lib/skill-fingerprint.d.ts +55 -0
- package/dist/lib/skill-fingerprint.d.ts.map +1 -0
- package/dist/lib/skill-fingerprint.js +204 -0
- package/dist/lib/skill-fingerprint.js.map +1 -0
- package/dist/lib/skills-discovery.d.ts +57 -0
- package/dist/lib/skills-discovery.d.ts.map +1 -0
- package/dist/lib/skills-discovery.js +157 -0
- package/dist/lib/skills-discovery.js.map +1 -0
- package/dist/lib/skills-sync.d.ts +66 -0
- package/dist/lib/skills-sync.d.ts.map +1 -0
- package/dist/lib/skills-sync.js +251 -0
- package/dist/lib/skills-sync.js.map +1 -0
- package/dist/lib/sync-runner.d.ts +56 -0
- package/dist/lib/sync-runner.d.ts.map +1 -0
- package/dist/lib/sync-runner.js +106 -0
- package/dist/lib/sync-runner.js.map +1 -0
- package/dist/lib/sync-state.d.ts +36 -6
- package/dist/lib/sync-state.d.ts.map +1 -1
- package/dist/lib/sync-state.js +41 -11
- package/dist/lib/sync-state.js.map +1 -1
- package/package.json +10 -5
|
@@ -0,0 +1,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":"
|
|
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"}
|
package/dist/commands/sync.js
CHANGED
|
@@ -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 {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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>',
|
|
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
|
-
|
|
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
|
|
30
|
-
|
|
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
|
|
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(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,
|
|
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"}
|
|
@@ -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"}
|