@assethub/cli 0.1.32 → 0.1.35
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 +53 -26
- package/dist/agentSetup.d.ts +35 -40
- package/dist/agentSetup.d.ts.map +1 -1
- package/dist/agentSetup.js +64 -110
- package/dist/hooks/command.d.ts +1 -0
- package/dist/hooks/command.d.ts.map +1 -1
- package/dist/hooks/command.js +2 -1
- package/dist/hooks/save.d.ts +14 -0
- package/dist/hooks/save.d.ts.map +1 -1
- package/dist/hooks/save.js +20 -0
- package/dist/hooks/types.d.ts +2 -0
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/hooks/upload.d.ts +6 -0
- package/dist/hooks/upload.d.ts.map +1 -1
- package/dist/hooks/upload.js +16 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +121 -43
- package/dist/productionBatch.d.ts +2 -0
- package/dist/productionBatch.d.ts.map +1 -1
- package/dist/productionBatch.js +17 -1
- package/dist/progressReport.d.ts +42 -0
- package/dist/progressReport.d.ts.map +1 -0
- package/dist/progressReport.js +201 -0
- package/dist/setupCommand.d.ts +44 -2
- package/dist/setupCommand.d.ts.map +1 -1
- package/dist/setupCommand.js +313 -131
- package/package.json +1 -1
- package/skills/assethub/SKILL.md +3 -3
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// What `--wait` prints while runs work: one line per real change (a new step,
|
|
2
|
+
// another mesh ready, a part kept with an issue, the end of the run), with the
|
|
3
|
+
// local time, and for a batch the image's letter and file name. Part states
|
|
4
|
+
// that flicker (drawing, checking, redoing) never print a line on their own.
|
|
5
|
+
// A stopped run reports phase `done` and step 4 whatever stopped it, so where
|
|
6
|
+
// it stopped is the last step seen while it worked.
|
|
7
|
+
const stepNames = {
|
|
8
|
+
1: 'Planning the parts',
|
|
9
|
+
2: 'Making the base body',
|
|
10
|
+
3: 'Making the parts',
|
|
11
|
+
4: 'Assembling in Blender',
|
|
12
|
+
};
|
|
13
|
+
const pad2 = (value) => String(value).padStart(2, '0');
|
|
14
|
+
const clockTime = (date) => `${pad2(date.getHours())}:${pad2(date.getMinutes())}`;
|
|
15
|
+
const shortId = (id) => id.slice(0, 8);
|
|
16
|
+
const duration = (ms) => {
|
|
17
|
+
const minutes = Math.max(0, Math.round(ms / 60_000));
|
|
18
|
+
return minutes < 60
|
|
19
|
+
? `${minutes} min`
|
|
20
|
+
: `${Math.floor(minutes / 60)} h ${pad2(minutes % 60)} min`;
|
|
21
|
+
};
|
|
22
|
+
/** Where the run is: the summary with `Step 3 of 4` shortened to `3/4`. */
|
|
23
|
+
export const stepText = (execution) => execution.progress
|
|
24
|
+
? execution.progress.summary.replace(/^Step (\d+) of (\d+) · /, '$1/$2 ')
|
|
25
|
+
: execution.status;
|
|
26
|
+
/**
|
|
27
|
+
* Why a run stopped, in plain words. The backend sends V4 findings as a
|
|
28
|
+
* Python-style list (`[{'code': ..., 'message': ...}]`); each becomes
|
|
29
|
+
* `message (code)`.
|
|
30
|
+
*/
|
|
31
|
+
export const failureText = (execution) => plainError(execution.error?.message ??
|
|
32
|
+
execution.progress?.outcome?.detail ??
|
|
33
|
+
execution.history.error ??
|
|
34
|
+
execution.status);
|
|
35
|
+
const plainError = (message, code) => {
|
|
36
|
+
const findings = [...message.matchAll(/\{([^{}]*)\}/g)].flatMap(([, body]) => {
|
|
37
|
+
const field = (name) => new RegExp(`['"]${name}['"]:\\s*['"]([^'"]*)['"]`).exec(body)?.[1];
|
|
38
|
+
const text = field('message');
|
|
39
|
+
return text
|
|
40
|
+
? [`${text}${field('code') ? ` (${field('code')})` : ''}`]
|
|
41
|
+
: [];
|
|
42
|
+
});
|
|
43
|
+
if (message.trim().startsWith('[') && findings.length)
|
|
44
|
+
return findings.join('; ');
|
|
45
|
+
return code ? `${message} (${code})` : message;
|
|
46
|
+
};
|
|
47
|
+
const isFailure = (status) => status === 'failed' || status === 'cancelled';
|
|
48
|
+
const stoppedAt = (lastStep) => lastStep && stepNames[lastStep]
|
|
49
|
+
? `at ${lastStep}/4 ${stepNames[lastStep]} · `
|
|
50
|
+
: '';
|
|
51
|
+
const terminalText = (execution, status, lastStep) => {
|
|
52
|
+
if (isFailure(status)) {
|
|
53
|
+
return `✗ FAILED · ${stoppedAt(lastStep)}${failureText(execution)}`;
|
|
54
|
+
}
|
|
55
|
+
if (status === 'completed')
|
|
56
|
+
return `✓ done · ${stepText(execution)}`;
|
|
57
|
+
if (status === 'needs_review')
|
|
58
|
+
return `⚠ needs review · ${stepText(execution)}`;
|
|
59
|
+
return `⚠ ${status} · ${stepText(execution)}`;
|
|
60
|
+
};
|
|
61
|
+
const isTerminal = (status) => !['queued', 'running', 'dispatched'].includes(status);
|
|
62
|
+
/** The step a still-working run is on, to say later where it stopped. */
|
|
63
|
+
const workingStep = (execution, status) => !isTerminal(status) ? execution.progress?.step : undefined;
|
|
64
|
+
/** Parts that became kept-with-an-issue or failed since the last report. */
|
|
65
|
+
const newIssues = (previous, next) => {
|
|
66
|
+
const before = new Map(previous?.progress?.parts.map(part => [part.label, part.state]));
|
|
67
|
+
return (next.progress?.parts ?? [])
|
|
68
|
+
.filter(part => (part.state === 'kept' || part.state === 'failed') &&
|
|
69
|
+
before.get(part.label) !== part.state)
|
|
70
|
+
.map(part => `${part.state === 'kept' ? '⚠ kept with an issue' : '✗ part needs a person'}: ${part.label}${part.note ? ` · ${part.note}` : ''}`);
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* The lines one run's new receipt adds: its step or its end when either
|
|
74
|
+
* changed, then any part that newly needs attention. `status` is the batch
|
|
75
|
+
* item's status when it differs from the receipt's; `lastStep` the last step
|
|
76
|
+
* seen while the run worked.
|
|
77
|
+
*/
|
|
78
|
+
const changeLines = (previous, next, status = next.status, previousStatus = previous?.status, lastStep) => {
|
|
79
|
+
const text = isTerminal(status)
|
|
80
|
+
? terminalText(next, status, lastStep)
|
|
81
|
+
: stepText(next);
|
|
82
|
+
const before = previous && previousStatus
|
|
83
|
+
? isTerminal(previousStatus)
|
|
84
|
+
? terminalText(previous, previousStatus)
|
|
85
|
+
: stepText(previous)
|
|
86
|
+
: undefined;
|
|
87
|
+
return [...(text !== before ? [text] : []), ...newIssues(previous, next)];
|
|
88
|
+
};
|
|
89
|
+
/** `runs watch`, `production analyze --wait` and friends: one run. */
|
|
90
|
+
export const runReporter = ({ write, now = () => new Date(), }) => {
|
|
91
|
+
let last;
|
|
92
|
+
let lastStep;
|
|
93
|
+
return (execution) => {
|
|
94
|
+
const lines = changeLines(last, execution, execution.status, last?.status, lastStep);
|
|
95
|
+
last = execution;
|
|
96
|
+
lastStep = workingStep(execution, execution.status) ?? lastStep;
|
|
97
|
+
for (const line of lines)
|
|
98
|
+
write(`${clockTime(now())} run ${shortId(execution.runId)} ${line}\n`);
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* `production batch`: a header naming each image by letter (A, B, …; `A#2`
|
|
103
|
+
* for the second repeat), a line per real change, and a status table.
|
|
104
|
+
*/
|
|
105
|
+
export const batchReporter = (options) => {
|
|
106
|
+
const { write, images } = options;
|
|
107
|
+
const now = options.now ?? (() => new Date());
|
|
108
|
+
const repeats = images.some(image => image.repeat > 1);
|
|
109
|
+
const letter = (image) => `${image.imageIndex < 26 ? String.fromCharCode(65 + image.imageIndex) : image.imageIndex + 1}${repeats ? `#${image.repeat}` : ''}`;
|
|
110
|
+
const letterWidth = Math.max(...images.map(image => letter(image).length));
|
|
111
|
+
const nameWidth = Math.max(...images.map(image => image.name.length));
|
|
112
|
+
const who = (key) => {
|
|
113
|
+
const image = images.find(entry => entry.key === key);
|
|
114
|
+
return `${letter(image).padEnd(letterWidth)} ${image.name.padEnd(nameWidth)}`;
|
|
115
|
+
};
|
|
116
|
+
const state = new Map();
|
|
117
|
+
const say = (key, line) => write(`${clockTime(now())} ${who(key)} ${line}\n`);
|
|
118
|
+
const header = () => {
|
|
119
|
+
const runs = `${images.length} run${images.length === 1 ? '' : 's'}${options.concurrency ? `, ${options.concurrency} at a time` : ''}`;
|
|
120
|
+
write([
|
|
121
|
+
`Batch ${shortId(options.operationId)} · ${options.agent} · ${runs} · canvas ${options.canvasId}`,
|
|
122
|
+
...images
|
|
123
|
+
.filter(image => !repeats || image.repeat === 1)
|
|
124
|
+
.map(image => ` ${String.fromCharCode(65 + image.imageIndex).padEnd(1)} ${image.name}`),
|
|
125
|
+
` Resume with: --operation-id ${options.operationId}`,
|
|
126
|
+
'',
|
|
127
|
+
'',
|
|
128
|
+
].join('\n'));
|
|
129
|
+
};
|
|
130
|
+
const item = (result) => {
|
|
131
|
+
const entry = state.get(result.key);
|
|
132
|
+
const previous = entry?.result;
|
|
133
|
+
const lines = [];
|
|
134
|
+
if (result.execution) {
|
|
135
|
+
if (!previous?.execution)
|
|
136
|
+
lines.push(isTerminal(result.status)
|
|
137
|
+
? terminalText(result.execution, result.status)
|
|
138
|
+
: `started run ${shortId(result.execution.runId)} · ${stepText(result.execution)}`, ...newIssues(undefined, result.execution));
|
|
139
|
+
else
|
|
140
|
+
lines.push(...changeLines(previous.execution, result.execution, result.status, previous.status, entry?.lastStep));
|
|
141
|
+
}
|
|
142
|
+
else if (result.status === 'deferred') {
|
|
143
|
+
lines.push(`waiting for a free run slot · ${result.message ?? result.reason ?? ''}`);
|
|
144
|
+
}
|
|
145
|
+
else if (result.status === 'failed') {
|
|
146
|
+
lines.push(`✗ could not start · ${plainError(result.message ?? 'failed', result.code)}`);
|
|
147
|
+
}
|
|
148
|
+
const next = {
|
|
149
|
+
result,
|
|
150
|
+
startedAt: entry?.startedAt ??
|
|
151
|
+
(result.execution ? new Date(result.execution.createdAt) : undefined),
|
|
152
|
+
endedAt: entry?.endedAt ??
|
|
153
|
+
(result.execution && isTerminal(result.status) ? now() : undefined),
|
|
154
|
+
lastLine: entry?.lastLine,
|
|
155
|
+
lastStep: (result.execution && workingStep(result.execution, result.status)) ??
|
|
156
|
+
entry?.lastStep,
|
|
157
|
+
};
|
|
158
|
+
for (const line of lines) {
|
|
159
|
+
if (line === next.lastLine)
|
|
160
|
+
continue;
|
|
161
|
+
next.lastLine = line;
|
|
162
|
+
say(result.key, line);
|
|
163
|
+
}
|
|
164
|
+
state.set(result.key, next);
|
|
165
|
+
};
|
|
166
|
+
/** Every image's state now: printed every few minutes and at the end. */
|
|
167
|
+
const table = (title) => {
|
|
168
|
+
const rows = images.map(image => {
|
|
169
|
+
const entry = state.get(image.key);
|
|
170
|
+
const result = entry?.result;
|
|
171
|
+
const execution = result?.execution;
|
|
172
|
+
const [mark, detail] = !result
|
|
173
|
+
? ['○ not started', '']
|
|
174
|
+
: execution
|
|
175
|
+
? isFailure(result.status)
|
|
176
|
+
? [
|
|
177
|
+
'✗ failed',
|
|
178
|
+
`${entry?.lastStep ? `at ${entry.lastStep}/4 · ` : ''}${failureText(execution)}`,
|
|
179
|
+
]
|
|
180
|
+
: result.status === 'completed'
|
|
181
|
+
? ['✓ done', stepText(execution)]
|
|
182
|
+
: isTerminal(result.status)
|
|
183
|
+
? [`⚠ ${result.status.replace('_', ' ')}`, stepText(execution)]
|
|
184
|
+
: ['● running', stepText(execution)]
|
|
185
|
+
: result.status === 'deferred'
|
|
186
|
+
? ['… waiting', result.message ?? result.reason ?? '']
|
|
187
|
+
: result.status === 'failed'
|
|
188
|
+
? [
|
|
189
|
+
'✗ failed',
|
|
190
|
+
plainError(result.message ?? 'failed', result.code),
|
|
191
|
+
]
|
|
192
|
+
: ['○ not started', ''];
|
|
193
|
+
const took = entry?.startedAt && !Number.isNaN(entry.startedAt.getTime())
|
|
194
|
+
? ` ${duration((entry.endedAt ?? now()).getTime() - entry.startedAt.getTime())}`
|
|
195
|
+
: '';
|
|
196
|
+
return ` ${who(image.key)} ${mark.padEnd(12)}${detail}${took}`;
|
|
197
|
+
});
|
|
198
|
+
write(['', `── ${clockTime(now())} · ${title} ──`, ...rows, '', ''].join('\n'));
|
|
199
|
+
};
|
|
200
|
+
return { header, item, table };
|
|
201
|
+
};
|
package/dist/setupCommand.d.ts
CHANGED
|
@@ -1,23 +1,44 @@
|
|
|
1
1
|
import { API_KEY_ENV } from './appEnv.js';
|
|
2
|
+
import { type AgentId, type SkillsReport } from './agentSetup.js';
|
|
2
3
|
import type { InstallHooks } from './setupHooksBridge.js';
|
|
3
4
|
export type StepStatus = 'ok' | 'fail' | 'skip';
|
|
5
|
+
/** What a step did to local state: nothing, a write, or (dry run) a write it would make. */
|
|
6
|
+
export type StepChange = 'unchanged' | 'updated' | 'would-update';
|
|
4
7
|
export type SetupStep = {
|
|
5
8
|
name: string;
|
|
6
9
|
status: StepStatus;
|
|
7
10
|
detail: string;
|
|
11
|
+
change?: StepChange;
|
|
12
|
+
/** The config file or folder the step reads and writes. */
|
|
13
|
+
path?: string;
|
|
8
14
|
};
|
|
15
|
+
export declare const SETUP_STEPS: readonly ["login", "workspace", "mcp", "skills", "app-env", "hook", "doctor"];
|
|
16
|
+
export type SetupStepName = (typeof SETUP_STEPS)[number];
|
|
9
17
|
export type SetupResult = {
|
|
10
18
|
ok: boolean;
|
|
11
19
|
dryRun: boolean;
|
|
12
20
|
profile: string;
|
|
13
21
|
baseUrl: string;
|
|
14
22
|
workspaceId?: string;
|
|
23
|
+
/** CLI version, which is also the version of the installed skill. */
|
|
24
|
+
version: string;
|
|
25
|
+
scope: 'global' | 'project';
|
|
26
|
+
agents: AgentId[];
|
|
27
|
+
/** Agents found on this machine, whether or not they were selected. */
|
|
28
|
+
detected: AgentId[];
|
|
29
|
+
/** The skill copy and each agent's link to it, when the skills step ran. */
|
|
30
|
+
skill?: SkillsReport;
|
|
15
31
|
steps: SetupStep[];
|
|
16
32
|
nextStep: string;
|
|
17
33
|
exportLine?: string;
|
|
18
34
|
};
|
|
19
35
|
export type SetupOptions = {
|
|
20
|
-
|
|
36
|
+
/** Agents to configure; undefined means every agent detected on this machine. */
|
|
37
|
+
agents?: AgentId[];
|
|
38
|
+
/** Write MCP config and the skill into the current folder instead of the home folder. */
|
|
39
|
+
project?: boolean;
|
|
40
|
+
/** Steps to leave out (`--skip`, `--only`, `--no-skills`). */
|
|
41
|
+
skip?: SetupStepName[];
|
|
21
42
|
workspace?: string;
|
|
22
43
|
apiKeyStdin: boolean;
|
|
23
44
|
/** An API key given as --api-key (always wins) or found in ASSETHUB_API_KEY (used when no saved key works). */
|
|
@@ -63,6 +84,20 @@ export type SetupDeps = {
|
|
|
63
84
|
}) => Promise<void>;
|
|
64
85
|
promptApiKey: () => Promise<string>;
|
|
65
86
|
resolveAuth: () => Promise<SetupAuth>;
|
|
87
|
+
/** Base URL and workspace from flags and the saved profile, without a key or the network (login skipped). */
|
|
88
|
+
resolveTarget: () => Promise<{
|
|
89
|
+
baseUrl: string;
|
|
90
|
+
workspaceId?: string;
|
|
91
|
+
}>;
|
|
92
|
+
/** Agents installed on this machine. */
|
|
93
|
+
detectAgents: () => Promise<AgentId[]>;
|
|
94
|
+
version: () => Promise<string>;
|
|
95
|
+
/** Installs the skill under root and links it into each agent; reports without writing on a dry run. */
|
|
96
|
+
installSkills: (input: {
|
|
97
|
+
root: string;
|
|
98
|
+
agents: AgentId[];
|
|
99
|
+
dryRun: boolean;
|
|
100
|
+
}) => Promise<SkillsReport>;
|
|
66
101
|
discoverWorkspace: (auth: SetupAuth) => Promise<string | undefined>;
|
|
67
102
|
useWorkspace: (id: string) => Promise<void>;
|
|
68
103
|
listWorkspaces: () => Promise<SetupWorkspace[]>;
|
|
@@ -99,7 +134,7 @@ export declare const claudeServerConfig: (baseUrl: string, workspaceId?: string)
|
|
|
99
134
|
Authorization: string;
|
|
100
135
|
};
|
|
101
136
|
};
|
|
102
|
-
export declare const claudeAddArgs: (baseUrl: string, workspaceId?: string) => string[];
|
|
137
|
+
export declare const claudeAddArgs: (baseUrl: string, workspaceId?: string, scope?: "user" | "project") => string[];
|
|
103
138
|
export declare const runSetup: (options: SetupOptions, deps: SetupDeps) => Promise<SetupResult>;
|
|
104
139
|
export declare const formatSetupSummary: (result: SetupResult) => string;
|
|
105
140
|
export declare const findOnPath: (name: string, pathValue?: string) => Promise<string | undefined>;
|
|
@@ -114,6 +149,13 @@ export declare const defaultFileDeps: () => {
|
|
|
114
149
|
codexHome: string;
|
|
115
150
|
now: () => Date;
|
|
116
151
|
findBinary: (name: string) => Promise<string | undefined>;
|
|
152
|
+
detectAgents: () => Promise<("cursor" | "codex" | "claude-code")[]>;
|
|
153
|
+
version: () => Promise<string>;
|
|
154
|
+
installSkills: ({ root, agents, dryRun, }: {
|
|
155
|
+
root: string;
|
|
156
|
+
agents: AgentId[];
|
|
157
|
+
dryRun: boolean;
|
|
158
|
+
}) => Promise<SkillsReport>;
|
|
117
159
|
run: (file: string, args: string[]) => Promise<{
|
|
118
160
|
code: number;
|
|
119
161
|
output: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupCommand.d.ts","sourceRoot":"","sources":["../src/setupCommand.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setupCommand.d.ts","sourceRoot":"","sources":["../src/setupCommand.ts"],"names":[],"mappings":"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"}
|