devframe 0.6.2 → 0.7.2
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/dist/adapters/build.d.mts +1 -2
- package/dist/adapters/build.mjs +1 -1
- package/dist/adapters/cac.d.mts +40 -0
- package/dist/adapters/cac.mjs +2 -0
- package/dist/adapters/cli.d.mts +8 -32
- package/dist/adapters/cli.mjs +3 -143
- package/dist/adapters/dev.d.mts +3 -4
- package/dist/adapters/dev.mjs +1 -1
- package/dist/adapters/embedded.d.mts +1 -2
- package/dist/adapters/mcp.d.mts +2 -1
- package/dist/adapters/mcp.mjs +1 -1
- package/dist/{build-server-0jWgMrz-.mjs → build-server-Bo0G5XcS.mjs} +10 -4
- package/dist/cac-BFCgKymz.mjs +152 -0
- package/dist/client/index.d.mts +90 -6
- package/dist/client/index.mjs +150 -8
- package/dist/{context-DgkYTlXx.d.mts → context-B1sekkgB.d.mts} +3 -3
- package/dist/{dev-DE51PeJc.mjs → dev-Bs4oRVnI.mjs} +2 -2
- package/dist/{devframe-CpXy1ZlO.d.mts → devframe-CnTVuGw9.d.mts} +76 -16
- package/dist/{dump-D09PZb7T.mjs → dump-CocOVBVz.mjs} +3 -1
- package/dist/{hash-PAfnyu2k.mjs → hash-KtDZYXDN.mjs} +5 -2
- package/dist/helpers/vite.d.mts +7 -5
- package/dist/helpers/vite.mjs +2 -2
- package/dist/{http-COX960WK.mjs → http-BirzlyE9.mjs} +1 -1
- package/dist/{index-DI_TMGjv.d.mts → index-DgsLFhZg.d.mts} +2 -3
- package/dist/{index-DzeFcwMM.d.mts → index-Dpsr-8dD.d.mts} +4 -4
- package/dist/{index-BAZpbgHu.d.mts → index-YDSJgsyG.d.mts} +1 -2
- package/dist/index.d.mts +5 -5
- package/dist/{launch-editor-DIzaS5EG.mjs → launch-editor-C_xuzLnF.mjs} +67 -16
- package/dist/node/auth.d.mts +1 -1
- package/dist/node/hub-internals.d.mts +2 -3
- package/dist/node/index.d.mts +5 -6
- package/dist/recipes/interactive-auth.d.mts +2 -3
- package/dist/recipes/interactive-auth.mjs +1 -0
- package/dist/recipes/open-helpers.d.mts +3 -2
- package/dist/recipes/open-helpers.mjs +1 -1
- package/dist/rpc/client.d.mts +0 -1
- package/dist/rpc/dump.d.mts +1 -1
- package/dist/rpc/dump.mjs +1 -1
- package/dist/rpc/index.d.mts +2 -2
- package/dist/rpc/index.mjs +1 -1
- package/dist/rpc/server.d.mts +0 -1
- package/dist/rpc/transports/ws-client.d.mts +1 -1
- package/dist/rpc/transports/ws-server.d.mts +1 -1
- package/dist/{server-C83NJvZp.d.mts → server-4QH37sb-.d.mts} +2 -3
- package/dist/types/index.d.mts +4 -4
- package/dist/{types-oEqKqUC9.d.mts → types-CrzNxXKq.d.mts} +42 -23
- package/dist/utils/events.d.mts +1 -2
- package/dist/utils/hash.mjs +1 -1
- package/dist/utils/launch-editor.mjs +1 -1
- package/dist/utils/serve-static.d.mts +0 -1
- package/dist/utils/shared-state.d.mts +1 -1
- package/dist/utils/streaming-channel.d.mts +1 -1
- package/dist/utils/when.d.mts +1 -330
- package/dist/{ws-client-nBjpin71.d.mts → ws-client-DSXiI2h7.d.mts} +1 -2
- package/dist/{ws-server-BUgJpdX4.d.mts → ws-server-CceOy6He.d.mts} +1 -2
- package/package.json +11 -6
- package/skills/devframe/SKILL.md +4 -4
package/dist/utils/when.d.mts
CHANGED
|
@@ -1,333 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/paths.d.ts
|
|
3
|
-
/**
|
|
4
|
-
* Union of valid context paths for `T` — both flat keys (`keyof T`) and
|
|
5
|
-
* `.`/`:`-separated nested paths. Mirrors the runtime `resolve()` lookup:
|
|
6
|
-
* first a flat literal key, then a segmented path.
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* type P = ContextPaths<{ editor: { lang: string }, debug: boolean }>
|
|
10
|
-
* // 'editor' | 'debug' | 'editor.lang' | 'editor:lang'
|
|
11
|
-
*/
|
|
12
|
-
type ContextPaths<T, P extends string = ''> = { [K in keyof T & string]: `${P}${K}` | (T[K] extends readonly unknown[] ? never : T[K] extends ((...args: never[]) => unknown) ? never : T[K] extends object ? ContextPaths<T[K], `${P}${K}.`> | ContextPaths<T[K], `${P}${K}:`> : never) }[keyof T & string]; //#endregion
|
|
13
|
-
//#region src/types.d.ts
|
|
14
|
-
/**
|
|
15
|
-
* Branded error type surfaced at the call site of `evaluateWhen` when the
|
|
16
|
-
* expression string fails static validation. The embedded message appears in
|
|
17
|
-
* the TS error tooltip because `WhenExpressionError<M>` is not assignable from a
|
|
18
|
-
* plain string literal.
|
|
19
|
-
*/
|
|
20
|
-
type WhenExpressionError<M extends string> = string & {
|
|
21
|
-
readonly __whenExpressionError: M;
|
|
22
|
-
};
|
|
23
|
-
type Ws = ' ' | '\t' | '\n' | '\r';
|
|
24
|
-
type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
|
|
25
|
-
type Lower = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
|
|
26
|
-
type Upper = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z';
|
|
27
|
-
type IdentStart = Lower | Upper | '_' | '$';
|
|
28
|
-
type IdentCont = IdentStart | Digit | '.' | ':';
|
|
29
|
-
type Op = '===' | '!==' | '==' | '!=' | '<=' | '>=' | '&&' | '||' | '<' | '>' | '+' | '-' | '*' | '/' | '%' | '!';
|
|
30
|
-
type Tok = {
|
|
31
|
-
k: 'num';
|
|
32
|
-
v: string;
|
|
33
|
-
} | {
|
|
34
|
-
k: 'str';
|
|
35
|
-
v: string;
|
|
36
|
-
} | {
|
|
37
|
-
k: 'id';
|
|
38
|
-
v: string;
|
|
39
|
-
} | {
|
|
40
|
-
k: 'bool';
|
|
41
|
-
v: 'true' | 'false';
|
|
42
|
-
} | {
|
|
43
|
-
k: 'op';
|
|
44
|
-
v: Op;
|
|
45
|
-
} | {
|
|
46
|
-
k: 'lp';
|
|
47
|
-
} | {
|
|
48
|
-
k: 'rp';
|
|
49
|
-
} | {
|
|
50
|
-
k: 'eof';
|
|
51
|
-
};
|
|
52
|
-
interface TokErr {
|
|
53
|
-
__err: string;
|
|
54
|
-
}
|
|
55
|
-
type Tokenize<S extends string, Acc extends Tok[] = []> = S extends '' ? [...Acc, {
|
|
56
|
-
k: 'eof';
|
|
57
|
-
}] : S extends `${Ws}${infer R}` ? Tokenize<R, Acc> : S extends `===${infer R}` ? Tokenize<R, [...Acc, {
|
|
58
|
-
k: 'op';
|
|
59
|
-
v: '===';
|
|
60
|
-
}]> : S extends `!==${infer R}` ? Tokenize<R, [...Acc, {
|
|
61
|
-
k: 'op';
|
|
62
|
-
v: '!==';
|
|
63
|
-
}]> : S extends `==${infer R}` ? Tokenize<R, [...Acc, {
|
|
64
|
-
k: 'op';
|
|
65
|
-
v: '==';
|
|
66
|
-
}]> : S extends `!=${infer R}` ? Tokenize<R, [...Acc, {
|
|
67
|
-
k: 'op';
|
|
68
|
-
v: '!=';
|
|
69
|
-
}]> : S extends `<=${infer R}` ? Tokenize<R, [...Acc, {
|
|
70
|
-
k: 'op';
|
|
71
|
-
v: '<=';
|
|
72
|
-
}]> : S extends `>=${infer R}` ? Tokenize<R, [...Acc, {
|
|
73
|
-
k: 'op';
|
|
74
|
-
v: '>=';
|
|
75
|
-
}]> : S extends `&&${infer R}` ? Tokenize<R, [...Acc, {
|
|
76
|
-
k: 'op';
|
|
77
|
-
v: '&&';
|
|
78
|
-
}]> : S extends `||${infer R}` ? Tokenize<R, [...Acc, {
|
|
79
|
-
k: 'op';
|
|
80
|
-
v: '||';
|
|
81
|
-
}]> : S extends `<${infer R}` ? Tokenize<R, [...Acc, {
|
|
82
|
-
k: 'op';
|
|
83
|
-
v: '<';
|
|
84
|
-
}]> : S extends `>${infer R}` ? Tokenize<R, [...Acc, {
|
|
85
|
-
k: 'op';
|
|
86
|
-
v: '>';
|
|
87
|
-
}]> : S extends `+${infer R}` ? Tokenize<R, [...Acc, {
|
|
88
|
-
k: 'op';
|
|
89
|
-
v: '+';
|
|
90
|
-
}]> : S extends `-${infer R}` ? Tokenize<R, [...Acc, {
|
|
91
|
-
k: 'op';
|
|
92
|
-
v: '-';
|
|
93
|
-
}]> : S extends `*${infer R}` ? Tokenize<R, [...Acc, {
|
|
94
|
-
k: 'op';
|
|
95
|
-
v: '*';
|
|
96
|
-
}]> : S extends `/${infer R}` ? Tokenize<R, [...Acc, {
|
|
97
|
-
k: 'op';
|
|
98
|
-
v: '/';
|
|
99
|
-
}]> : S extends `%${infer R}` ? Tokenize<R, [...Acc, {
|
|
100
|
-
k: 'op';
|
|
101
|
-
v: '%';
|
|
102
|
-
}]> : S extends `!${infer R}` ? Tokenize<R, [...Acc, {
|
|
103
|
-
k: 'op';
|
|
104
|
-
v: '!';
|
|
105
|
-
}]> : S extends `(${infer R}` ? Tokenize<R, [...Acc, {
|
|
106
|
-
k: 'lp';
|
|
107
|
-
}]> : S extends `)${infer R}` ? Tokenize<R, [...Acc, {
|
|
108
|
-
k: 'rp';
|
|
109
|
-
}]> : S extends `"${infer R}` ? ConsumeStr<R, '', '"', Acc> : S extends `'${infer R}` ? ConsumeStr<R, '', '\'', Acc> : S extends `${infer C extends Digit}${infer R}` ? ConsumeNum<R, C, Acc> : S extends `${infer C extends IdentStart}${infer R}` ? ConsumeIdent<R, C, Acc> : {
|
|
110
|
-
__err: `Unexpected character in "${S}"`;
|
|
111
|
-
};
|
|
112
|
-
type ConsumeNum<S extends string, N extends string, Acc extends Tok[]> = S extends `${infer C extends Digit}${infer R}` ? ConsumeNum<R, `${N}${C}`, Acc> : S extends `.${infer C extends Digit}${infer R}` ? ConsumeNumFrac<R, `${N}.${C}`, Acc> : Tokenize<S, [...Acc, {
|
|
113
|
-
k: 'num';
|
|
114
|
-
v: N;
|
|
115
|
-
}]>;
|
|
116
|
-
type ConsumeNumFrac<S extends string, N extends string, Acc extends Tok[]> = S extends `${infer C extends Digit}${infer R}` ? ConsumeNumFrac<R, `${N}${C}`, Acc> : Tokenize<S, [...Acc, {
|
|
117
|
-
k: 'num';
|
|
118
|
-
v: N;
|
|
119
|
-
}]>;
|
|
120
|
-
type ConsumeIdent<S extends string, N extends string, Acc extends Tok[]> = S extends `${infer C extends IdentCont}${infer R}` ? ConsumeIdent<R, `${N}${C}`, Acc> : Tokenize<S, [...Acc, ClassifyIdent<N>]>;
|
|
121
|
-
type ClassifyIdent<N extends string> = N extends 'true' ? {
|
|
122
|
-
k: 'bool';
|
|
123
|
-
v: 'true';
|
|
124
|
-
} : N extends 'false' ? {
|
|
125
|
-
k: 'bool';
|
|
126
|
-
v: 'false';
|
|
127
|
-
} : {
|
|
128
|
-
k: 'id';
|
|
129
|
-
v: N;
|
|
130
|
-
};
|
|
131
|
-
type ConsumeStr<S extends string, V extends string, Q extends '"' | '\'', Acc extends Tok[]> = S extends `${Q}${infer R}` ? Tokenize<R, [...Acc, {
|
|
132
|
-
k: 'str';
|
|
133
|
-
v: V;
|
|
134
|
-
}]> : S extends `\\${infer C}${infer R}` ? ConsumeStr<R, `${V}${C}`, Q, Acc> : S extends `${infer C}${infer R}` ? ConsumeStr<R, `${V}${C}`, Q, Acc> : {
|
|
135
|
-
__err: 'Unterminated string literal';
|
|
136
|
-
};
|
|
137
|
-
type BinOp = '||' | '&&' | '==' | '!=' | '===' | '!==' | '<' | '>' | '<=' | '>=' | '+' | '-' | '*' | '/' | '%';
|
|
138
|
-
type UnOp = '!' | '-' | '+';
|
|
139
|
-
interface LitNode {
|
|
140
|
-
t: 'lit';
|
|
141
|
-
v: string;
|
|
142
|
-
}
|
|
143
|
-
interface KeyNode {
|
|
144
|
-
t: 'key';
|
|
145
|
-
v: string;
|
|
146
|
-
}
|
|
147
|
-
interface UnNode {
|
|
148
|
-
t: 'un';
|
|
149
|
-
op: UnOp;
|
|
150
|
-
x: Ast;
|
|
151
|
-
}
|
|
152
|
-
interface BinNode {
|
|
153
|
-
t: 'bin';
|
|
154
|
-
op: BinOp;
|
|
155
|
-
l: Ast;
|
|
156
|
-
r: Ast;
|
|
157
|
-
}
|
|
158
|
-
type Ast = LitNode | KeyNode | UnNode | BinNode;
|
|
159
|
-
type Parse<Toks extends Tok[]> = ParseOr<Toks>;
|
|
160
|
-
type ParseOr<T extends Tok[]> = OrTail<ParseAnd<T>>;
|
|
161
|
-
type OrTail<R> = R extends [infer L extends Ast, infer Rest extends Tok[]] ? Rest extends [{
|
|
162
|
-
k: 'op';
|
|
163
|
-
v: '||';
|
|
164
|
-
}, ...infer After extends Tok[]] ? ParseAnd<After> extends [infer Rh extends Ast, infer Next extends Tok[]] ? OrTail<[{
|
|
165
|
-
t: 'bin';
|
|
166
|
-
op: '||';
|
|
167
|
-
l: L;
|
|
168
|
-
r: Rh;
|
|
169
|
-
}, Next]> : 'err' : R : R;
|
|
170
|
-
type ParseAnd<T extends Tok[]> = AndTail<ParseEq<T>>;
|
|
171
|
-
type AndTail<R> = R extends [infer L extends Ast, infer Rest extends Tok[]] ? Rest extends [{
|
|
172
|
-
k: 'op';
|
|
173
|
-
v: '&&';
|
|
174
|
-
}, ...infer After extends Tok[]] ? ParseEq<After> extends [infer Rh extends Ast, infer Next extends Tok[]] ? AndTail<[{
|
|
175
|
-
t: 'bin';
|
|
176
|
-
op: '&&';
|
|
177
|
-
l: L;
|
|
178
|
-
r: Rh;
|
|
179
|
-
}, Next]> : 'err' : R : R;
|
|
180
|
-
type ParseEq<T extends Tok[]> = EqTail<ParseRel<T>>;
|
|
181
|
-
type EqTail<R> = R extends [infer L extends Ast, infer Rest extends Tok[]] ? Rest extends [{
|
|
182
|
-
k: 'op';
|
|
183
|
-
v: infer O extends '==' | '!=';
|
|
184
|
-
}, ...infer After extends Tok[]] ? ParseValueRhs<After> extends [infer Rh extends Ast, infer Next extends Tok[]] ? EqTail<[{
|
|
185
|
-
t: 'bin';
|
|
186
|
-
op: O;
|
|
187
|
-
l: L;
|
|
188
|
-
r: Rh;
|
|
189
|
-
}, Next]> : 'err' : Rest extends [{
|
|
190
|
-
k: 'op';
|
|
191
|
-
v: infer O extends '===' | '!==';
|
|
192
|
-
}, ...infer After extends Tok[]] ? ParseRel<After> extends [infer Rh extends Ast, infer Next extends Tok[]] ? EqTail<[{
|
|
193
|
-
t: 'bin';
|
|
194
|
-
op: O;
|
|
195
|
-
l: L;
|
|
196
|
-
r: Rh;
|
|
197
|
-
}, Next]> : 'err' : R : R;
|
|
198
|
-
type ParseValueRhs<T extends Tok[]> = T extends [{
|
|
199
|
-
k: 'id';
|
|
200
|
-
v: infer V extends string;
|
|
201
|
-
}, ...infer R extends Tok[]] ? [{
|
|
202
|
-
t: 'lit';
|
|
203
|
-
v: V;
|
|
204
|
-
}, R] : T extends [{
|
|
205
|
-
k: 'str';
|
|
206
|
-
v: infer V extends string;
|
|
207
|
-
}, ...infer R extends Tok[]] ? [{
|
|
208
|
-
t: 'lit';
|
|
209
|
-
v: V;
|
|
210
|
-
}, R] : T extends [{
|
|
211
|
-
k: 'num';
|
|
212
|
-
v: infer V extends string;
|
|
213
|
-
}, ...infer R extends Tok[]] ? [{
|
|
214
|
-
t: 'lit';
|
|
215
|
-
v: V;
|
|
216
|
-
}, R] : T extends [{
|
|
217
|
-
k: 'bool';
|
|
218
|
-
v: infer V extends string;
|
|
219
|
-
}, ...infer R extends Tok[]] ? [{
|
|
220
|
-
t: 'lit';
|
|
221
|
-
v: V;
|
|
222
|
-
}, R] : 'err';
|
|
223
|
-
type ParseRel<T extends Tok[]> = RelTail<ParseAdd<T>>;
|
|
224
|
-
type RelTail<R> = R extends [infer L extends Ast, infer Rest extends Tok[]] ? Rest extends [{
|
|
225
|
-
k: 'op';
|
|
226
|
-
v: infer O extends '<=' | '>=' | '<' | '>';
|
|
227
|
-
}, ...infer After extends Tok[]] ? ParseAdd<After> extends [infer Rh extends Ast, infer Next extends Tok[]] ? RelTail<[{
|
|
228
|
-
t: 'bin';
|
|
229
|
-
op: O;
|
|
230
|
-
l: L;
|
|
231
|
-
r: Rh;
|
|
232
|
-
}, Next]> : 'err' : R : R;
|
|
233
|
-
type ParseAdd<T extends Tok[]> = AddTail<ParseMul<T>>;
|
|
234
|
-
type AddTail<R> = R extends [infer L extends Ast, infer Rest extends Tok[]] ? Rest extends [{
|
|
235
|
-
k: 'op';
|
|
236
|
-
v: infer O extends '+' | '-';
|
|
237
|
-
}, ...infer After extends Tok[]] ? ParseMul<After> extends [infer Rh extends Ast, infer Next extends Tok[]] ? AddTail<[{
|
|
238
|
-
t: 'bin';
|
|
239
|
-
op: O;
|
|
240
|
-
l: L;
|
|
241
|
-
r: Rh;
|
|
242
|
-
}, Next]> : 'err' : R : R;
|
|
243
|
-
type ParseMul<T extends Tok[]> = MulTail<ParseUnary<T>>;
|
|
244
|
-
type MulTail<R> = R extends [infer L extends Ast, infer Rest extends Tok[]] ? Rest extends [{
|
|
245
|
-
k: 'op';
|
|
246
|
-
v: infer O extends '*' | '/' | '%';
|
|
247
|
-
}, ...infer After extends Tok[]] ? ParseUnary<After> extends [infer Rh extends Ast, infer Next extends Tok[]] ? MulTail<[{
|
|
248
|
-
t: 'bin';
|
|
249
|
-
op: O;
|
|
250
|
-
l: L;
|
|
251
|
-
r: Rh;
|
|
252
|
-
}, Next]> : 'err' : R : R;
|
|
253
|
-
type ParseUnary<T extends Tok[]> = T extends [{
|
|
254
|
-
k: 'op';
|
|
255
|
-
v: infer O extends UnOp;
|
|
256
|
-
}, ...infer Rest extends Tok[]] ? ParseUnary<Rest> extends [infer X extends Ast, infer Next extends Tok[]] ? [{
|
|
257
|
-
t: 'un';
|
|
258
|
-
op: O;
|
|
259
|
-
x: X;
|
|
260
|
-
}, Next] : 'err' : ParsePrimary<T>;
|
|
261
|
-
type ParsePrimary<T extends Tok[]> = T extends [{
|
|
262
|
-
k: 'num';
|
|
263
|
-
v: infer V extends string;
|
|
264
|
-
}, ...infer R extends Tok[]] ? [{
|
|
265
|
-
t: 'lit';
|
|
266
|
-
v: V;
|
|
267
|
-
}, R] : T extends [{
|
|
268
|
-
k: 'str';
|
|
269
|
-
v: infer V extends string;
|
|
270
|
-
}, ...infer R extends Tok[]] ? [{
|
|
271
|
-
t: 'lit';
|
|
272
|
-
v: V;
|
|
273
|
-
}, R] : T extends [{
|
|
274
|
-
k: 'bool';
|
|
275
|
-
v: infer V extends string;
|
|
276
|
-
}, ...infer R extends Tok[]] ? [{
|
|
277
|
-
t: 'lit';
|
|
278
|
-
v: V;
|
|
279
|
-
}, R] : T extends [{
|
|
280
|
-
k: 'id';
|
|
281
|
-
v: infer V extends string;
|
|
282
|
-
}, ...infer R extends Tok[]] ? [{
|
|
283
|
-
t: 'key';
|
|
284
|
-
v: V;
|
|
285
|
-
}, R] : T extends [{
|
|
286
|
-
k: 'lp';
|
|
287
|
-
}, ...infer Rest extends Tok[]] ? ParseOr<Rest> extends [infer N extends Ast, infer After extends Tok[]] ? After extends [{
|
|
288
|
-
k: 'rp';
|
|
289
|
-
}, ...infer Next extends Tok[]] ? [N, Next] : 'err' : 'err' : 'err';
|
|
290
|
-
type CollectKeys<N> = N extends KeyNode ? N['v'] : N extends UnNode ? CollectKeys<N['x']> : N extends {
|
|
291
|
-
t: 'bin';
|
|
292
|
-
op: '==' | '!=';
|
|
293
|
-
l: infer L;
|
|
294
|
-
} ? CollectKeys<L> : N extends BinNode ? CollectKeys<N['l']> | CollectKeys<N['r']> : never;
|
|
295
|
-
/**
|
|
296
|
-
* Validate a when-clause expression string `S` against context type `T`.
|
|
297
|
-
* Returns `S` on success, or a `WhenExpressionError<Msg>` branded error string
|
|
298
|
-
* that surfaces at the call site with a human-readable message.
|
|
299
|
-
*
|
|
300
|
-
* - Dynamic `string` expressions skip all validation.
|
|
301
|
-
* - Wide context types (`object`, `any`, `unknown`, `Record<string, unknown>`,
|
|
302
|
-
* empty `{}`, etc.) still run **syntax** checking but skip **key** checking.
|
|
303
|
-
* - Specific context types run full validation (syntax + keys).
|
|
304
|
-
*/
|
|
305
|
-
type ValidateExpression<S extends string, T> = string extends S ? S : Tokenize<S> extends infer Toks ? Toks extends TokErr ? WhenExpressionError<`Syntax error: ${Toks['__err']}`> : Toks extends Tok[] ? Parse<Toks> extends [infer N extends Ast, [{
|
|
306
|
-
k: 'eof';
|
|
307
|
-
}]] ? [keyof T] extends [never] ? S : string extends keyof T ? S : Exclude<CollectKeys<N>, ContextPaths<T>> extends infer Missing ? [Missing] extends [never] ? S : WhenExpressionError<`Unknown context key: "${Extract<Missing, string>}"`> : never : WhenExpressionError<'Syntax error in expression'> : never : never;
|
|
308
|
-
/**
|
|
309
|
-
* A when-clause expression string validated against context type `T`.
|
|
310
|
-
* Use inside your own typed define helpers to have TypeScript check `when`
|
|
311
|
-
* fields at the call site.
|
|
312
|
-
*
|
|
313
|
-
* @example
|
|
314
|
-
* interface AppCtx { mode: 'dev' | 'prod', debug: boolean }
|
|
315
|
-
*
|
|
316
|
-
* function defineCommand<const W extends string>(cmd: {
|
|
317
|
-
* name: string
|
|
318
|
-
* title: string
|
|
319
|
-
* when?: WhenExpression<AppCtx, W>
|
|
320
|
-
* }): typeof cmd {
|
|
321
|
-
* return cmd
|
|
322
|
-
* }
|
|
323
|
-
*
|
|
324
|
-
* defineCommand({ name: 'x', title: 'X', when: 'debug && mode == dev' })
|
|
325
|
-
* defineCommand({ name: 'x', title: 'X', when: 'typo' })
|
|
326
|
-
* // ^^^^^ type error
|
|
327
|
-
*/
|
|
328
|
-
type WhenExpression$1<T, S extends string> = S & ValidateExpression<S, T>; //#endregion
|
|
329
|
-
//#region src/index.d.ts
|
|
330
|
-
//#endregion
|
|
1
|
+
import { WhenExpression as WhenExpression$1 } from "whenexpr";
|
|
331
2
|
//#region src/utils/when.d.ts
|
|
332
3
|
/**
|
|
333
4
|
* Context object for evaluating `when` expressions.
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { v as RpcFunctionDefinitionAny } from "./types-
|
|
1
|
+
import { v as RpcFunctionDefinitionAny } from "./types-CrzNxXKq.mjs";
|
|
2
2
|
import { ChannelOptions } from "birpc";
|
|
3
|
-
|
|
4
3
|
//#region src/rpc/transports/ws-client.d.ts
|
|
5
4
|
interface WsRpcChannelOptions {
|
|
6
5
|
url: string;
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { v as RpcFunctionDefinitionAny } from "./types-
|
|
1
|
+
import { v as RpcFunctionDefinitionAny } from "./types-CrzNxXKq.mjs";
|
|
2
2
|
import { BirpcGroup, ChannelOptions } from "birpc";
|
|
3
3
|
import { Peer } from "crossws";
|
|
4
4
|
import { NodeAdapter } from "crossws/adapters/node";
|
|
5
5
|
import { Server } from "node:http";
|
|
6
6
|
import { Server as Server$1, ServerOptions } from "node:https";
|
|
7
|
-
|
|
8
7
|
//#region src/rpc/transports/ws-server.d.ts
|
|
9
8
|
interface DevframeNodeRpcSessionMeta {
|
|
10
9
|
id: number;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devframe",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.7.2",
|
|
5
5
|
"description": "Framework for building generic devframes",
|
|
6
6
|
"author": "Anthony Fu <anthonyfu117@hotmail.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"exports": {
|
|
22
22
|
".": "./dist/index.mjs",
|
|
23
23
|
"./adapters/build": "./dist/adapters/build.mjs",
|
|
24
|
+
"./adapters/cac": "./dist/adapters/cac.mjs",
|
|
24
25
|
"./adapters/cli": "./dist/adapters/cli.mjs",
|
|
25
26
|
"./adapters/dev": "./dist/adapters/dev.mjs",
|
|
26
27
|
"./adapters/embedded": "./dist/adapters/embedded.mjs",
|
|
@@ -62,18 +63,21 @@
|
|
|
62
63
|
"skills"
|
|
63
64
|
],
|
|
64
65
|
"peerDependencies": {
|
|
65
|
-
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
66
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
67
|
+
"cac": "^7.0.0"
|
|
66
68
|
},
|
|
67
69
|
"peerDependenciesMeta": {
|
|
68
70
|
"@modelcontextprotocol/sdk": {
|
|
69
71
|
"optional": true
|
|
72
|
+
},
|
|
73
|
+
"cac": {
|
|
74
|
+
"optional": true
|
|
70
75
|
}
|
|
71
76
|
},
|
|
72
77
|
"dependencies": {
|
|
73
78
|
"@valibot/to-json-schema": "^1.7.1",
|
|
74
79
|
"birpc": "^4.0.0",
|
|
75
|
-
"
|
|
76
|
-
"crossws": "^0.4.9",
|
|
80
|
+
"crossws": "^0.4.10",
|
|
77
81
|
"destr": "^2.0.5",
|
|
78
82
|
"h3": "2.0.1-rc.22",
|
|
79
83
|
"mrmime": "^2.0.1",
|
|
@@ -84,6 +88,7 @@
|
|
|
84
88
|
},
|
|
85
89
|
"devDependencies": {
|
|
86
90
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
91
|
+
"cac": "^7.0.0",
|
|
87
92
|
"get-port-please": "^3.2.0",
|
|
88
93
|
"immer": "^11.1.11",
|
|
89
94
|
"launch-editor": "^2.14.1",
|
|
@@ -95,10 +100,10 @@
|
|
|
95
100
|
"perfect-debounce": "^2.1.0",
|
|
96
101
|
"structured-clone-es": "^2.0.0",
|
|
97
102
|
"tinyglobby": "^0.2.17",
|
|
98
|
-
"tsdown": "^0.22.
|
|
103
|
+
"tsdown": "^0.22.7",
|
|
99
104
|
"ua-parser-modern": "^0.1.1",
|
|
100
105
|
"whenexpr": "^0.1.2",
|
|
101
|
-
"ws": "^8.21.
|
|
106
|
+
"ws": "^8.21.1"
|
|
102
107
|
},
|
|
103
108
|
"inlinedDependencies": {
|
|
104
109
|
"bundle-name": "4.1.0",
|
package/skills/devframe/SKILL.md
CHANGED
|
@@ -11,7 +11,7 @@ description: >
|
|
|
11
11
|
terminals, palette, etc.), the devframe can be mounted into a
|
|
12
12
|
host that provides them — Vite DevTools is one supported target,
|
|
13
13
|
reached via the `vite` adapter. Triggers on `devframe` imports,
|
|
14
|
-
`defineDevframe`, `
|
|
14
|
+
`defineDevframe`, `createCac`, `createMcpServer`,
|
|
15
15
|
`connectDevframe`, and on migrations of existing inspectors
|
|
16
16
|
(eslint-config-inspector, unocss-inspector,
|
|
17
17
|
node-modules-inspector-style tools) to devframe.
|
|
@@ -31,7 +31,7 @@ All adapter factories share the shape `createXxx(devframeDef, options?)`.
|
|
|
31
31
|
|
|
32
32
|
| Author goal | Factory | Entry |
|
|
33
33
|
|-------------|---------|-------|
|
|
34
|
-
| Standalone CLI for local use | `
|
|
34
|
+
| Standalone CLI for local use | `createCac(def, options?)` | `devframe/adapters/cac` |
|
|
35
35
|
| Run the dev server programmatically (any CLI framework) | `createDevServer(def, options?)` | `devframe/adapters/dev` |
|
|
36
36
|
| Self-contained static deploy with baked data | `createBuild(def, options?)` | `devframe/adapters/build` |
|
|
37
37
|
| Mount into a host (Vite DevTools or any compatible host) | `createPluginFromDevframe(def, options?)` | `@vitejs/devtools-kit/node` |
|
|
@@ -530,7 +530,7 @@ At runtime, static clients look up the argument hash in the dump; misses resolve
|
|
|
530
530
|
|
|
531
531
|
## CLI adapter subcommands
|
|
532
532
|
|
|
533
|
-
`
|
|
533
|
+
`createCac(devframe).parse()` gives the tool four subcommands out of the box:
|
|
534
534
|
|
|
535
535
|
| Subcommand | Action |
|
|
536
536
|
|------------|--------|
|
|
@@ -539,7 +539,7 @@ At runtime, static clients look up the argument hash in the dump; misses resolve
|
|
|
539
539
|
| `spa` | Deployable SPA → `./dist-spa/` |
|
|
540
540
|
| `mcp` | stdio MCP server (experimental) |
|
|
541
541
|
|
|
542
|
-
**Bring your own CLI framework?** `
|
|
542
|
+
**Bring your own CLI framework?** `createCac` (`devframe/adapters/cac`) is just a cac wrapper around three peer factories — `createDevServer` (`devframe/adapters/dev`), `createBuild` (`devframe/adapters/build`), and `createMcpServer` (`devframe/adapters/mcp`). Use them directly with commander/yargs/oclif when `createCac`'s baked-in command structure doesn't fit. `cac` is an optional peer dependency pulled in only through `devframe/adapters/cac`, so bring-your-own-CLI tools run without installing it. (The legacy `devframe/adapters/cli` entry / `createCli` remains as a deprecated alias.) `createDevServer` returns a `StartedServer` handle (`origin`, `port`, `app`, `wss`, `close()`) so you can wire SIGINT / hot-reload teardown into the surrounding program. `parseCliFlags(schema, raw)` and `defineCliFlags(...)` (both from `devframe/adapters/cac`) validate an arbitrary flag bag against a `CliFlagsSchema` — the helpers are framework-agnostic.
|
|
543
543
|
|
|
544
544
|
## Bundled utilities
|
|
545
545
|
|