@imfusion/web-ui 0.7.2-dev.6.g1f49e9fa → 0.8.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/CHANGELOG.md +94 -1
- package/README.md +32 -0
- package/dist/components/navigation-menu/subs/link.d.ts +1 -4
- package/dist/components/prose/index.d.ts +2 -0
- package/dist/components/prose/prose.d.ts +1 -0
- package/dist/components/prose/prose.meta.d.ts +2 -0
- package/dist/components/separator/separator.d.ts +1 -2
- package/dist/components/typo/typo.d.ts +12 -16
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1172 -1181
- package/dist/paths-Oi0v8x-w.js +26 -0
- package/dist/style.css +1 -1
- package/dist/vite/index.d.ts +1 -0
- package/dist/vite/local-web-ui-link.d.ts +8 -0
- package/dist/vite.js +32 -17
- package/dist/web-ui-cli.js +121 -146
- package/docs/user-guide/Changelog.mdx +1 -1
- package/package.json +1 -1
- package/src/docgen/doc.gen.json +9 -78
- package/src/llms/llms.gen.txt +5 -0
- package/src/llms/skills/imf-web-ui-conventions/SKILL.md +1 -1
- package/src/llms/skills/imf-web-ui-conventions/templates/AUDIT_CHECKLIST.md +5 -4
- package/src/llms/skills/imf-web-ui-conventions/topics/library-boundary.md +13 -0
- package/src/llms/skills/imf-web-ui-conventions/topics/react.md +1 -1
- package/src/llms/skills/imf-web-ui-conventions/topics/styling.md +25 -0
- package/src/llms/skills/imf-web-ui-conventions/topics/tooling.md +3 -0
- package/src/llms/skills/imf-web-ui-update/SKILL.md +2 -1
- package/src/llms/skills/imf-web-ui-ux/SKILL.md +2 -1
package/dist/vite/index.d.ts
CHANGED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Plugin, UserConfig } from 'vite';
|
|
2
|
+
/** Returns `undefined` for an installed package; only a checkout outside `node_modules` needs the config. */
|
|
3
|
+
export declare function localWebUILinkConfig(root: string): UserConfig | undefined;
|
|
4
|
+
/**
|
|
5
|
+
* Lets a consumer link a local checkout (`"@imfusion/web-ui": "file:../web-ui"`) without loading two copies of React in
|
|
6
|
+
* client dev and build. SSR is not covered. Does nothing for an installed package, so it can stay registered.
|
|
7
|
+
*/
|
|
8
|
+
export declare function localWebUILink(): Plugin;
|
package/dist/vite.js
CHANGED
|
@@ -1,33 +1,34 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { n as e } from "./paths-Oi0v8x-w.js";
|
|
2
|
+
import { readFileSync as t, readdirSync as n, realpathSync as r } from "node:fs";
|
|
3
|
+
import { dirname as i, join as a, resolve as o, sep as s } from "node:path";
|
|
4
|
+
import { fileURLToPath as c } from "node:url";
|
|
4
5
|
//#region src/vite/brand-assets.ts
|
|
5
|
-
var
|
|
6
|
-
name:
|
|
7
|
-
source:
|
|
8
|
-
})),
|
|
6
|
+
var l = i(c(import.meta.resolve("@imfusion/web-ui/assets/favicon/favicon.svg"))), u = n(l).map((e) => ({
|
|
7
|
+
name: e,
|
|
8
|
+
source: t(a(l, e))
|
|
9
|
+
})), d = {
|
|
9
10
|
".ico": "image/x-icon",
|
|
10
11
|
".png": "image/png",
|
|
11
12
|
".svg": "image/svg+xml"
|
|
12
13
|
};
|
|
13
|
-
function
|
|
14
|
-
return
|
|
14
|
+
function f(e) {
|
|
15
|
+
return d[e.slice(e.lastIndexOf("."))] ?? "application/octet-stream";
|
|
15
16
|
}
|
|
16
|
-
function
|
|
17
|
+
function p() {
|
|
17
18
|
return {
|
|
18
19
|
name: "imf-ui:brand-assets",
|
|
19
20
|
configureServer(e) {
|
|
20
21
|
e.middlewares.use((e, t, n) => {
|
|
21
|
-
let r =
|
|
22
|
+
let r = u.find(({ name: t }) => e.url?.split("?")[0] === `/${t}`);
|
|
22
23
|
if (!r) {
|
|
23
24
|
n();
|
|
24
25
|
return;
|
|
25
26
|
}
|
|
26
|
-
t.setHeader("Content-Type",
|
|
27
|
+
t.setHeader("Content-Type", f(r.name)), t.end(r.source);
|
|
27
28
|
});
|
|
28
29
|
},
|
|
29
30
|
generateBundle() {
|
|
30
|
-
for (let e of
|
|
31
|
+
for (let e of u) this.emitFile({
|
|
31
32
|
fileName: e.name,
|
|
32
33
|
source: e.source,
|
|
33
34
|
type: "asset"
|
|
@@ -36,20 +37,34 @@ function l() {
|
|
|
36
37
|
};
|
|
37
38
|
}
|
|
38
39
|
//#endregion
|
|
40
|
+
//#region src/vite/local-web-ui-link.ts
|
|
41
|
+
function m(e) {
|
|
42
|
+
if (r(e).split(s).includes("node_modules")) return;
|
|
43
|
+
let n = JSON.parse(t(o(e, "package.json"), "utf-8")), i = typeof n == "object" && n ? Reflect.get(n, "peerDependencies") : {};
|
|
44
|
+
if (typeof i != "object" || !i) throw Error(`${e}/package.json has no peerDependencies`);
|
|
45
|
+
return { resolve: { dedupe: Object.keys(i) } };
|
|
46
|
+
}
|
|
47
|
+
function h() {
|
|
48
|
+
return {
|
|
49
|
+
name: "imf-ui:local-web-ui-link",
|
|
50
|
+
config: () => m(e)
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
39
54
|
//#region src/vite/readable-css-module-names.ts
|
|
40
|
-
function
|
|
55
|
+
function g(e, t) {
|
|
41
56
|
let { lightningcss: n, modules: r, transformer: i } = e.css ?? {}, a = n?.cssModules;
|
|
42
57
|
if (!(typeof a == "boolean" || r === !1) && !a?.pattern && !(typeof r == "object" && r.generateScopedName)) return i === "postcss" ? { css: { modules: { generateScopedName: t } } } : { css: {
|
|
43
58
|
transformer: "lightningcss",
|
|
44
59
|
lightningcss: { cssModules: { pattern: t } }
|
|
45
60
|
} };
|
|
46
61
|
}
|
|
47
|
-
function
|
|
62
|
+
function _({ prefix: e }) {
|
|
48
63
|
let t = `${e}-[name]-[local]`;
|
|
49
64
|
return {
|
|
50
65
|
name: "imf-ui:readable-css-module-names",
|
|
51
|
-
config: (e) =>
|
|
66
|
+
config: (e) => g(e, t)
|
|
52
67
|
};
|
|
53
68
|
}
|
|
54
69
|
//#endregion
|
|
55
|
-
export {
|
|
70
|
+
export { p as imfusionBrandAssets, h as localWebUILink, _ as readableCssModuleNames };
|
package/dist/web-ui-cli.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { Command as
|
|
6
|
-
import * as
|
|
7
|
-
|
|
8
|
-
var _ = {
|
|
2
|
+
import { n as e, r as t, t as n } from "./paths-Oi0v8x-w.js";
|
|
3
|
+
import { chmodSync as r, cpSync as i, existsSync as a, lstatSync as o, mkdirSync as s, readFileSync as c, readdirSync as l, readlinkSync as u, realpathSync as d, rmSync as f, symlinkSync as p, writeFileSync as m } from "node:fs";
|
|
4
|
+
import { dirname as h, relative as g, resolve as _ } from "node:path";
|
|
5
|
+
import { Command as ee, Option as te } from "commander";
|
|
6
|
+
import * as v from "@clack/prompts";
|
|
7
|
+
var y = {
|
|
9
8
|
harnesses: {
|
|
10
9
|
claude: {
|
|
11
10
|
label: "Claude Code",
|
|
@@ -25,124 +24,100 @@ var _ = {
|
|
|
25
24
|
skillsDir: ".agents/skills",
|
|
26
25
|
linkDir: ".claude/skills",
|
|
27
26
|
versionMarker: ".imf-web-ui-skill-version.json"
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
let t = e;
|
|
33
|
-
for (; !n(m(t, "package.json"));) {
|
|
34
|
-
let n = f(t);
|
|
35
|
-
if (n === t) throw Error(`Could not find package.json above ${e}`);
|
|
36
|
-
t = n;
|
|
37
|
-
}
|
|
38
|
-
return t;
|
|
39
|
-
}
|
|
40
|
-
var y = v(f(ee(import.meta.url))), b = process.cwd();
|
|
41
|
-
function x(e) {
|
|
42
|
-
let t = b;
|
|
43
|
-
for (; t !== f(t) && !n(m(t, "node_modules", ".bin"));) t = f(t);
|
|
44
|
-
let r = m(t, "node_modules", ".bin", "prettier");
|
|
45
|
-
n(r) && g(r, ["--write", ...e], {
|
|
46
|
-
cwd: b,
|
|
47
|
-
stdio: "ignore"
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
//#endregion
|
|
51
|
-
//#region src/cli/agents-md.ts
|
|
52
|
-
var re = `<!-- ${_.namespace}:begin`, S = `<!-- ${_.namespace}:end -->`, ie = m(y, _.templatesDir, "AGENTS.md"), C = m(b, "AGENTS.md");
|
|
53
|
-
function w(e) {
|
|
54
|
-
let t = e.indexOf(re), n = e.indexOf(S);
|
|
55
|
-
return t === -1 || n === -1 ? null : e.slice(t, n + S.length);
|
|
27
|
+
}, ne = `<!-- ${y.namespace}:begin`, b = `<!-- ${y.namespace}:end -->`, re = _(e, y.templatesDir, "AGENTS.md"), x = _(t, "AGENTS.md");
|
|
28
|
+
function S(e) {
|
|
29
|
+
let t = e.indexOf(ne), n = e.indexOf(b);
|
|
30
|
+
return t === -1 || n === -1 ? null : e.slice(t, n + b.length);
|
|
56
31
|
}
|
|
57
|
-
function
|
|
58
|
-
if (!
|
|
59
|
-
let e =
|
|
32
|
+
function ie() {
|
|
33
|
+
if (!a(x)) return "absent";
|
|
34
|
+
let e = S(c(re, "utf-8"));
|
|
60
35
|
if (!e) return "absent";
|
|
61
|
-
let t =
|
|
62
|
-
return
|
|
36
|
+
let t = c(x, "utf-8"), n = S(t), r = n ? t.replace(n, e) : `${t.trimEnd()}\n\n${e}\n`;
|
|
37
|
+
return r === t ? "unchanged" : (m(x, r), n ? "updated" : "added");
|
|
63
38
|
}
|
|
64
39
|
//#endregion
|
|
65
40
|
//#region src/cli/skills.ts
|
|
66
|
-
var
|
|
67
|
-
function
|
|
68
|
-
return e === "all" ?
|
|
41
|
+
var C = Object.keys(y.harnesses).filter((e) => e in y.harnesses), w = [...C, "all"];
|
|
42
|
+
function T(e) {
|
|
43
|
+
return e === "all" ? C : [e];
|
|
69
44
|
}
|
|
70
|
-
function
|
|
71
|
-
return `./${
|
|
45
|
+
function E(e) {
|
|
46
|
+
return `./${g(t, e)}`;
|
|
72
47
|
}
|
|
73
|
-
var
|
|
74
|
-
if (typeof
|
|
75
|
-
var
|
|
76
|
-
function
|
|
77
|
-
return e ===
|
|
48
|
+
var D = y.namespace, O = y.versionMarker, k = _(e, y.skillsSource), A = _(t, y.skillsDir), j = _(t, y.linkDir), M = class extends Error {}, N = JSON.parse(c(_(e, "package.json"), "utf-8"));
|
|
49
|
+
if (typeof N != "object" || !N || !("version" in N) || typeof N.version != "string") throw Error(`${_(e, "package.json")} has no string "version" field`);
|
|
50
|
+
var P = N.version;
|
|
51
|
+
function F(e) {
|
|
52
|
+
return e === D || e.startsWith(`${D}-`);
|
|
78
53
|
}
|
|
79
|
-
function
|
|
80
|
-
return
|
|
54
|
+
function I() {
|
|
55
|
+
return a(k) ? l(k, { withFileTypes: !0 }).filter((e) => e.isDirectory() && F(e.name)).map((e) => e.name).sort() : [];
|
|
81
56
|
}
|
|
82
|
-
function
|
|
83
|
-
let t =
|
|
84
|
-
if (!
|
|
57
|
+
function ae(e) {
|
|
58
|
+
let t = _(A, e, O);
|
|
59
|
+
if (!a(t)) return null;
|
|
85
60
|
try {
|
|
86
|
-
let e = JSON.parse(
|
|
61
|
+
let e = JSON.parse(c(t, "utf-8"));
|
|
87
62
|
if (typeof e != "object" || !e) return null;
|
|
88
63
|
let n = "harnesses" in e && Array.isArray(e.harnesses) ? e.harnesses : null;
|
|
89
|
-
return n ?
|
|
64
|
+
return n ? C.filter((e) => n.includes(e)) : null;
|
|
90
65
|
} catch {
|
|
91
66
|
return null;
|
|
92
67
|
}
|
|
93
68
|
}
|
|
94
|
-
function
|
|
69
|
+
function L(e) {
|
|
95
70
|
for (let t of e) {
|
|
96
|
-
let e =
|
|
71
|
+
let e = ae(t);
|
|
97
72
|
if (e && e.length > 0) return e;
|
|
98
73
|
}
|
|
99
74
|
return null;
|
|
100
75
|
}
|
|
101
|
-
function
|
|
102
|
-
if (
|
|
76
|
+
function R(e, t, n) {
|
|
77
|
+
if (a(e)) for (let r of l(e).filter(F)) t.has(r) || (f(_(e, r), {
|
|
103
78
|
recursive: !0,
|
|
104
79
|
force: !0
|
|
105
|
-
}),
|
|
80
|
+
}), v.log.info(`Removed skill: ${r} (${n})`));
|
|
106
81
|
}
|
|
107
|
-
function
|
|
108
|
-
return
|
|
82
|
+
function oe() {
|
|
83
|
+
return a(j) && a(A) && d(j) === d(A);
|
|
109
84
|
}
|
|
110
|
-
function
|
|
111
|
-
let t =
|
|
112
|
-
|
|
85
|
+
function z(e) {
|
|
86
|
+
let t = _(j, e), n = g(j, _(A, e)), r = o(t, { throwIfNoEntry: !1 });
|
|
87
|
+
r?.isSymbolicLink() && u(t) === n || (r && f(t, {
|
|
113
88
|
recursive: !0,
|
|
114
89
|
force: !0
|
|
115
|
-
}),
|
|
90
|
+
}), s(j, { recursive: !0 }), p(n, t));
|
|
116
91
|
}
|
|
117
|
-
function
|
|
92
|
+
function se(e, t) {
|
|
118
93
|
try {
|
|
119
|
-
|
|
94
|
+
s(A, { recursive: !0 });
|
|
120
95
|
let r = [];
|
|
121
|
-
for (let
|
|
122
|
-
let e =
|
|
123
|
-
|
|
96
|
+
for (let n of e) {
|
|
97
|
+
let e = _(A, n);
|
|
98
|
+
f(e, {
|
|
124
99
|
recursive: !0,
|
|
125
100
|
force: !0
|
|
126
|
-
}),
|
|
127
|
-
let a =
|
|
128
|
-
|
|
129
|
-
version:
|
|
130
|
-
harnesses:
|
|
101
|
+
}), i(_(k, n), e, { recursive: !0 });
|
|
102
|
+
let a = _(e, O);
|
|
103
|
+
m(a, JSON.stringify({
|
|
104
|
+
version: P,
|
|
105
|
+
harnesses: t
|
|
131
106
|
}, null, 2) + "\n"), r.push(a);
|
|
132
107
|
}
|
|
133
|
-
if (
|
|
134
|
-
if (
|
|
135
|
-
for (let t of e)
|
|
136
|
-
|
|
137
|
-
} else
|
|
108
|
+
if (n(r), R(A, new Set(e), "no longer in this bundle"), v.log.success(`Skills -> ${E(A)}/${D}*`), oe()) return;
|
|
109
|
+
if (t.includes("claude")) {
|
|
110
|
+
for (let t of e) z(t);
|
|
111
|
+
R(j, new Set(e), "no longer in this bundle"), v.log.success(`Claude Code -> ${E(j)}/${D}* (symlinks -> ${E(A)})`);
|
|
112
|
+
} else R(j, /* @__PURE__ */ new Set(), "claude not selected");
|
|
138
113
|
} catch (e) {
|
|
139
|
-
throw e instanceof Error ? new
|
|
114
|
+
throw e instanceof Error ? new M(e.message) : e;
|
|
140
115
|
}
|
|
141
116
|
}
|
|
142
117
|
//#endregion
|
|
143
118
|
//#region src/cli/hooks.ts
|
|
144
|
-
var B =
|
|
145
|
-
function
|
|
119
|
+
var B = _(e, y.templatesDir), V = _(B, "hooks"), H = _(t, y.hooksDir), U = class extends Error {};
|
|
120
|
+
function ce(e, t) {
|
|
146
121
|
if (typeof e != "object" || !e || Array.isArray(e)) throw new U(`${t} is not a JSON object.`);
|
|
147
122
|
let n = { ...e };
|
|
148
123
|
if ("hooks" in n) {
|
|
@@ -154,27 +129,27 @@ function de(e, t) {
|
|
|
154
129
|
function W(e) {
|
|
155
130
|
let t;
|
|
156
131
|
try {
|
|
157
|
-
t = JSON.parse(
|
|
132
|
+
t = JSON.parse(c(e, "utf-8"));
|
|
158
133
|
} catch {
|
|
159
134
|
throw new U(`${e} is not valid JSON.`);
|
|
160
135
|
}
|
|
161
|
-
return
|
|
136
|
+
return ce(t, e);
|
|
162
137
|
}
|
|
163
|
-
function
|
|
164
|
-
let
|
|
165
|
-
|
|
166
|
-
for (let
|
|
167
|
-
let
|
|
168
|
-
|
|
138
|
+
function le() {
|
|
139
|
+
let e = l(V).filter((e) => e.endsWith(".sh"));
|
|
140
|
+
s(H, { recursive: !0 });
|
|
141
|
+
for (let t of e) {
|
|
142
|
+
let e = _(H, t);
|
|
143
|
+
i(_(V, t), e, { force: !0 }), r(e, 493);
|
|
169
144
|
}
|
|
170
|
-
let
|
|
171
|
-
for (let e of
|
|
145
|
+
let t = l(H).filter((t) => t.endsWith(".sh") && !e.includes(t));
|
|
146
|
+
for (let e of t) f(_(H, e), { force: !0 });
|
|
172
147
|
return {
|
|
173
|
-
installed:
|
|
174
|
-
removed:
|
|
148
|
+
installed: e,
|
|
149
|
+
removed: t
|
|
175
150
|
};
|
|
176
151
|
}
|
|
177
|
-
var G = `${
|
|
152
|
+
var G = `${y.hooksDir}/`;
|
|
178
153
|
function K(e) {
|
|
179
154
|
if (typeof e != "string") return null;
|
|
180
155
|
let t = e.lastIndexOf(G);
|
|
@@ -195,7 +170,7 @@ function X(e) {
|
|
|
195
170
|
let t = J(e);
|
|
196
171
|
return t ? t.map((e) => K(Y(e))).filter((e) => e !== null) : [];
|
|
197
172
|
}
|
|
198
|
-
function
|
|
173
|
+
function ue(e, t, n) {
|
|
199
174
|
e.hooks ??= {};
|
|
200
175
|
let r = 0, i = 0, a = [];
|
|
201
176
|
for (let [r, o] of Object.entries(e.hooks)) {
|
|
@@ -228,73 +203,73 @@ function pe(e, t, n) {
|
|
|
228
203
|
removed: i
|
|
229
204
|
};
|
|
230
205
|
}
|
|
231
|
-
function
|
|
232
|
-
let
|
|
233
|
-
for (let
|
|
234
|
-
let
|
|
235
|
-
if (
|
|
236
|
-
let e =
|
|
237
|
-
|
|
206
|
+
function de(e) {
|
|
207
|
+
let r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map();
|
|
208
|
+
for (let n of C) {
|
|
209
|
+
let o = _(t, y.harnesses[n].hookSettings);
|
|
210
|
+
if (a(o) && r.set(n, W(o)), e.includes(n)) {
|
|
211
|
+
let e = _(B, y.harnesses[n].hookTemplate);
|
|
212
|
+
i.set(n, W(e).hooks ?? {});
|
|
238
213
|
}
|
|
239
214
|
}
|
|
240
|
-
let { installed:
|
|
241
|
-
|
|
242
|
-
for (let
|
|
243
|
-
let
|
|
244
|
-
if (!
|
|
245
|
-
let
|
|
246
|
-
if (
|
|
247
|
-
|
|
215
|
+
let { installed: o, removed: c } = le();
|
|
216
|
+
v.log.success(`Agent hooks -> ${E(H)} (${String(o.length)} scripts)`), c.length > 0 && v.log.info(`Removed stale hook script(s): ${c.join(", ")} (no longer shipped)`);
|
|
217
|
+
for (let a of C) {
|
|
218
|
+
let c = e.includes(a);
|
|
219
|
+
if (!c && !r.has(a)) continue;
|
|
220
|
+
let l = _(t, y.harnesses[a].hookSettings), u = i.get(a) ?? {}, d = r.get(a) ?? {}, f = ue(d, u, c ? o : []);
|
|
221
|
+
if (f.added === 0 && f.removed === 0) {
|
|
222
|
+
c && v.log.info(`Hook registrations already present in ${E(l)}`);
|
|
248
223
|
continue;
|
|
249
224
|
}
|
|
250
|
-
|
|
251
|
-
let p = [
|
|
252
|
-
|
|
225
|
+
s(h(l), { recursive: !0 }), m(l, JSON.stringify(d, null, 2) + "\n"), n([l]);
|
|
226
|
+
let p = [f.added > 0 && `registered ${String(f.added)}`, f.removed > 0 && `removed ${String(f.removed)} stale`].filter(Boolean);
|
|
227
|
+
v.log.success(`${p.join(", ")} hook registration(s) in ${E(l)}`);
|
|
253
228
|
}
|
|
254
229
|
}
|
|
255
230
|
//#endregion
|
|
256
231
|
//#region src/cli/index.ts
|
|
257
232
|
function Z() {
|
|
258
|
-
return new
|
|
233
|
+
return new te("--harness <harness>", "claude, codex, or all").choices(w);
|
|
259
234
|
}
|
|
260
|
-
async function
|
|
261
|
-
if (t) return
|
|
262
|
-
let r =
|
|
263
|
-
if (r && !n) return
|
|
235
|
+
async function fe(e, t, n) {
|
|
236
|
+
if (t) return v.log.info(`Harness from --harness flag: ${t.join(", ")}`), t;
|
|
237
|
+
let r = L(e);
|
|
238
|
+
if (r && !n) return v.log.info(`Refreshing the existing install: ${r.join(", ")} — pass --reconfigure to choose differently.`), r;
|
|
264
239
|
if (!process.stdin.isTTY) return console.error("Pass --harness=claude|codex|all — no terminal to prompt in."), process.exitCode = 1, null;
|
|
265
|
-
let i = await
|
|
240
|
+
let i = await v.multiselect({
|
|
266
241
|
message: "Install into which harness (or harnesses)?",
|
|
267
|
-
options:
|
|
242
|
+
options: C.map((e) => ({
|
|
268
243
|
value: e,
|
|
269
|
-
label:
|
|
244
|
+
label: y.harnesses[e].label
|
|
270
245
|
})),
|
|
271
246
|
required: !0
|
|
272
247
|
});
|
|
273
|
-
return
|
|
248
|
+
return v.isCancel(i) ? (v.cancel("Cancelled — nothing installed."), null) : i;
|
|
274
249
|
}
|
|
275
|
-
async function
|
|
276
|
-
let t = e.harness ?
|
|
277
|
-
if (
|
|
278
|
-
|
|
250
|
+
async function pe(e) {
|
|
251
|
+
let t = e.harness ? T(e.harness) : null, n = I();
|
|
252
|
+
if (v.intro(`@imfusion/web-ui install skills — ${String(n.length)} skills`), n.length === 0) {
|
|
253
|
+
v.log.error("No skills found. Reinstall @imfusion/web-ui and try again."), v.outro("Nothing installed."), process.exitCode = 1;
|
|
279
254
|
return;
|
|
280
255
|
}
|
|
281
|
-
let r = await
|
|
256
|
+
let r = await fe(n, t, e.reconfigure === !0);
|
|
282
257
|
if (!r) return;
|
|
283
|
-
|
|
258
|
+
v.log.message(`Skills in this bundle:\n${n.map((e) => ` - ${e}`).join("\n")}`);
|
|
284
259
|
try {
|
|
285
|
-
|
|
260
|
+
se(n, r);
|
|
286
261
|
} catch (e) {
|
|
287
|
-
if (e instanceof
|
|
288
|
-
|
|
262
|
+
if (e instanceof M) {
|
|
263
|
+
v.log.error(e.message), v.outro("Install failed."), process.exitCode = 1;
|
|
289
264
|
return;
|
|
290
265
|
}
|
|
291
266
|
throw e;
|
|
292
267
|
}
|
|
293
|
-
let i =
|
|
294
|
-
(i === "updated" || i === "added") &&
|
|
268
|
+
let i = ie();
|
|
269
|
+
(i === "updated" || i === "added") && v.log.success(`Refreshed the ${y.namespace} block in ./AGENTS.md`), v.outro(`Done — ${String(n.length)} skills installed.`);
|
|
295
270
|
}
|
|
296
|
-
function
|
|
297
|
-
let t = e.harness ?
|
|
271
|
+
function me(e) {
|
|
272
|
+
let t = e.harness ? T(e.harness) : null, n = L(I());
|
|
298
273
|
if (!t && !n) {
|
|
299
274
|
console.error("No harness recorded. Pass --harness=claude|codex|all."), process.exitCode = 1;
|
|
300
275
|
return;
|
|
@@ -305,9 +280,9 @@ function _e(e) {
|
|
|
305
280
|
process.exitCode = 1;
|
|
306
281
|
return;
|
|
307
282
|
}
|
|
308
|
-
|
|
283
|
+
v.intro("@imfusion/web-ui install hooks");
|
|
309
284
|
try {
|
|
310
|
-
|
|
285
|
+
de(r);
|
|
311
286
|
} catch (e) {
|
|
312
287
|
if (e instanceof U) {
|
|
313
288
|
console.error(e.message), process.exitCode = 1;
|
|
@@ -315,12 +290,12 @@ function _e(e) {
|
|
|
315
290
|
}
|
|
316
291
|
throw e;
|
|
317
292
|
}
|
|
318
|
-
|
|
293
|
+
v.outro("Done — agent hooks installed.");
|
|
319
294
|
}
|
|
320
|
-
var Q = new
|
|
321
|
-
Q.name("web-ui").description("Command-line tools for @imfusion/web-ui").version(
|
|
295
|
+
var Q = new ee();
|
|
296
|
+
Q.name("web-ui").description("Command-line tools for @imfusion/web-ui").version(P);
|
|
322
297
|
var $ = Q.command("install").description("Install @imfusion/web-ui agent skills or hooks into a project");
|
|
323
|
-
$.command("skills").description("Install skills for the chosen harness").addOption(Z()).option("--reconfigure", "Re-open the harness selection prompt on an existing install").action(
|
|
298
|
+
$.command("skills").description("Install skills for the chosen harness").addOption(Z()).option("--reconfigure", "Re-open the harness selection prompt on an existing install").action(pe), $.command("hooks").description("Install agent lifecycle hooks (requires skills already installed for the harness)").addOption(Z()).action(me), $.action(() => {
|
|
324
299
|
$.help();
|
|
325
300
|
}), Q.action(() => {
|
|
326
301
|
Q.help();
|
|
@@ -17,7 +17,7 @@ import doc from "../../CHANGELOG.md?raw";
|
|
|
17
17
|
h4: <Typo.H3 variant="primary" />,
|
|
18
18
|
p: <DocParagraph variant="primary" />,
|
|
19
19
|
ul: <Typo.UnorderedList variant="primary" />,
|
|
20
|
-
hr: <Separator
|
|
20
|
+
hr: <Separator variant="dashed" />
|
|
21
21
|
}}
|
|
22
22
|
>
|
|
23
23
|
{doc}
|