@iamcoder18/huly-cli 0.1.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 +2576 -0
- package/bin/huly +9 -0
- package/dist/auth/cache.js +129 -0
- package/dist/auth/cache.js.map +1 -0
- package/dist/auth/client.js +192 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/env.js +101 -0
- package/dist/auth/env.js.map +1 -0
- package/dist/auth/prompts.js +68 -0
- package/dist/auth/prompts.js.map +1 -0
- package/dist/cli.js +1959 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/dry-run.js +39 -0
- package/dist/commands/dry-run.js.map +1 -0
- package/dist/commands/login.js +92 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/whoami.js +64 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/output/errors.js +99 -0
- package/dist/output/errors.js.map +1 -0
- package/dist/output/format.js +607 -0
- package/dist/output/format.js.map +1 -0
- package/dist/output/progress.js +30 -0
- package/dist/output/progress.js.map +1 -0
- package/dist/raw/api.js +67 -0
- package/dist/raw/api.js.map +1 -0
- package/dist/raw/ws.js +157 -0
- package/dist/raw/ws.js.map +1 -0
- package/dist/resources/_helpers.js +258 -0
- package/dist/resources/_helpers.js.map +1 -0
- package/dist/resources/_project-resolve.js +24 -0
- package/dist/resources/_project-resolve.js.map +1 -0
- package/dist/resources/calendar.js +659 -0
- package/dist/resources/calendar.js.map +1 -0
- package/dist/resources/card.js +358 -0
- package/dist/resources/card.js.map +1 -0
- package/dist/resources/channel.js +709 -0
- package/dist/resources/channel.js.map +1 -0
- package/dist/resources/comment.js +142 -0
- package/dist/resources/comment.js.map +1 -0
- package/dist/resources/component.js +154 -0
- package/dist/resources/component.js.map +1 -0
- package/dist/resources/document.js +584 -0
- package/dist/resources/document.js.map +1 -0
- package/dist/resources/issue-template.js +228 -0
- package/dist/resources/issue-template.js.map +1 -0
- package/dist/resources/issue.js +909 -0
- package/dist/resources/issue.js.map +1 -0
- package/dist/resources/milestone.js +177 -0
- package/dist/resources/milestone.js.map +1 -0
- package/dist/resources/misc.js +2 -0
- package/dist/resources/misc.js.map +1 -0
- package/dist/resources/project.js +341 -0
- package/dist/resources/project.js.map +1 -0
- package/dist/resources/project.parse.js +25 -0
- package/dist/resources/project.parse.js.map +1 -0
- package/dist/resources/time.js +148 -0
- package/dist/resources/time.js.map +1 -0
- package/dist/resources/todo.js +463 -0
- package/dist/resources/todo.js.map +1 -0
- package/dist/resources/user.js +131 -0
- package/dist/resources/user.js.map +1 -0
- package/dist/resources/workspace.js +252 -0
- package/dist/resources/workspace.js.map +1 -0
- package/dist/transport/identifiers.js +67 -0
- package/dist/transport/identifiers.js.map +1 -0
- package/dist/transport/ref-resolver.js +108 -0
- package/dist/transport/ref-resolver.js.map +1 -0
- package/dist/transport/sdk.js +69 -0
- package/dist/transport/sdk.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { connectAccountCli } from '../transport/sdk.js';
|
|
2
|
+
import { readActiveWorkspace, writeActiveWorkspace, findAnyCachedCreds } from '../auth/cache.js';
|
|
3
|
+
import { readEnv } from '../auth/env.js';
|
|
4
|
+
import { shouldJson, json, table, kv, COLUMNS, C } from '../output/format.js';
|
|
5
|
+
import { withSpinner } from '../output/progress.js';
|
|
6
|
+
import { CliError, ExitCode } from '../output/errors.js';
|
|
7
|
+
export async function listWorkspaces(g = {}) {
|
|
8
|
+
const ac = await connectAccountCli({ url: g.url, workspace: g.workspace });
|
|
9
|
+
const workspaces = await withSpinner('Fetching workspaces…', () => ac.getUserWorkspaces(), g);
|
|
10
|
+
if (shouldJson({ json: g.json, ci: g.ci })) {
|
|
11
|
+
json(workspaces);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
table(workspaces, COLUMNS.workspace(), { count: true, title: 'workspaces' });
|
|
15
|
+
}
|
|
16
|
+
export async function currentWorkspace(g = {}) {
|
|
17
|
+
const env = readEnv();
|
|
18
|
+
const flagWs = g.workspace ?? env.workspace;
|
|
19
|
+
const active = await readActiveWorkspace();
|
|
20
|
+
const ws = flagWs ?? active ?? null;
|
|
21
|
+
if (shouldJson({ json: g.json, ci: g.ci })) {
|
|
22
|
+
json({ workspace: ws, source: flagWs ? 'env' : active ? 'active-workspace' : null });
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!ws) {
|
|
26
|
+
console.log('(no workspace set)');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
console.log(ws);
|
|
30
|
+
}
|
|
31
|
+
export async function useWorkspace(name, g = {}) {
|
|
32
|
+
const env = readEnv();
|
|
33
|
+
if (env.workspace || g.workspace) {
|
|
34
|
+
throw new CliError(ExitCode.Validation, 'cannot `workspace use` while --workspace/HULY_WORKSPACE is set', 'unset HULY_WORKSPACE or pass --workspace explicitly per command');
|
|
35
|
+
}
|
|
36
|
+
await writeActiveWorkspace(name);
|
|
37
|
+
console.log(`active workspace: ${name}`);
|
|
38
|
+
}
|
|
39
|
+
export async function createWorkspace(opts) {
|
|
40
|
+
if (!opts.name)
|
|
41
|
+
throw new CliError(ExitCode.Validation, 'missing --name');
|
|
42
|
+
if (!opts.yes) {
|
|
43
|
+
throw new CliError(ExitCode.Validation, 'creating a workspace is destructive', 'pass --yes to confirm; or use `huly workspace create --name <n> --region <r> --yes`');
|
|
44
|
+
}
|
|
45
|
+
if (opts.dryRun) {
|
|
46
|
+
console.log(`would create workspace "${opts.name}" (region=${opts.region ?? 'default'})`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const ac = await connectAccountCli({ url: opts.url, workspace: opts.workspace });
|
|
50
|
+
const result = await withSpinner(`Creating workspace "${opts.name}"…`, () => ac.createWorkspace(opts.name, opts.region), opts);
|
|
51
|
+
if (shouldJson({ json: opts.json, ci: opts.ci })) {
|
|
52
|
+
json(result);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log(`created workspace: ${opts.name}`);
|
|
56
|
+
if (result && typeof result === 'object') {
|
|
57
|
+
console.log(JSON.stringify(result, null, 2));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export async function deleteWorkspace(opts) {
|
|
62
|
+
const env = readEnv();
|
|
63
|
+
const active = await readActiveWorkspace();
|
|
64
|
+
const target = opts.name ?? opts.workspace ?? env.workspace ?? active;
|
|
65
|
+
if (!target) {
|
|
66
|
+
throw new CliError(ExitCode.Validation, 'no workspace resolved', 'pass --workspace, a positional name, or run `huly workspace use <n>` first');
|
|
67
|
+
}
|
|
68
|
+
if (!opts.force && (env.workspace || target === (env.workspace ?? active))) {
|
|
69
|
+
throw new CliError(ExitCode.Validation, `cannot delete workspace ${target} while it is the active --workspace/HULY_WORKSPACE`, 'unset HULY_WORKSPACE and run `huly workspace use <other>` first, or pass --force');
|
|
70
|
+
}
|
|
71
|
+
if (!opts.yes) {
|
|
72
|
+
throw new CliError(ExitCode.Validation, 'destructive: pass --yes to confirm workspace deletion');
|
|
73
|
+
}
|
|
74
|
+
if (opts.dryRun) {
|
|
75
|
+
console.log(`would delete workspace ${target}`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const ac = await connectAccountCli({ url: opts.url, workspace: target });
|
|
79
|
+
await withSpinner(`Deleting workspace ${target}…`, () => ac.deleteWorkspace(), opts);
|
|
80
|
+
console.log(`deleted workspace: ${target}`);
|
|
81
|
+
}
|
|
82
|
+
export async function listMembers(g = {}) {
|
|
83
|
+
const ac = await connectAccountCli({ url: g.url, workspace: g.workspace });
|
|
84
|
+
const members = (await withSpinner('Fetching members…', () => ac.getWorkspaceMembers(), g));
|
|
85
|
+
let filtered = members;
|
|
86
|
+
if (g.role) {
|
|
87
|
+
const want = g.role.toLowerCase();
|
|
88
|
+
filtered = members.filter((m) => {
|
|
89
|
+
const role = String(m.account?.role ?? m.role ?? '').toLowerCase();
|
|
90
|
+
return role === want;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const cached = await findAnyCachedCreds(g.url ?? readEnv().url);
|
|
94
|
+
const myEmail = cached?.email ?? null;
|
|
95
|
+
const rows = filtered.map((m) => {
|
|
96
|
+
const mAny = m;
|
|
97
|
+
const acc = mAny.account;
|
|
98
|
+
const fullAcc = acc?.fullAccount;
|
|
99
|
+
const email = fullAcc?.email ?? mAny.email ?? null;
|
|
100
|
+
const fullName = fullAcc?.name ?? mAny.name ?? email;
|
|
101
|
+
// On selfhost with a single account, the account-client may not return
|
|
102
|
+
// email/name. Fall back to the cached login email if the uuid matches.
|
|
103
|
+
const uuid = acc?.uuid ?? mAny.person ?? mAny._id ?? null;
|
|
104
|
+
const finalEmail = email ?? (uuid != null && myEmail != null ? myEmail : null);
|
|
105
|
+
return {
|
|
106
|
+
name: fullName ?? finalEmail,
|
|
107
|
+
role: acc?.role ?? mAny.role ?? null,
|
|
108
|
+
email: finalEmail,
|
|
109
|
+
uuid
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
if (shouldJson({ json: g.json, ci: g.ci })) {
|
|
113
|
+
json(rows);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
table(rows, [
|
|
117
|
+
{ key: 'name', header: 'NAME', format: (r) => {
|
|
118
|
+
const n = r.name;
|
|
119
|
+
return n !== null ? C.emphasis(n) : C.muted('—');
|
|
120
|
+
} },
|
|
121
|
+
{ key: 'email', header: 'EMAIL', format: (r) => {
|
|
122
|
+
const e = r.email;
|
|
123
|
+
return e !== null ? e : C.muted('—');
|
|
124
|
+
} },
|
|
125
|
+
{ key: 'role', header: 'ROLE', format: (r) => {
|
|
126
|
+
const role = r.role;
|
|
127
|
+
if (role == null)
|
|
128
|
+
return C.muted('—');
|
|
129
|
+
return role.toLowerCase() === 'owner' ? C.yellow(role) : C.muted(role);
|
|
130
|
+
} },
|
|
131
|
+
{ key: 'uuid', header: 'UUID', format: (r) => {
|
|
132
|
+
const u = r.uuid;
|
|
133
|
+
return u !== null ? C.id(u.slice(0, 12) + '…') : C.muted('—');
|
|
134
|
+
} }
|
|
135
|
+
], { count: true, title: 'members' });
|
|
136
|
+
}
|
|
137
|
+
export async function updateMemberRole(opts) {
|
|
138
|
+
if (!opts.target)
|
|
139
|
+
throw new CliError(ExitCode.Validation, 'missing <account>');
|
|
140
|
+
if (!opts.role)
|
|
141
|
+
throw new CliError(ExitCode.Validation, 'missing --role (Owner|Admin|Guest|DocGuest|ReadOnlyGuest)');
|
|
142
|
+
const ROLE_MAP = {
|
|
143
|
+
owner: 'Owner', admin: 'Admin', guest: 'Guest', docguest: 'DocGuest',
|
|
144
|
+
readonlyguest: 'ReadOnlyGuest', read_only_guest: 'ReadOnlyGuest',
|
|
145
|
+
maintainer: 'Admin'
|
|
146
|
+
};
|
|
147
|
+
const normalized = ROLE_MAP[opts.role.toLowerCase()] ?? opts.role;
|
|
148
|
+
const VALID = new Set(['Owner', 'Admin', 'Guest', 'ReadOnlyGuest', 'DocGuest']);
|
|
149
|
+
if (!VALID.has(normalized)) {
|
|
150
|
+
throw new CliError(ExitCode.Validation, `invalid --role: ${opts.role}`, `expected one of ${[...VALID].join(' | ')}`);
|
|
151
|
+
}
|
|
152
|
+
if (opts.dryRun) {
|
|
153
|
+
console.log(`would set role=${normalized} for ${opts.target}`);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const ac = await connectAccountCli({ url: opts.url, workspace: opts.workspace });
|
|
157
|
+
await withSpinner(`Setting role=${normalized} for ${opts.target}…`, () => ac.updateWorkspaceRole(opts.target, normalized), opts);
|
|
158
|
+
console.log(`updated member role: ${opts.target} → ${normalized}`);
|
|
159
|
+
}
|
|
160
|
+
export async function workspaceInfo(g = {}) {
|
|
161
|
+
const ac = await connectAccountCli({ url: g.url, workspace: g.workspace });
|
|
162
|
+
const info = (await withSpinner('Fetching workspace info…', () => ac.getWorkspaceInfo(false), g));
|
|
163
|
+
if (shouldJson({ json: g.json, ci: g.ci })) {
|
|
164
|
+
json(info);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
kv([
|
|
168
|
+
['Name', info.name],
|
|
169
|
+
['URL', info.url],
|
|
170
|
+
['UUID', info.uuid],
|
|
171
|
+
['Mode', info.mode ?? '—'],
|
|
172
|
+
['Region', info.region ?? '—']
|
|
173
|
+
]);
|
|
174
|
+
}
|
|
175
|
+
export async function updateWorkspaceName(opts) {
|
|
176
|
+
if (!opts.name)
|
|
177
|
+
throw new CliError(ExitCode.Validation, 'missing --name');
|
|
178
|
+
if (opts.dryRun) {
|
|
179
|
+
console.log(`would rename workspace to "${opts.name}"`);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const ac = await connectAccountCli({ url: opts.url, workspace: opts.workspace });
|
|
183
|
+
await withSpinner(`Renaming workspace to "${opts.name}"…`, () => ac.updateWorkspaceName(opts.name), opts);
|
|
184
|
+
console.log(`renamed workspace: ${opts.name}`);
|
|
185
|
+
}
|
|
186
|
+
export async function workspaceGuests(opts) {
|
|
187
|
+
if (opts.readOnly === undefined && opts.signUp === undefined) {
|
|
188
|
+
throw new CliError(ExitCode.Validation, 'no flags given', 'pass --read-only true|false or --sign-up true|false to update guest settings');
|
|
189
|
+
}
|
|
190
|
+
if (opts.dryRun) {
|
|
191
|
+
if (opts.readOnly !== undefined)
|
|
192
|
+
console.log(`would set allowReadOnlyGuests=${opts.readOnly}`);
|
|
193
|
+
if (opts.signUp !== undefined)
|
|
194
|
+
console.log(`would set allowGuestSignUp=${opts.signUp}`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const ac = await connectAccountCli({ url: opts.url, workspace: opts.workspace });
|
|
198
|
+
if (opts.readOnly !== undefined) {
|
|
199
|
+
await withSpinner(`Setting allowReadOnlyGuests=${opts.readOnly}…`, () => ac.updateAllowReadOnlyGuests(Boolean(opts.readOnly)), opts);
|
|
200
|
+
console.log(`allowReadOnlyGuests=${opts.readOnly}`);
|
|
201
|
+
}
|
|
202
|
+
if (opts.signUp !== undefined) {
|
|
203
|
+
await withSpinner(`Setting allowGuestSignUp=${opts.signUp}…`, () => ac.updateAllowGuestSignUp(Boolean(opts.signUp)), opts);
|
|
204
|
+
console.log(`allowGuestSignUp=${opts.signUp}`);
|
|
205
|
+
}
|
|
206
|
+
if (opts.readOnly === undefined && opts.signUp === undefined) {
|
|
207
|
+
throw new CliError(ExitCode.Validation, 'no flags given', 'pass --read-only true|false or --sign-up true|false to update guest settings');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
export async function createAccessLink(opts) {
|
|
211
|
+
if (!opts.role)
|
|
212
|
+
throw new CliError(ExitCode.Validation, 'missing --role (Guest|ReadOnlyGuest|DocGuest|Admin|Owner)');
|
|
213
|
+
const options = {};
|
|
214
|
+
if (opts.expHours !== undefined)
|
|
215
|
+
options.expHours = opts.expHours;
|
|
216
|
+
if (opts.autoJoin !== undefined)
|
|
217
|
+
options.autoJoin = opts.autoJoin;
|
|
218
|
+
if (opts.email !== undefined)
|
|
219
|
+
options.email = opts.email;
|
|
220
|
+
if (opts.dryRun) {
|
|
221
|
+
console.log(`would create access link (role=${opts.role})`);
|
|
222
|
+
console.log(JSON.stringify({ options }, null, 2));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const ac = await connectAccountCli({ url: opts.url, workspace: opts.workspace });
|
|
226
|
+
const result = await withSpinner(`Creating access link (role=${opts.role})…`, () => ac.createAccessLink(opts.role, options), opts);
|
|
227
|
+
if (shouldJson({ json: opts.json, ci: opts.ci })) {
|
|
228
|
+
json(result);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
console.log(typeof result === 'string' ? result : JSON.stringify(result, null, 2));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
export async function listRegions(g = {}) {
|
|
235
|
+
const ac = await connectAccountCli({ url: g.url, workspace: g.workspace });
|
|
236
|
+
const regions = await withSpinner('Fetching regions…', () => ac.getRegionInfo(), g);
|
|
237
|
+
if (shouldJson({ json: g.json, ci: g.ci })) {
|
|
238
|
+
json(regions);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (Array.isArray(regions)) {
|
|
242
|
+
table(regions, [
|
|
243
|
+
{ key: 'name', header: 'NAME', format: (r) => C.emphasis(String(r.name ?? '')) },
|
|
244
|
+
{ key: 'region', header: 'REGION', format: (r) => C.muted(String(r.region ?? '')) },
|
|
245
|
+
{ key: 'url', header: 'URL', format: (r) => C.id(String(r.url ?? '')) }
|
|
246
|
+
], { count: true, title: 'regions' });
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
console.log(JSON.stringify(regions, null, 2));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/resources/workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Class ID registry for every surface in scope.
|
|
2
|
+
// Reference: ~/platform/models/<m>/src/index.ts `@Model(...)` declarations.
|
|
3
|
+
export const CLASS = {
|
|
4
|
+
// core
|
|
5
|
+
Account: 'core:class:Account',
|
|
6
|
+
Region: 'core:class:Region',
|
|
7
|
+
Space: 'core:class:Space',
|
|
8
|
+
SpaceType: 'core:class:SpaceType',
|
|
9
|
+
Permission: 'core:class:Permission',
|
|
10
|
+
Association: 'core:class:Association',
|
|
11
|
+
Relation: 'core:class:Relation',
|
|
12
|
+
Person: 'contact:class:Person',
|
|
13
|
+
// tracker
|
|
14
|
+
Project: 'tracker:class:Project',
|
|
15
|
+
ProjectType: 'tracker:class:ProjectType',
|
|
16
|
+
TaskType: 'tracker:class:TaskType',
|
|
17
|
+
ProjectTargetPreference: 'tracker:class:ProjectTargetPreference',
|
|
18
|
+
Issue: 'tracker:class:Issue',
|
|
19
|
+
IssueStatus: 'tracker:class:IssueStatus',
|
|
20
|
+
IssueTemplate: 'tracker:class:IssueTemplate',
|
|
21
|
+
Component: 'tracker:class:Component',
|
|
22
|
+
Milestone: 'tracker:class:Milestone',
|
|
23
|
+
TypeIssuePriority: 'tracker:class:TypeIssuePriority',
|
|
24
|
+
RelatedIssueTarget: 'tracker:class:RelatedIssueTarget',
|
|
25
|
+
// task
|
|
26
|
+
Task: 'task:class:Task',
|
|
27
|
+
// card module (kanban cards live under `card:`, not `board:`)
|
|
28
|
+
Card: 'card:class:Card',
|
|
29
|
+
CardSpace: 'card:class:CardSpace',
|
|
30
|
+
MasterTag: 'card:class:MasterTag',
|
|
31
|
+
// calendar
|
|
32
|
+
Calendar: 'calendar:class:Calendar',
|
|
33
|
+
Event: 'calendar:class:Event',
|
|
34
|
+
ReccuringEvent: 'calendar:class:ReccuringEvent',
|
|
35
|
+
ReccuringInstance: 'calendar:class:ReccuringInstance',
|
|
36
|
+
Schedule: 'calendar:class:Schedule',
|
|
37
|
+
// document
|
|
38
|
+
Document: 'document:class:Document',
|
|
39
|
+
DocumentSnapshot: 'document:class:DocumentSnapshot',
|
|
40
|
+
DocumentEmbedding: 'document:class:DocumentEmbedding',
|
|
41
|
+
Teamspace: 'document:class:Teamspace',
|
|
42
|
+
// chunter (chat)
|
|
43
|
+
Channel: 'chunter:class:Channel',
|
|
44
|
+
ChatMessage: 'chunter:class:ChatMessage',
|
|
45
|
+
DirectMessage: 'chunter:class:DirectMessage',
|
|
46
|
+
Message: 'chunter:class:Message',
|
|
47
|
+
ThreadMessage: 'chunter:class:ThreadMessage',
|
|
48
|
+
// time
|
|
49
|
+
TimeSpendReport: 'tracker:class:TimeSpendReport',
|
|
50
|
+
WorkSlot: 'time:class:WorkSlot',
|
|
51
|
+
// activity
|
|
52
|
+
ActivityMessage: 'activity:class:ActivityMessage',
|
|
53
|
+
// notification
|
|
54
|
+
Notification: 'notification:class:Notification',
|
|
55
|
+
// request (approvals)
|
|
56
|
+
Request: 'request:class:Request'
|
|
57
|
+
};
|
|
58
|
+
export const SPACE = {
|
|
59
|
+
Tx: 'core:space:Tx',
|
|
60
|
+
PersonalTaskList: 'task:space:MyTasks',
|
|
61
|
+
DocumentRoot: 'document:space:Document',
|
|
62
|
+
CalendarPersonal: 'calendar:space:Personal'
|
|
63
|
+
};
|
|
64
|
+
// Status categories from `tracker:class:IssueStatus`. Match MCP / huly-mcp
|
|
65
|
+
// server behaviour so `--status-category` filtering stays in sync.
|
|
66
|
+
export const STATUS_CATEGORIES = ['UnStarted', 'ToDo', 'Active', 'Won', 'Lost'];
|
|
67
|
+
//# sourceMappingURL=identifiers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/transport/identifiers.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,4EAA4E;AAE5E,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,OAAO;IACP,OAAO,EAAE,oBAA6B;IACtC,MAAM,EAAE,mBAA4B;IACpC,KAAK,EAAE,kBAA2B;IAClC,SAAS,EAAE,sBAA+B;IAC1C,UAAU,EAAE,uBAAgC;IAC5C,WAAW,EAAE,wBAAiC;IAC9C,QAAQ,EAAE,qBAA8B;IACxC,MAAM,EAAE,sBAA+B;IAEvC,UAAU;IACV,OAAO,EAAE,uBAAgC;IACzC,WAAW,EAAE,2BAAoC;IACjD,QAAQ,EAAE,wBAAiC;IAC3C,uBAAuB,EAAE,uCAAgD;IACzE,KAAK,EAAE,qBAA8B;IACrC,WAAW,EAAE,2BAAoC;IACjD,aAAa,EAAE,6BAAsC;IACrD,SAAS,EAAE,yBAAkC;IAC7C,SAAS,EAAE,yBAAkC;IAC7C,iBAAiB,EAAE,iCAA0C;IAC7D,kBAAkB,EAAE,kCAA2C;IAE/D,OAAO;IACP,IAAI,EAAE,iBAA0B;IAEhC,8DAA8D;IAC9D,IAAI,EAAE,iBAA0B;IAChC,SAAS,EAAE,sBAA+B;IAC1C,SAAS,EAAE,sBAA+B;IAE1C,WAAW;IACX,QAAQ,EAAE,yBAAkC;IAC5C,KAAK,EAAE,sBAA+B;IACtC,cAAc,EAAE,+BAAwC;IACxD,iBAAiB,EAAE,kCAA2C;IAC9D,QAAQ,EAAE,yBAAkC;IAE5C,WAAW;IACX,QAAQ,EAAE,yBAAkC;IAC5C,gBAAgB,EAAE,iCAA0C;IAC5D,iBAAiB,EAAE,kCAA2C;IAC9D,SAAS,EAAE,0BAAmC;IAE9C,iBAAiB;IACjB,OAAO,EAAE,uBAAgC;IACzC,WAAW,EAAE,2BAAoC;IACjD,aAAa,EAAE,6BAAsC;IACrD,OAAO,EAAE,uBAAgC;IACzC,aAAa,EAAE,6BAAsC;IAErD,OAAO;IACP,eAAe,EAAE,+BAAwC;IACzD,QAAQ,EAAE,qBAA8B;IAExC,WAAW;IACX,eAAe,EAAE,gCAAyC;IAE1D,eAAe;IACf,YAAY,EAAE,iCAA0C;IAExD,sBAAsB;IACtB,OAAO,EAAE,uBAAgC;CACjC,CAAA;AAEV,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,EAAE,EAAE,eAAwB;IAC5B,gBAAgB,EAAE,oBAA6B;IAC/C,YAAY,EAAE,yBAAkC;IAChD,gBAAgB,EAAE,yBAAkC;CAC5C,CAAA;AAIV,2EAA2E;AAC3E,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAU,CAAA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { CliError, ExitCode } from '../output/errors.js';
|
|
2
|
+
const REFS = new Map();
|
|
3
|
+
function cacheKey(workspaceId, classId) {
|
|
4
|
+
return `${workspaceId}|${classId}`;
|
|
5
|
+
}
|
|
6
|
+
function looksLikeId(s) {
|
|
7
|
+
return /^[a-z0-9]+:[a-z0-9]+:[A-Za-z0-9_-]+$/.test(s) || /^[A-Za-z0-9_-]{16,}$/.test(s);
|
|
8
|
+
}
|
|
9
|
+
function looksLikePrefixed(s) {
|
|
10
|
+
return /^[A-Z][A-Z0-9]+-\d+$/.test(s);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Identity-bearing field names that CLI commands advertise as accepting
|
|
14
|
+
* refs (e.g. "name", "label", "title"). Index them alongside the configured
|
|
15
|
+
* `identifierField` so callers don't have to specify which field they used.
|
|
16
|
+
*/
|
|
17
|
+
const COMMON_IDENTITY_KEYS = ['identifier', 'name', 'label'];
|
|
18
|
+
export async function buildIndex(client, classId, workspaceId, identifierField = 'identifier') {
|
|
19
|
+
// A9: prefer workspace-scoped UUID if attached to the client.
|
|
20
|
+
const wsId = client.__workspaceId ?? workspaceId;
|
|
21
|
+
const key = cacheKey(wsId, classId);
|
|
22
|
+
const cached = REFS.get(key);
|
|
23
|
+
if (cached)
|
|
24
|
+
return cached;
|
|
25
|
+
const docs = (await client.findAll(classId, {}));
|
|
26
|
+
const map = new Map();
|
|
27
|
+
for (const d of docs) {
|
|
28
|
+
const id = d._id;
|
|
29
|
+
const rec = d;
|
|
30
|
+
// CLI-02: index the configured identifier plus common identity fields.
|
|
31
|
+
// We only set the bare key (no `title:` prefix) so callers can look up
|
|
32
|
+
// by either "name" or "label" interchangeably, matching what help text
|
|
33
|
+
// advertises.
|
|
34
|
+
const indexed = new Set();
|
|
35
|
+
const fields = [identifierField, ...COMMON_IDENTITY_KEYS];
|
|
36
|
+
for (const f of fields) {
|
|
37
|
+
if (rec[f] != null) {
|
|
38
|
+
const v = String(rec[f]);
|
|
39
|
+
if (!indexed.has(v)) {
|
|
40
|
+
map.set(v, id);
|
|
41
|
+
indexed.add(v);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (rec.title != null)
|
|
46
|
+
map.set(`title:${String(rec.title).toLowerCase()}`, id);
|
|
47
|
+
map.set(id, id);
|
|
48
|
+
}
|
|
49
|
+
REFS.set(key, map);
|
|
50
|
+
return map;
|
|
51
|
+
}
|
|
52
|
+
/** Force a rebuild on next access — useful after writes. */
|
|
53
|
+
export function invalidateIndex(workspaceId, classId) {
|
|
54
|
+
if (workspaceId === undefined) {
|
|
55
|
+
REFS.clear();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (classId === undefined) {
|
|
59
|
+
for (const k of [...REFS.keys()])
|
|
60
|
+
if (k.startsWith(`${workspaceId}|`))
|
|
61
|
+
REFS.delete(k);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
REFS.delete(cacheKey(workspaceId, classId));
|
|
65
|
+
}
|
|
66
|
+
/** Invalidate every cache entry for a given workspaceId, including entries
|
|
67
|
+
* keyed by the legacy account-uuid alias. */
|
|
68
|
+
export function invalidateIndexForWorkspace(workspaceId) {
|
|
69
|
+
for (const k of [...REFS.keys()])
|
|
70
|
+
if (k.startsWith(`${workspaceId}|`))
|
|
71
|
+
REFS.delete(k);
|
|
72
|
+
}
|
|
73
|
+
export async function resolveRef(ref, opts) {
|
|
74
|
+
const trimmed = ref.trim();
|
|
75
|
+
if (!trimmed) {
|
|
76
|
+
throw new CliError(ExitCode.Validation, 'empty ref');
|
|
77
|
+
}
|
|
78
|
+
if (looksLikeId(trimmed))
|
|
79
|
+
return trimmed;
|
|
80
|
+
const ident = opts.identifierField ?? 'identifier';
|
|
81
|
+
const idx = await buildIndex(opts.client, opts.classId, opts.workspaceId, ident);
|
|
82
|
+
if (idx.has(trimmed))
|
|
83
|
+
return idx.get(trimmed);
|
|
84
|
+
if (looksLikePrefixed(trimmed)) {
|
|
85
|
+
if (idx.has(trimmed))
|
|
86
|
+
return idx.get(trimmed);
|
|
87
|
+
}
|
|
88
|
+
if (/^\d+$/.test(trimmed)) {
|
|
89
|
+
const prefix = opts.defaultProjectIdentifier;
|
|
90
|
+
if (prefix) {
|
|
91
|
+
const candidate = `${prefix}-${trimmed}`;
|
|
92
|
+
if (idx.has(candidate))
|
|
93
|
+
return idx.get(candidate);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Title-based lookup
|
|
97
|
+
const titleKey = `title:${trimmed.toLowerCase()}`;
|
|
98
|
+
if (idx.has(titleKey))
|
|
99
|
+
return idx.get(titleKey);
|
|
100
|
+
throw new CliError(ExitCode.NotFound, `ref not found: ${trimmed}`, `hint: candidates ${Array.from(idx.keys()).slice(0, 10).join(', ')}${idx.size > 10 ? '…' : ''}`);
|
|
101
|
+
}
|
|
102
|
+
export async function resolveRefs(refs, opts) {
|
|
103
|
+
return await Promise.all(refs.map((r) => resolveRef(r, opts)));
|
|
104
|
+
}
|
|
105
|
+
export function clearResolverCache() {
|
|
106
|
+
REFS.clear();
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=ref-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-resolver.js","sourceRoot":"","sources":["../../src/transport/ref-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { connectPlatform, resolveToken } from '../auth/client.js';
|
|
2
|
+
import { readEnv } from '../auth/env.js';
|
|
3
|
+
import { readActiveWorkspace, getCachedWorkspaceToken, readActiveAccount } from '../auth/cache.js';
|
|
4
|
+
import { CliError, ExitCode } from '../output/errors.js';
|
|
5
|
+
import { clearResolverCache } from './ref-resolver.js';
|
|
6
|
+
export async function resolveWorkspace(opts) {
|
|
7
|
+
const ws = opts.workspace ?? readEnv().workspace ?? (await readActiveWorkspace());
|
|
8
|
+
if (!ws) {
|
|
9
|
+
throw new CliError(ExitCode.Validation, 'no workspace resolved', 'set --workspace, HULY_WORKSPACE, or run `huly workspace use <name>`');
|
|
10
|
+
}
|
|
11
|
+
return ws;
|
|
12
|
+
}
|
|
13
|
+
export async function connectCli(opts = {}) {
|
|
14
|
+
const workspace = await resolveWorkspace(opts);
|
|
15
|
+
const client = (await connectPlatform({ ...opts, workspace }));
|
|
16
|
+
// A9: ref-resolver cache must be workspace-scoped. Resolve the workspace
|
|
17
|
+
// UUID from the cached workspace token if available; otherwise fall back
|
|
18
|
+
// to clearing the cache whenever the workspace changes.
|
|
19
|
+
try {
|
|
20
|
+
const env = readEnv();
|
|
21
|
+
const url = opts.url ?? env.url;
|
|
22
|
+
const active = await readActiveAccount(url);
|
|
23
|
+
const email = active ?? opts.email ?? env.email;
|
|
24
|
+
if (email !== undefined) {
|
|
25
|
+
const cached = await getCachedWorkspaceToken(url, email, workspace);
|
|
26
|
+
if (cached?.workspaceId !== undefined) {
|
|
27
|
+
client.__workspaceId = cached.workspaceId;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// best-effort
|
|
33
|
+
}
|
|
34
|
+
// If we can't determine a workspace UUID, clear any stale cache so we
|
|
35
|
+
// don't bleed indexes across workspaces.
|
|
36
|
+
if (client.__workspaceId === undefined)
|
|
37
|
+
clearResolverCache();
|
|
38
|
+
return client;
|
|
39
|
+
}
|
|
40
|
+
export async function connectAccountCli(opts = {}) {
|
|
41
|
+
const env = readEnv();
|
|
42
|
+
const url = opts.url ?? env.url;
|
|
43
|
+
let token = await resolveToken(opts);
|
|
44
|
+
// If a workspace is in scope (flag, env var, or active workspace file),
|
|
45
|
+
// prefer the workspace-scoped token so methods like getWorkspaceMembers /
|
|
46
|
+
// getWorkspaceInfo (which require workspace authorization) succeed.
|
|
47
|
+
// Workspace-scoped tokens have the workspace UUID which server-side
|
|
48
|
+
// permission gates (e.g. deleteWorkspace) require.
|
|
49
|
+
const workspace = opts.workspace ?? env.workspace ?? (await readActiveWorkspace());
|
|
50
|
+
if (workspace) {
|
|
51
|
+
try {
|
|
52
|
+
// A7: prefer cached active account over env.email (interactive login
|
|
53
|
+
// doesn't set HULY_EMAIL).
|
|
54
|
+
const active = await readActiveAccount(url);
|
|
55
|
+
const email = active ?? opts.email ?? env.email;
|
|
56
|
+
if (email) {
|
|
57
|
+
const ws = await getCachedWorkspaceToken(url, email, workspace);
|
|
58
|
+
if (ws?.token)
|
|
59
|
+
token = ws.token;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// best-effort; fall back to account token
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const { accountClient } = await import('../auth/client.js');
|
|
67
|
+
return await accountClient(url, token);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/transport/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@iamcoder18/huly-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI-agent-first CLI for self-hosted Huly",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"huly": "./bin/huly"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"bin"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc -p tsconfig.build.json && chmod +x dist/index.js",
|
|
16
|
+
"dev": "tsx src/index.ts",
|
|
17
|
+
"start": "node dist/index.js",
|
|
18
|
+
"typecheck": "tsc --noEmit",
|
|
19
|
+
"smoke": "bash scripts/smoke.sh all"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=22.11"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@hcengineering/account-client": "^0.7.423",
|
|
26
|
+
"@hcengineering/api-client": "^0.7.423",
|
|
27
|
+
"chalk": "^5.3.0",
|
|
28
|
+
"commander": "^12.1.0",
|
|
29
|
+
"inquirer": "^12.1.0",
|
|
30
|
+
"ora": "^8.1.1",
|
|
31
|
+
"ws": "^8.18.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/inquirer": "^9.0.7",
|
|
35
|
+
"@types/node": "^22.7.0",
|
|
36
|
+
"@types/ws": "^8.5.12",
|
|
37
|
+
"tsx": "^4.19.0",
|
|
38
|
+
"typescript": "^5.6.0"
|
|
39
|
+
}
|
|
40
|
+
}
|