@kvman/kvbuilder 0.2.0 → 0.3.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/dist/api.d.ts +13 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/app/register-app-preset.d.ts +3 -0
- package/dist/app/register-app-preset.d.ts.map +1 -0
- package/dist/app/register-app-preset.js +75 -0
- package/dist/app/register-app-preset.js.map +1 -0
- package/dist/build/installed-index.d.ts +11 -0
- package/dist/build/installed-index.d.ts.map +1 -0
- package/dist/build/installed-index.js +39 -0
- package/dist/build/installed-index.js.map +1 -0
- package/dist/build/register-build.d.ts.map +1 -1
- package/dist/build/register-build.js +5 -3
- package/dist/build/register-build.js.map +1 -1
- package/dist/connectors/kvman.d.ts +31 -0
- package/dist/connectors/kvman.d.ts.map +1 -1
- package/dist/connectors/kvman.js +4 -1
- package/dist/connectors/kvman.js.map +1 -1
- package/dist/connectors/preset.js +1 -1
- package/dist/connectors/preset.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/docs/building.md +10 -3
- package/docs/guide.md +14 -5
- package/locales/ar.json +3 -0
- package/locales/en.json +3 -0
- package/package.json +5 -5
package/dist/api.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { KernelQueries } from '@kvman/sdk';
|
|
1
|
+
import type { KernelCommands, KernelQueries } from '@kvman/sdk';
|
|
2
2
|
type Empty = Record<string, never>;
|
|
3
3
|
type Finding = {
|
|
4
4
|
file?: string;
|
|
@@ -141,6 +141,18 @@ declare module '@kvman/sdk' {
|
|
|
141
141
|
restarting: true;
|
|
142
142
|
};
|
|
143
143
|
};
|
|
144
|
+
'kvbuilder.app.preset.settings.set': KernelCommands['kernel.preset.settings.set'];
|
|
145
|
+
'kvbuilder.app.preset.settings.reset': KernelCommands['kernel.preset.settings.reset'];
|
|
146
|
+
'kvbuilder.app.preset.save': {
|
|
147
|
+
input: {
|
|
148
|
+
file: string;
|
|
149
|
+
replace?: boolean;
|
|
150
|
+
};
|
|
151
|
+
output: {
|
|
152
|
+
file: string;
|
|
153
|
+
name: string;
|
|
154
|
+
};
|
|
155
|
+
};
|
|
144
156
|
'kvbuilder.build.start': {
|
|
145
157
|
input: {
|
|
146
158
|
sessionId: string;
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhE,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACnC,KAAK,OAAO,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAChE,KAAK,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACjC,KAAK,KAAK,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACjE,KAAK,IAAI,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/D,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AACrE,KAAK,aAAa,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;AACjJ,KAAK,aAAa,GAAG;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAElH,OAAO,QAAQ,YAAY,CAAC;IAC1B,UAAU,QAAQ;QAChB,mBAAmB,EAAE;YAAE,KAAK,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAC;gBAAC,GAAG,CAAC,EAAE,OAAO,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE,MAAM,CAAC;gBAAC,GAAG,EAAE,OAAO,CAAA;aAAE,CAAA;SAAE,CAAC;QAC9K,qBAAqB,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,EAAE,CAAA;SAAE,CAAC;QAC5D,oBAAoB,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE;gBAAE,MAAM,EAAE,OAAO,CAAC;gBAAC,QAAQ,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;QACvG,sBAAsB,EAAE;YAAE,KAAK,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;QAC5F,wBAAwB,EAAE;YAAE,KAAK,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,EAAE,CAAA;SAAE,CAAC;QACjH,yBAAyB,EAAE;YAAE,KAAK,EAAE;gBAAE,UAAU,EAAE,MAAM,EAAE,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;QACzG,wBAAwB,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE,KAAK,CAAA;SAAE,CAAC;QAC1D,+BAA+B,EAAE;YAAE,KAAK,EAAE,WAAW,CAAC;YAAC,MAAM,EAAE,aAAa,CAAA;SAAE,CAAC;QAC/E,yBAAyB,EAAE;YAAE,KAAK,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE,KAAK,CAAA;SAAE,CAAC;QACvE,4BAA4B,EAAE;YAAE,KAAK,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,OAAO,CAAC;gBAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE,KAAK,CAAA;SAAE,CAAC;QACvH,8BAA8B,EAAE;YAAE,KAAK,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE,KAAK,CAAA;SAAE,CAAC;QACzG,kCAAkC,EAAE;YAAE,KAAK,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,eAAe,EAAE,IAAI,CAAA;aAAE,CAAA;SAAE,CAAC;QACnH,uBAAuB,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE;gBAAE,UAAU,EAAE,IAAI,CAAA;aAAE,CAAA;SAAE,CAAC;QACxE,mCAAmC,EAAE,cAAc,CAAC,4BAA4B,CAAC,CAAC;QAClF,qCAAqC,EAAE,cAAc,CAAC,8BAA8B,CAAC,CAAC;QACtF,2BAA2B,EAAE;YAAE,KAAK,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,OAAO,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;QACpH,uBAAuB,EAAE;YAAE,KAAK,EAAE;gBAAE,SAAS,EAAE,MAAM,CAAC;gBAAC,QAAQ,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE,KAAK,CAAA;SAAE,CAAC;QAC3F,oCAAoC,EAAE;YAAE,KAAK,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,eAAe,EAAE,IAAI,CAAA;aAAE,CAAA;SAAE,CAAC;KACpH;IACD,UAAU,OAAO;QACf,oBAAoB,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE,MAAM,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,EAAE,CAAA;SAAE,CAAC;QACvH,0BAA0B,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE,aAAa,CAAA;SAAE,CAAC;QACpE,6BAA6B,EAAE;YAAE,KAAK,EAAE,WAAW,CAAC;YAAC,MAAM,EAAE,aAAa,CAAA;SAAE,CAAC;QAC7E,0BAA0B,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,QAAQ,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE,OAAO,CAAA;aAAE,EAAE,CAAA;SAAE,CAAC;QAC3H,6BAA6B,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAC;gBAAC,WAAW,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC;gBAAC,KAAK,EAAE,OAAO,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,EAAE,CAAA;SAAE,CAAC;QACpK,+BAA+B,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE,MAAM,CAAC;gBAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;aAAE,EAAE,CAAA;SAAE,CAAC;QAC7L,0BAA0B,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;gBAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;aAAE,CAAA;SAAE,CAAC;QACnM,+BAA+B,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;QACxE,yBAAyB,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;QAC7D,wBAAwB,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;QAC3D,8BAA8B,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;QACvE,0BAA0B,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;QAC/D,yBAAyB,EAAE;YAAE,KAAK,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC;QACzG,uBAAuB,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE;gBAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBAAC,QAAQ,EAAE;oBAAE,SAAS,EAAE,MAAM,CAAC;oBAAC,OAAO,EAAE;wBAAE,IAAI,EAAE,MAAM,CAAC;wBAAC,OAAO,EAAE,MAAM,CAAC;wBAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;qBAAE,CAAA;iBAAE,EAAE,CAAA;aAAE,CAAA;SAAE,CAAC;QACvL,sBAAsB,EAAE;YAAE,KAAK,EAAE;gBAAE,SAAS,CAAC,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE,KAAK,GAAG;gBAAE,QAAQ,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;QAC/G,qBAAqB,EAAE;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,EAAE,CAAA;SAAE,CAAC;QACpF,oBAAoB,EAAE;YAAE,KAAK,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE,IAAI,CAAA;SAAE,CAAC;KAClE;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-app-preset.d.ts","sourceRoot":"","sources":["../../src/app/register-app-preset.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuD,KAAK,GAAG,EAAe,MAAM,YAAY,CAAC;AAmCxG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAkChD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { kernelCommandSchemas, presetSchema, ProblemError, z } from '@kvman/sdk';
|
|
4
|
+
import { insideWorkspace } from "../folders.js";
|
|
5
|
+
import { invalid } from "../problems.js";
|
|
6
|
+
const fileField = z.string().min(1).describe('The preset file, relative to the workspace folder.');
|
|
7
|
+
function readPreset(workspaceFolder, file) {
|
|
8
|
+
const absolute = insideWorkspace(workspaceFolder, file, 'file');
|
|
9
|
+
let text;
|
|
10
|
+
try {
|
|
11
|
+
text = readFileSync(absolute, 'utf8');
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
15
|
+
throw new ProblemError({ code: 'NOT_FOUND', message: `The preset file ${file} does not exist.`, params: { file } });
|
|
16
|
+
}
|
|
17
|
+
throw invalid(`The preset file ${file} could not be read.`, { file });
|
|
18
|
+
}
|
|
19
|
+
let value;
|
|
20
|
+
try {
|
|
21
|
+
value = JSON.parse(text);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (!(error instanceof SyntaxError))
|
|
25
|
+
throw error;
|
|
26
|
+
throw invalid(`The file ${file} is not JSON.`, { file });
|
|
27
|
+
}
|
|
28
|
+
const parsed = presetSchema.safeParse(value);
|
|
29
|
+
if (!parsed.success)
|
|
30
|
+
throw invalid(`The file ${file} is not a preset.`, { file });
|
|
31
|
+
const extensions = { ...parsed.data.extensions };
|
|
32
|
+
for (const [name, source] of Object.entries(extensions)) {
|
|
33
|
+
if (!source.startsWith('path:'))
|
|
34
|
+
continue;
|
|
35
|
+
const folder = source.slice('path:'.length);
|
|
36
|
+
extensions[name] = `path:${path.isAbsolute(folder) ? folder : path.resolve(path.dirname(absolute), folder)}`;
|
|
37
|
+
}
|
|
38
|
+
return { ...parsed.data, extensions };
|
|
39
|
+
}
|
|
40
|
+
export function registerAppPreset(ctx) {
|
|
41
|
+
ctx.registerCommand('kvbuilder.app.preset.settings.set', {
|
|
42
|
+
description: "Sets one value of the running app's preset; it applies at the next start.",
|
|
43
|
+
public: true,
|
|
44
|
+
retries: 0,
|
|
45
|
+
input: kernelCommandSchemas['kernel.preset.settings.set'].input.extend({
|
|
46
|
+
key: z.string().min(1).describe('The full setting key in the running preset.'),
|
|
47
|
+
value: z.json().describe('The value to store in the running preset.'),
|
|
48
|
+
}),
|
|
49
|
+
output: kernelCommandSchemas['kernel.preset.settings.set'].output,
|
|
50
|
+
handle: (input) => ctx.exec('kernel.preset.settings.set', input),
|
|
51
|
+
});
|
|
52
|
+
ctx.registerCommand('kvbuilder.app.preset.settings.reset', {
|
|
53
|
+
description: "Removes one value from the running app's preset; it applies at the next start.",
|
|
54
|
+
public: true,
|
|
55
|
+
retries: 0,
|
|
56
|
+
input: kernelCommandSchemas['kernel.preset.settings.reset'].input.extend({
|
|
57
|
+
key: z.string().min(1).describe('The full setting key to remove from the running preset.'),
|
|
58
|
+
}),
|
|
59
|
+
output: kernelCommandSchemas['kernel.preset.settings.reset'].output,
|
|
60
|
+
handle: (input) => ctx.exec('kernel.preset.settings.reset', input),
|
|
61
|
+
});
|
|
62
|
+
ctx.registerCommand('kvbuilder.app.preset.save', {
|
|
63
|
+
description: 'Saves a preset file of the workspace as a preset of this kvman, to start later with kvman --preset <name>.',
|
|
64
|
+
public: true,
|
|
65
|
+
retries: 0,
|
|
66
|
+
input: z.strictObject({ file: fileField, replace: z.boolean().exactOptional().describe('Overwrite a saved preset with the same name when true.') }),
|
|
67
|
+
output: z.strictObject({ file: z.string(), name: z.string() }),
|
|
68
|
+
handle: async ({ file, replace }) => {
|
|
69
|
+
const preset = readPreset(ctx.job.workspace.path, file);
|
|
70
|
+
const saved = await ctx.exec('kernel.presets.save', { preset, ...(replace === undefined ? {} : { replace }) });
|
|
71
|
+
return { file: saved.file, name: preset.name };
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=register-app-preset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-app-preset.js","sourceRoot":"","sources":["../../src/app/register-app-preset.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { extensionInfoSchema, presetStateSchema, z, type Ctx } from '@kvman/sdk';
|
|
2
|
+
import { guideListSchema } from '../docs/guides.ts';
|
|
3
|
+
type Extension = z.output<typeof extensionInfoSchema>;
|
|
4
|
+
type Preset = z.output<typeof presetStateSchema>;
|
|
5
|
+
type Guides = z.output<typeof guideListSchema>;
|
|
6
|
+
/** A snapshot of the installed extensions and their pages, limited to a whole-block 16 KB section. */
|
|
7
|
+
export declare function installedIndex(preset: Preset, extensions: readonly Extension[], guides: Guides): string;
|
|
8
|
+
/** Reads the snapshot at the time /build-kvman runs. */
|
|
9
|
+
export declare function readInstalledIndex(ctx: Ctx): Promise<string>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=installed-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installed-index.d.ts","sourceRoot":"","sources":["../../src/build/installed-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC,EAAE,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,eAAe,EAAc,MAAM,mBAAmB,CAAC;AAEhE,KAAK,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtD,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACjD,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAoB/C,sGAAsG;AACtG,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOvG;AAED,wDAAwD;AACxD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { extensionInfoSchema, presetStateSchema, z } from '@kvman/sdk';
|
|
2
|
+
import { guideListSchema, listGuides } from "../docs/guides.js";
|
|
3
|
+
const lastLine = 'This is what ran when /build-kvman was typed. `kvman extensions-list` and `docs list` are current.';
|
|
4
|
+
const maximumBytes = 16 * 1024;
|
|
5
|
+
const alphabetical = (left, right) => left.localeCompare(right);
|
|
6
|
+
function extensionBlock(extension, guides) {
|
|
7
|
+
const lines = [`- ${extension.name} (${extension.namespace}), ${extension.source}, ${extension.version}`];
|
|
8
|
+
const settings = extension.settings.map((setting) => setting.key).sort(alphabetical);
|
|
9
|
+
const commands = extension.commands.filter((command) => command.public).map((command) => command.name).sort(alphabetical);
|
|
10
|
+
const queries = extension.queries.filter((query) => query.public).map((query) => query.name).sort(alphabetical);
|
|
11
|
+
if (settings.length > 0)
|
|
12
|
+
lines.push(` settings: ${settings.join(', ')}`);
|
|
13
|
+
if (commands.length > 0)
|
|
14
|
+
lines.push(` public commands: ${commands.join(', ')}`);
|
|
15
|
+
if (queries.length > 0)
|
|
16
|
+
lines.push(` public queries: ${queries.join(', ')}`);
|
|
17
|
+
const failed = guides.problems.some((problem) => problem.extension === extension.name);
|
|
18
|
+
const pages = failed ? [] : guides.pages.filter((page) => page.extension === extension.name).sort((left, right) => alphabetical(left.topic, right.topic));
|
|
19
|
+
lines.push(` pages: ${pages.length === 0 ? 'none' : pages.map((page) => `${page.topic} (${page.title})`).join(', ')}`);
|
|
20
|
+
return lines.join('\n');
|
|
21
|
+
}
|
|
22
|
+
/** A snapshot of the installed extensions and their pages, limited to a whole-block 16 KB section. */
|
|
23
|
+
export function installedIndex(preset, extensions, guides) {
|
|
24
|
+
const header = `Preset: ${preset.name} (${preset.origin})`;
|
|
25
|
+
const blocks = extensions.toSorted((left, right) => alphabetical(left.name, right.name)).map((extension) => extensionBlock(extension, guides));
|
|
26
|
+
let included = blocks.length;
|
|
27
|
+
const text = () => [header, ...blocks.slice(0, included), `${lastLine}${included === blocks.length ? '' : ` ${String(blocks.length - included)} more extensions aren't listed here.`}`].join('\n');
|
|
28
|
+
while (Buffer.byteLength(text(), 'utf8') > maximumBytes && included > 0)
|
|
29
|
+
included -= 1;
|
|
30
|
+
return text();
|
|
31
|
+
}
|
|
32
|
+
/** Reads the snapshot at the time /build-kvman runs. */
|
|
33
|
+
export async function readInstalledIndex(ctx) {
|
|
34
|
+
const preset = await ctx.exec('kernel.preset.get', {});
|
|
35
|
+
const extensions = await ctx.exec('kernel.extensions.list', {});
|
|
36
|
+
const guides = await listGuides(ctx);
|
|
37
|
+
return installedIndex(preset, extensions, guides);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=installed-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installed-index.js","sourceRoot":"","sources":["../../src/build/installed-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-build.d.ts","sourceRoot":"","sources":["../../src/build/register-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"register-build.d.ts","sourceRoot":"","sources":["../../src/build/register-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAkBzC,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAoB5C"}
|
|
@@ -5,14 +5,15 @@ import { kvmanConnector } from "../connectors/kvman.js";
|
|
|
5
5
|
import { presetConnector } from "../connectors/preset.js";
|
|
6
6
|
import { previewConnector } from "../connectors/preview.js";
|
|
7
7
|
import { readGuide } from "../docs/own-docs.js";
|
|
8
|
-
|
|
9
|
-
//
|
|
8
|
+
import { readInstalledIndex } from "./installed-index.js";
|
|
9
|
+
// `/build-kvman` (plan 09 §9.4; ADR 0027, 12; ADR 0030, 7): the person starts building kvman in a chat. Enable
|
|
10
|
+
// connectors first, then set the guide and the installed snapshot; a refused session leaves no sections behind.
|
|
10
11
|
// kvbuilder's connectors, which a chat has only after `/build-kvman` ran in it.
|
|
11
12
|
const connectorNames = [kvmanConnector, extConnector, presetConnector, previewConnector, docsConnector].map((connector) => connector.name);
|
|
12
13
|
const owner = '@kvman/kvbuilder';
|
|
13
14
|
export function registerBuild(ctx) {
|
|
14
15
|
ctx.registerCommand('kvbuilder.build.start', {
|
|
15
|
-
description: "Starts building kvman in one chat: gives the chat kvbuilder's connectors and
|
|
16
|
+
description: "Starts building kvman in one chat: gives the chat kvbuilder's connectors, guide, and installed index.",
|
|
16
17
|
public: true,
|
|
17
18
|
retries: 0,
|
|
18
19
|
input: z.object({
|
|
@@ -25,6 +26,7 @@ export function registerBuild(ctx) {
|
|
|
25
26
|
const sections = await ctx.exec('kvcoder.section.list', { sessionId });
|
|
26
27
|
const started = sections.some((section) => section.id === 'guide' && section.owner === owner && section.sessionId === sessionId);
|
|
27
28
|
await ctx.exec('kvcoder.section.set', { id: 'guide', title: 'Building kvman', order: 20, sessionId, content: readGuide() });
|
|
29
|
+
await ctx.exec('kvcoder.section.set', { id: 'installed', title: 'Installed in this app', order: 21, sessionId, content: await readInstalledIndex(ctx) });
|
|
28
30
|
if (!started)
|
|
29
31
|
await ctx.exec('kvcoder.note.add', { sessionId, key: 'kvbuilder.build.started' });
|
|
30
32
|
return {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-build.js","sourceRoot":"","sources":["../../src/build/register-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAY,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"register-build.js","sourceRoot":"","sources":["../../src/build/register-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAY,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,+GAA+G;AAC/G,gHAAgH;AAEhH,gFAAgF;AAChF,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAE3I,MAAM,KAAK,GAAG,kBAAkB,CAAC;AAEjC,MAAM,UAAU,aAAa,CAAC,GAAQ;IACpC,GAAG,CAAC,eAAe,CAAC,uBAAuB,EAAE;QAC3C,WAAW,EAAE,uGAAuG;QACpH,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACpE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;SACpG,CAAC;QACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;YAC9B,MAAM,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YACjF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;YACjI,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAC5H,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzJ,IAAI,CAAC,OAAO;gBAAE,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC;YAChG,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -68,6 +68,37 @@ export declare const kvmanConnector: {
|
|
|
68
68
|
description: string;
|
|
69
69
|
input: {};
|
|
70
70
|
}[];
|
|
71
|
+
} | {
|
|
72
|
+
name: string;
|
|
73
|
+
command: string;
|
|
74
|
+
asks: true;
|
|
75
|
+
examples: {
|
|
76
|
+
description: string;
|
|
77
|
+
input: {
|
|
78
|
+
key: string;
|
|
79
|
+
value: string;
|
|
80
|
+
};
|
|
81
|
+
}[];
|
|
82
|
+
} | {
|
|
83
|
+
name: string;
|
|
84
|
+
command: string;
|
|
85
|
+
asks: true;
|
|
86
|
+
examples: {
|
|
87
|
+
description: string;
|
|
88
|
+
input: {
|
|
89
|
+
key: string;
|
|
90
|
+
};
|
|
91
|
+
}[];
|
|
92
|
+
} | {
|
|
93
|
+
name: string;
|
|
94
|
+
command: string;
|
|
95
|
+
asks: true;
|
|
96
|
+
examples: {
|
|
97
|
+
description: string;
|
|
98
|
+
input: {
|
|
99
|
+
file: string;
|
|
100
|
+
};
|
|
101
|
+
}[];
|
|
71
102
|
} | {
|
|
72
103
|
name: string;
|
|
73
104
|
command: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kvman.d.ts","sourceRoot":"","sources":["../../src/connectors/kvman.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"kvman.d.ts","sourceRoot":"","sources":["../../src/connectors/kvman.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyC1B,CAAC"}
|
package/dist/connectors/kvman.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
export const kvmanConnector = {
|
|
4
4
|
name: 'kvman',
|
|
5
5
|
optIn: true,
|
|
6
|
-
description: 'See and change the app you are running in: its default model, settings, extensions, and preset, and its workspaces, jobs, processes, and health. Use it for any change to kvman itself. The person is asked before each change. query-get runs a public query of any installed extension. A change to the extensions or the preset is saved to the preset file and applies at the next start of kvman.',
|
|
6
|
+
description: 'See and change the app you are running in: its default model, settings, extensions, and preset, and its workspaces, jobs, processes, and health. Use it for any change to kvman itself. The person is asked before each change. query-get runs a public query of any installed extension. preset-set and preset-reset change one value of the app\'s preset, such as its name and home page. preset-save saves a preset file from the workspace so the person can start it later by name. A change to the extensions or the preset is saved to the preset file and applies at the next start of kvman.',
|
|
7
7
|
commands: [
|
|
8
8
|
{ name: 'model-list', command: 'kvbuilder.app.model.list' },
|
|
9
9
|
{ name: 'model-set', command: 'kvbuilder.app.model.set', asks: true, examples: [{ description: 'Use another model', input: { model: 'anthropic/claude-sonnet-5-5' } }] },
|
|
@@ -23,6 +23,9 @@ export const kvmanConnector = {
|
|
|
23
23
|
{ name: 'extensions-uninstall', command: 'kvbuilder.app.extensions.uninstall', asks: true, examples: [{ description: 'Remove one', input: { name: '@acme/notes' } }] },
|
|
24
24
|
{ name: 'restart', command: 'kvbuilder.app.restart', asks: true, examples: [{ description: 'Restart kvman to finish adding the notes page', input: {} }] },
|
|
25
25
|
{ name: 'preset-get', command: 'kvbuilder.app.preset.get' },
|
|
26
|
+
{ name: 'preset-set', command: 'kvbuilder.app.preset.settings.set', asks: true, examples: [{ description: 'Open the app on its extensions page', input: { key: 'kvwebui.home', value: 'kvwebui.extensions' } }] },
|
|
27
|
+
{ name: 'preset-reset', command: 'kvbuilder.app.preset.settings.reset', asks: true, examples: [{ description: "Go back to the app's own default", input: { key: 'kvwebui.theme' } }] },
|
|
28
|
+
{ name: 'preset-save', command: 'kvbuilder.app.preset.save', asks: true, examples: [{ description: 'Save the notes app so it can be started by its name', input: { file: 'notes-app.json' } }] },
|
|
26
29
|
{ name: 'workspaces-list', command: 'kvbuilder.app.workspaces.list' },
|
|
27
30
|
{ name: 'jobs-list', command: 'kvbuilder.app.jobs.list', examples: [{ description: 'See the jobs that failed', input: { status: 'failed', limit: 20 } }] },
|
|
28
31
|
{ name: 'jobs-get', command: 'kvbuilder.app.jobs.get', examples: [{ description: 'Read one job', input: { id: 'the job id' } }] },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kvman.js","sourceRoot":"","sources":["../../src/connectors/kvman.ts"],"names":[],"mappings":"AAAA,oHAAoH;AACpH,sHAAsH;AACtH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,IAAa;IACpB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"kvman.js","sourceRoot":"","sources":["../../src/connectors/kvman.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
export const presetConnector = {
|
|
3
3
|
name: 'preset',
|
|
4
4
|
optIn: true,
|
|
5
|
-
description: 'Write and check kvman presets. Use it to create a preset file, and to check it before running it.',
|
|
5
|
+
description: 'Write and check kvman presets. Use it to create a preset file, and to check it before running it. A checked preset is saved with kvman preset-save.',
|
|
6
6
|
commands: [
|
|
7
7
|
{ name: 'new', command: 'kvbuilder.preset.new', examples: [{ description: 'Write a preset for a notes app', input: { name: 'notes-app', file: 'notes-app.json' } }] },
|
|
8
8
|
{ name: 'check', command: 'kvbuilder.preset.check', examples: [{ description: 'Check that preset', input: { file: 'notes-app.json' } }] },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preset.js","sourceRoot":"","sources":["../../src/connectors/preset.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,IAAa;IACpB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"preset.js","sourceRoot":"","sources":["../../src/connectors/preset.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,IAAa;IACpB,WAAW,EAAE,qJAAqJ;IAClK,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC,EAAE;QACrK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC,EAAE;KAC1I;CACF,CAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAYtC,YAAY,EAAE,MAAM,UAAU,CAAC;yBAKf,KAAK,GAAG,KAAG,IAAI;AAA/B,wBAWE"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { registerApp } from "./app/register-app.js";
|
|
2
|
+
import { registerAppPreset } from "./app/register-app-preset.js";
|
|
2
3
|
import { registerAppReads } from "./app/register-app-reads.js";
|
|
3
4
|
import { registerBuild } from "./build/register-build.js";
|
|
4
5
|
import { registerDocs } from "./docs/register-docs.js";
|
|
@@ -12,6 +13,7 @@ import { registerWithKvcoder } from "./register-with-kvcoder.js";
|
|
|
12
13
|
// its guide, which a chat has once the person runs `/build-kvman` in it (ADR 0027).
|
|
13
14
|
export default (ctx) => {
|
|
14
15
|
registerApp(ctx);
|
|
16
|
+
registerAppPreset(ctx);
|
|
15
17
|
registerBuild(ctx);
|
|
16
18
|
registerAppReads(ctx);
|
|
17
19
|
registerAppQuery(ctx);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAIjE,oHAAoH;AACpH,sHAAsH;AACtH,oFAAoF;AACpF,eAAe,CAAC,GAAQ,EAAQ,EAAE;IAChC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjB,aAAa,CAAC,GAAG,CAAC,CAAC;IACnB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,WAAW,CAAC,GAAG,CAAC,CAAC;IACjB,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,eAAe,CAAC,GAAG,CAAC,CAAC;IACrB,YAAY,CAAC,GAAG,CAAC,CAAC;IAClB,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAIjE,oHAAoH;AACpH,sHAAsH;AACtH,oFAAoF;AACpF,eAAe,CAAC,GAAQ,EAAQ,EAAE;IAChC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjB,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,aAAa,CAAC,GAAG,CAAC,CAAC;IACnB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,WAAW,CAAC,GAAG,CAAC,CAAC;IACjB,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,eAAe,CAAC,GAAG,CAAC,CAAC;IACrB,YAAY,CAAC,GAAG,CAAC,CAAC;IAClB,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC,CAAC"}
|
package/docs/building.md
CHANGED
|
@@ -8,7 +8,7 @@ The agent calls each connector with kvcoder's `run` tool: `run { description, co
|
|
|
8
8
|
|
|
9
9
|
| Connector | Commands | Use it to |
|
|
10
10
|
|---|---|---|
|
|
11
|
-
| `kvman` | `model-list`, `model-set`, `settings-list`, `settings-set`, `settings-reset`, `extensions-list`, `extensions-install`, `extensions-uninstall`, `preset-get`, `workspaces-list`, `jobs-list`, `jobs-get`, `processes-list`, `health-get`, `query-get` | see and change the app you are running in: its default model, settings, extensions, and preset; its workspaces, jobs, processes, and health; and any public query of an installed extension |
|
|
11
|
+
| `kvman` | `model-list`, `model-set`, `settings-list`, `settings-set`, `settings-reset`, `extensions-list`, `extensions-install`, `extensions-uninstall`, `preset-get`, `preset-set`, `preset-reset`, `preset-save`, `workspaces-list`, `jobs-list`, `jobs-get`, `processes-list`, `health-get`, `query-get` | see and change the app you are running in: its default model, settings, extensions, and preset; its workspaces, jobs, processes, and health; and any public query of an installed extension |
|
|
12
12
|
| `ext` | `new`, `list`, `check`, `test` | scaffold an extension project in the workspace, list the projects, type-check one and see what kvman would refuse, run its tests |
|
|
13
13
|
| `preset` | `new`, `check` | write a preset file and check it before running it |
|
|
14
14
|
| `preview` | `start`, `stop`, `status`, `query-get`, `command-run` | run projects in a separate kvman, get its URL, and call their commands and queries there |
|
|
@@ -40,9 +40,10 @@ Building kvman starts with the person, never with the agent. In a chat's send bo
|
|
|
40
40
|
|
|
41
41
|
- enables the five connectors for that chat only. They are registered with `optIn: true`, so no other chat has them in its prompt or can call them;
|
|
42
42
|
- sets the chat's prompt section `guide` from `docs/guide.md`: what to ask the person, the rules below, and the method of the next parts. A section is in every prompt of the chat, so a summary of the chat never drops it;
|
|
43
|
+
- sets the `installed` section, an index of the running preset, each installed extension's settings and public commands and queries, and its docs pages. Run `/build-kvman` again to renew this snapshot;
|
|
43
44
|
- adds the note "Building kvman is on for this chat", the first time.
|
|
44
45
|
|
|
45
|
-
The send box then sends the text after the command as the person's message, or "I want to change this app." when there was none, and the agent's turn starts. Running `/build-kvman` again in the same chat renews the guide and adds no second note. Nothing switches building off: a new chat starts without it. `guide` is not a page of `docs get`.
|
|
46
|
+
On the Chat page the send box creates the chat first, so `sessionId` is the new chat's. The send box then sends the text after the command as the person's message, or "I want to change this app." when there was none, and the agent's turn starts. Running `/build-kvman` again in the same chat renews the guide and adds no second note. Nothing switches building off: a new chat starts without it. `guide` is not a page of `docs get`.
|
|
46
47
|
|
|
47
48
|
## Talking with a person who isn't a developer
|
|
48
49
|
|
|
@@ -117,6 +118,12 @@ kvcoder's own configuration is settings too: `kvcoder.delegate.workers` (the wor
|
|
|
117
118
|
|
|
118
119
|
None of these calls reads, lists, or changes a secret.
|
|
119
120
|
|
|
121
|
+
## Editing the running preset and saving another app
|
|
122
|
+
|
|
123
|
+
`kvman preset-set { key, value }` changes one value of the running preset, such as `kvwebui.title` or `kvwebui.home`; `kvman preset-reset { key }` removes a preset value. Both ask the person and answer `{ file, restartRequired: true }`: restart once to apply the edits. For a setting the person may later change on the Settings page, use `kvman settings-set` instead.
|
|
124
|
+
|
|
125
|
+
For a separate app, write a workspace file with `preset new { name, file }`, edit its extensions and settings, run `preset check { file }`, and preview it with `preview start { extensions: [folder], preset: file }` (at least one project folder is required). After the person confirms, `kvman preset-save { file, replace? }` saves the preset by its own name in the home. Relative `path:` entries are resolved against the file's folder. It answers `{ file, name }`; the person starts it with `kvman --preset <name>`. Saving does not change the running app.
|
|
126
|
+
|
|
120
127
|
## The tools underneath
|
|
121
128
|
|
|
122
129
|
The connectors run the tools of `@kvman/testkit`, which you can run by hand in any terminal:
|
|
@@ -131,7 +138,7 @@ The connectors run the tools of `@kvman/testkit`, which you can run by hand in a
|
|
|
131
138
|
|
|
132
139
|
## Docs: what `docs list` shows
|
|
133
140
|
|
|
134
|
-
`docs list` answers every page, grouped by extension. The built-in guides belong to `kvman`: `sdk`, `i18n`, and `presets`. Every installed extension that documents itself adds its own pages. An extension documents itself with two public queries:
|
|
141
|
+
`docs list` answers every page, grouped by extension. The built-in guides belong to `kvman`: `conventions`, `sdk`, `i18n`, and `presets`. Every installed extension that documents itself adds its own pages. An extension documents itself with two public queries:
|
|
135
142
|
|
|
136
143
|
- `<namespace>.docs.list` answers `[{ topic, title }]`;
|
|
137
144
|
- `<namespace>.docs.get` takes `{ topic }` and answers `{ topic, title, markdown }`.
|
package/docs/guide.md
CHANGED
|
@@ -6,15 +6,25 @@ What the person wants. Find out what they want to see or do, in their own words.
|
|
|
6
6
|
|
|
7
7
|
A person who isn't a developer. Many people who ask for this don't know kvman's internals, so you choose the mechanism, and they only choose the result.
|
|
8
8
|
- Never ask them about, or say to them, extensions, namespaces, presets, setting keys, or commands. Leave those words out of a call's `description` too, since it is the text of the card that asks them: write "Add a Notes page to your app", not "Install the notes extension".
|
|
9
|
-
- Look before you build. Read `extensions-list`, `settings-list`, and `preset-get`, then use the smallest thing that gives them what they asked for: a setting, an extension that is already installed, an extension you build, and a new preset only when they want a different app. If kvman can't do it, say so plainly.
|
|
9
|
+
- Look before you build. The prompt section "Installed in this app" lists what runs here: each extension's settings, public commands and queries, and docs pages, so start from it. Read `extensions-list`, `settings-list`, and `preset-get`, then use the smallest thing that gives them what they asked for: a setting, an extension that is already installed, an extension you build, and a new preset only when they want a different app. If kvman can't do it, say so plainly.
|
|
10
10
|
- Show before you change. For an extension you built, start the preview, give them its address, and call `ask confirm` ("Does this look right?") before you add it to the app.
|
|
11
|
-
- Say how to undo each change in your final answer: `settings-reset` for a setting, `extensions-uninstall` for an extension.
|
|
11
|
+
- Say how to undo each change in your final answer: `settings-reset` for a setting, `extensions-uninstall` for an extension, `preset-reset` (or `preset-set` with the earlier value) for a value of the app, and for an app you saved, the file's path, which they delete.
|
|
12
12
|
- After a change to the extensions, finish it with one `restart` call (below), and say what is still unchecked.
|
|
13
13
|
|
|
14
|
+
This app, or a different app. Changing this app is an edit of its preset. Change its extensions with `extensions-install` and `extensions-uninstall`. Change one of its values with `preset-set` with `{"key":"kvwebui.home","value":"notes.list"}`, and use `preset-reset` to go back. The app's name (`kvwebui.title`) and the page it opens on (`kvwebui.home`) are such values, which only the preset sets. Use `settings-set` instead for a setting the person may change later themselves on the Settings page. Each change asks them first and applies at the next start, so finish with one `restart`.
|
|
15
|
+
|
|
16
|
+
A different app is a new preset. Do this in order:
|
|
17
|
+
1. `preset new` with `{"name":"notes-app","file":"notes-app.json"}`. The name is lowercase words joined by hyphens.
|
|
18
|
+
2. Edit the file with `fs`: its `extensions`, and its `settings`, of which `kvwebui.home` is required.
|
|
19
|
+
3. `preset check` with `{"file":"notes-app.json"}`; fix every finding.
|
|
20
|
+
4. `preview start` with `{"extensions":["notes"],"preset":"notes-app.json"}` runs it and returns its address, which you give them. It needs at least one project folder of this workspace in `extensions`; for an app made only of installed extensions, skip this step and the next, and say that it is unchecked.
|
|
21
|
+
5. `ask confirm` ("Does this look right?").
|
|
22
|
+
6. `kvman preset-save` with `{"file":"notes-app.json"}` (`"replace": true` to save it again). Tell them it is saved and that they start it by typing `kvman --preset notes-app` in a terminal; this app keeps running as it is. That line is the one place you say a command to them.
|
|
23
|
+
|
|
14
24
|
An extension is a package with a `kvman` field; `src/index.ts` registers commands, queries, settings, and handlers with zod schemas. Every name starts with its namespace. Use the connectors `kvman`, `ext`, `preset`, `preview`, and `docs` for everything they cover, and `shell` only for the rest. Read and edit a project's files with `fs`. `ext` builds a project in the workspace; it is not for the app you run in.
|
|
15
25
|
|
|
16
26
|
Build an extension, in this order:
|
|
17
|
-
1. Read first. `docs list` shows every page: the built-in guides (`sdk`, `i18n`, `presets`) and the pages that installed extensions serve about themselves, such as the views and components of kvwebui. `docs get` with `{"topic":"sdk"}` reads a built-in guide, and with `{"extension":"@kvman/kvwebui","topic":"views"}` an extension's page. Read the guides before writing an extension, and an extension's pages before building on it.
|
|
27
|
+
1. Read first. `docs list` shows every page: the built-in guides (`conventions`, `sdk`, `i18n`, `presets`) and the pages that installed extensions serve about themselves, such as the views and components of kvwebui. `docs get` with `{"topic":"sdk"}` reads a built-in guide, and with `{"extension":"@kvman/kvwebui","topic":"views"}` an extension's page. Read `conventions` before you write or change an extension or a preset, the other guides before writing an extension, and an extension's pages before building on it.
|
|
18
28
|
2. Scaffold. `ext list` lists the projects here. `ext new` with `{"name":"notes","namespace":"notes","folder":"notes"}` scaffolds one (`"web": true` adds a Vue component).
|
|
19
29
|
3. Write it with `fs`, in `src/`, `locales/`, and `test/`. Never edit `dist/`.
|
|
20
30
|
4. Check after every change: `ext check` with `{"folder":"notes"}` type-checks it and reports what kvman would refuse, then `ext test` with the same payload runs its tests. Fix every finding before you go on.
|
|
@@ -26,9 +36,8 @@ Improve an extension that exists: read its code and its docs page first, and fin
|
|
|
26
36
|
|
|
27
37
|
Manage the app: `kvman` changes the app you are running in.
|
|
28
38
|
- See its state with `model-list`, `settings-list`, `extensions-list`, `preset-get`, `workspaces-list`, `jobs-list` (with `{"status":"failed","limit":20}` to find what failed), `jobs-get`, `processes-list`, and `health-get`. `query-get` with `{"name":"<a public query>","input":{}}` runs a query of any installed extension.
|
|
29
|
-
- Change it with `model-set`, `settings-set`, `settings-reset`, `extensions-install`, `extensions-uninstall`, and `restart`. The person is asked before each of these runs, so make one call for one change and say in its description what changes.
|
|
39
|
+
- Change it with `model-set`, `settings-set`, `settings-reset`, `extensions-install`, `extensions-uninstall`, `preset-set`, `preset-reset`, `preset-save`, and `restart`. The person is asked before each of these runs, so make one call for one change and say in its description what changes.
|
|
30
40
|
- A model or a setting changes at once. A change to the extensions or the preset is saved to the preset file and applies at the next start of kvman, which `restart` makes. Make one `restart` call, and say in its description what stops: the chats' running work, a preview, and any server you started. Your own turn ends when kvman stops, so say what you are doing in the same reply as the call. Tell the person that the terminal where kvman runs may ask them to trust a new extension, and that the page may need a reload. When they write again, read `health-get`: if it has `rolledBack`, kvman couldn't start with the change and put the app back as it was, so say so, say why from its message, and fix the cause.
|
|
31
41
|
- Your own workers, MCP servers, and connectors are settings: `kvcoder.delegate.workers`, `kvcoder.mcp.servers`, `kvcoder.connectors`, and `kvcoder.connectors.disabled`. Read one with `settings-list` before you change it, and send the whole new value.
|
|
32
42
|
- You never read, list, or change a secret, and there is no command that runs an arbitrary command of the app.
|
|
33
43
|
|
|
34
|
-
`preset new` and `preset check` write and check presets.
|
package/locales/ar.json
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
"kvbuilder.slash.build-kvman": "ابدأ بناء kvman في هذه المحادثة",
|
|
4
4
|
"kvbuilder.slash.build-kvman.message": "أريد تغيير هذا التطبيق.",
|
|
5
5
|
"kvbuilder.build.started": "بناء kvman مفعّل في هذه المحادثة",
|
|
6
|
+
"kvbuilder.app.preset.settings.set.description": "يعيّن قيمة واحدة في الإعداد المسبق للتطبيق الحالي؛ يسري التغيير عند التشغيل التالي.",
|
|
7
|
+
"kvbuilder.app.preset.settings.reset.description": "يحذف قيمة واحدة من الإعداد المسبق للتطبيق الحالي؛ يسري التغيير عند التشغيل التالي.",
|
|
8
|
+
"kvbuilder.app.preset.save.description": "يحفظ ملف إعداد مسبق من مساحة العمل لتتمكن من تشغيله لاحقًا باستخدام kvman --preset <name>.",
|
|
6
9
|
"kvbuilder.errors.FOLDER_NOT_EMPTY": "هذا المجلد غير فارغ. اختر مجلدًا جديدًا أو فارغًا.",
|
|
7
10
|
"kvbuilder.errors.FILE_EXISTS": "هذا الملف موجود بالفعل.",
|
|
8
11
|
"kvbuilder.errors.NOT_A_PROJECT": "هذا المجلد ليس مشروع إضافة (لا يحتوي على package.json فيه حقل kvman).",
|
package/locales/en.json
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
"kvbuilder.slash.build-kvman": "Start building kvman in this chat",
|
|
4
4
|
"kvbuilder.slash.build-kvman.message": "I want to change this app.",
|
|
5
5
|
"kvbuilder.build.started": "Building kvman is on for this chat",
|
|
6
|
+
"kvbuilder.app.preset.settings.set.description": "Sets one value of the running app's preset; it applies at the next start.",
|
|
7
|
+
"kvbuilder.app.preset.settings.reset.description": "Removes one value from the running app's preset; it applies at the next start.",
|
|
8
|
+
"kvbuilder.app.preset.save.description": "Saves a preset file of the workspace as a preset of this kvman, to start later with kvman --preset <name>.",
|
|
6
9
|
"kvbuilder.errors.FOLDER_NOT_EMPTY": "That folder isn't empty; choose a new or empty folder.",
|
|
7
10
|
"kvbuilder.errors.FILE_EXISTS": "That file already exists.",
|
|
8
11
|
"kvbuilder.errors.NOT_A_PROJECT": "That folder isn't an extension project (no package.json with a kvman field).",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kvman/kvbuilder",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "kvbuilder: the kvcoder extension for building kvman, developing extensions and presets and managing the running app.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"locales"
|
|
29
29
|
],
|
|
30
30
|
"peerDependencies": {
|
|
31
|
-
"@kvman/sdk": "^0.1.
|
|
31
|
+
"@kvman/sdk": "^0.1.1"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@kvman/kvai": "0.1.1",
|
|
35
|
-
"@kvman/kvcoder": "0.1.
|
|
35
|
+
"@kvman/kvcoder": "0.1.3",
|
|
36
36
|
"@kvman/kvwebui": "0.1.1",
|
|
37
|
-
"@kvman/sdk": "0.1.
|
|
37
|
+
"@kvman/sdk": "0.1.1",
|
|
38
38
|
"playwright": "1.63.0"
|
|
39
39
|
},
|
|
40
40
|
"kvman": {
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@kvman/testkit": "0.1.
|
|
49
|
+
"@kvman/testkit": "0.1.3"
|
|
50
50
|
},
|
|
51
51
|
"scripts": {
|
|
52
52
|
"build": "tsc -p tsconfig.build.json",
|