kennel 0.2.8 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/cli/src/plugins/external.js +48 -5
- package/dist/core/runtime.js +59 -38485
- package/dist/plugins/external.js +48 -5
- package/kernel/packages/notes/src/ui/folder-notes-list.tsx +1 -1
- package/package.json +4 -2
- package/schemas/config.schema.json +114 -0
- package/web/assets/{abnfDiagram-VRR7QNED-CDr-U31F.js → abnfDiagram-VRR7QNED-CSaxgLw6.js} +1 -1
- package/web/assets/{app-DHGorUqZ.js → app-DoXXGPMx.js} +2 -2
- package/web/assets/{app-options-CtkiC8GR.js → app-options-jTBHy0A7.js} +1 -1
- package/web/assets/{app-view-header-DbQuD6_F.js → app-view-header-Cpx74SQs.js} +1 -1
- package/web/assets/{arc-Cwz5OeLQ.js → arc-DOrTJz--.js} +1 -1
- package/web/assets/{architectureDiagram-ZJ3FMSHR-igGC0b-J.js → architectureDiagram-ZJ3FMSHR-EjOjwlGK.js} +1 -1
- package/web/assets/{ask-tray-y8nkSKNG.js → ask-tray-DLEoRbpV.js} +1 -1
- package/web/assets/{blockDiagram-677ZJIJ3-D4SDltQ_.js → blockDiagram-677ZJIJ3-Dg2LWLOW.js} +1 -1
- package/web/assets/{c4Diagram-LMCZKHZV-Br15uN-s.js → c4Diagram-LMCZKHZV-CWHqGPk8.js} +1 -1
- package/web/assets/channel-54w4vQjC.js +1 -0
- package/web/assets/{chunk-2Q5K7J3B-B0RqrvJA.js → chunk-2Q5K7J3B-Dzz0QWV_.js} +1 -1
- package/web/assets/{chunk-32BRIVSS-De9VBEyE.js → chunk-32BRIVSS-BocStooX.js} +1 -1
- package/web/assets/{chunk-5VM5RSS4-YIMlZtW3.js → chunk-5VM5RSS4-D8BF5Y5h.js} +1 -1
- package/web/assets/{chunk-EX3LRPZG-y9kGcrYi.js → chunk-EX3LRPZG-CWMl9KkL.js} +1 -1
- package/web/assets/{chunk-JWPE2WC7-D0A13HAu.js → chunk-JWPE2WC7-BZEr7iFk.js} +1 -1
- package/web/assets/{chunk-MOJQB5TN-8v4jL8iu.js → chunk-MOJQB5TN-DbKnLJ33.js} +1 -1
- package/web/assets/{chunk-RYQCIY6F-Ri_iNmIp.js → chunk-RYQCIY6F-BF9KWoi2.js} +1 -1
- package/web/assets/{chunk-V7JOEXUC-b0mIbG_X.js → chunk-V7JOEXUC-e88zamUH.js} +1 -1
- package/web/assets/{chunk-VR4S4FIN-BkTZWt1n.js → chunk-VR4S4FIN-NDHM58HJ.js} +1 -1
- package/web/assets/{chunk-XXDRQBXY-D7muOXcd.js → chunk-XXDRQBXY-BtzSzNoD.js} +1 -1
- package/web/assets/classDiagram-OUVF2IWQ-Bh9Ib2pw.js +1 -0
- package/web/assets/classDiagram-v2-EOCWNBFH-Bh9Ib2pw.js +1 -0
- package/web/assets/client-BgUDusrU.js +5 -0
- package/web/assets/{client-Bkl3gwZ5.js → client-COaHUqSC.js} +1 -1
- package/web/assets/{client-BMso7lHb.js → client-UC06V2VL.js} +1 -1
- package/web/assets/{command-CsN8TfJg.js → command-BWtewOrt.js} +1 -1
- package/web/assets/{copy-context-DmBNpffM.js → copy-context-YESgZ_hu.js} +1 -1
- package/web/assets/{cose-bilkent-JH36ORCC-7hnQZylB.js → cose-bilkent-JH36ORCC-i7x8jZ9M.js} +1 -1
- package/web/assets/{cynefin-VYW2F7L2-CTbqXuvk.js → cynefin-VYW2F7L2-D8HPrHMt.js} +1 -1
- package/web/assets/{cynefinDiagram-TSTJHNR4-CmIJtocX.js → cynefinDiagram-TSTJHNR4-BtkeCNXb.js} +1 -1
- package/web/assets/{dagre-VKFMJZFB-BLPHNs2Y.js → dagre-VKFMJZFB-oIThwshO.js} +1 -1
- package/web/assets/{diagram-FQU43EPY-L6FVWAuj.js → diagram-FQU43EPY-DTuhEo03.js} +1 -1
- package/web/assets/{diagram-G47NLZAW-Bb26dbIM.js → diagram-G47NLZAW-BcQ_4_fE.js} +1 -1
- package/web/assets/{diagram-NH7WQ7WH-BBauwdU-.js → diagram-NH7WQ7WH-BA4VC8Du.js} +1 -1
- package/web/assets/{diagram-OA4YK3LP-Dj_9FE7R.js → diagram-OA4YK3LP-BOpyrmty.js} +1 -1
- package/web/assets/{diagram-WEI45ONY-Co1MS5BO.js → diagram-WEI45ONY-BzrSPDJ7.js} +1 -1
- package/web/assets/{document-_ETc5epn.js → document-BDtU3CbX.js} +3 -3
- package/web/assets/{ebnfDiagram-CCIWWBDH-COGAgW5z.js → ebnfDiagram-CCIWWBDH-BNV_4xDp.js} +1 -1
- package/web/assets/{entities-ByGFSWnQ.js → entities-D0qpC3B9.js} +1 -1
- package/web/assets/{erDiagram-Q63AITRT-CRMKCr0m.js → erDiagram-Q63AITRT-NT1La9pi.js} +1 -1
- package/web/assets/{file-viewer-Dqx7DbTw.js → file-viewer-C1N6vaip.js} +1 -1
- package/web/assets/{flowDiagram-23GEKE2U-Drv72N5g.js → flowDiagram-23GEKE2U-CIYWUYkz.js} +1 -1
- package/web/assets/{folder-filter-bar-Bs_uyU0g.js → folder-filter-bar-C_2Mobfq.js} +1 -1
- package/web/assets/{folder-image-BBNRcu1j.js → folder-image-Bz0xznQT.js} +1 -1
- package/web/assets/{folder-landing-0EXAzEpD.js → folder-landing-3gqbGaYS.js} +1 -1
- package/web/assets/{folder-list-Do8Kl8uk.js → folder-list-DDI0TF2e.js} +1 -1
- package/web/assets/{folder-metadata-DncP3Vx2.js → folder-metadata-DjV3ZUra.js} +1 -1
- package/web/assets/{folder-mobile-bar-D-XXKrip.js → folder-mobile-bar-CF4CpJXL.js} +1 -1
- package/web/assets/{folder-plugin-view-DoRQa8Dz.js → folder-plugin-view-C48J0HKe.js} +2 -2
- package/web/assets/{ganttDiagram-NO4QXBWP-DHEt2_9K.js → ganttDiagram-NO4QXBWP-DeUfoXQA.js} +1 -1
- package/web/assets/{gitGraphDiagram-IHSO6WYX-Bt6XsYTq.js → gitGraphDiagram-IHSO6WYX-DMeTgUPh.js} +1 -1
- package/web/assets/{index-7JCizcu7.js → index-CtuOSBHa.js} +2 -2
- package/web/assets/{infoDiagram-FWYZ7A6U-961DCJAH.js → infoDiagram-FWYZ7A6U-DI_P8Ghi.js} +1 -1
- package/web/assets/{ishikawaDiagram-FXEZZL3T-ibSYK50l.js → ishikawaDiagram-FXEZZL3T-B8bM-8CD.js} +1 -1
- package/web/assets/{journeyDiagram-5HDEW3XC-Cd0ZPqw2.js → journeyDiagram-5HDEW3XC-pviYejXU.js} +1 -1
- package/web/assets/{kanban-definition-HUTT4EX6-Bu5skY8G.js → kanban-definition-HUTT4EX6-DfvdDvpU.js} +1 -1
- package/web/assets/{linear-Cf8Xflqn.js → linear-DNOuKTk_.js} +1 -1
- package/web/assets/{mermaid.core-C9iHkrxr.js → mermaid.core-CisVJ_Cs.js} +4 -4
- package/web/assets/{metadata-CLq-ZGmh.js → metadata-C7E_6HIN.js} +1 -1
- package/web/assets/{mindmap-definition-LN4V7U3C-C5bK3O7k.js → mindmap-definition-LN4V7U3C-DzdcaduN.js} +1 -1
- package/web/assets/{pegDiagram-2B236MQR-5rN2nkjz.js → pegDiagram-2B236MQR-D_7xhlXd.js} +1 -1
- package/web/assets/{pieDiagram-ENE6RG2P-DnSBFuIb.js → pieDiagram-ENE6RG2P-CisikHMW.js} +1 -1
- package/web/assets/{project-search-dialog-Bo1JWdqR.js → project-search-dialog-BsHc39D0.js} +1 -1
- package/web/assets/{quadrantDiagram-ABIIQ3AL-xinqVpVM.js → quadrantDiagram-ABIIQ3AL-D6adg-7z.js} +1 -1
- package/web/assets/{railroadDiagram-RFXS5EU6-GsASFEVa.js → railroadDiagram-RFXS5EU6-CyPAHeJ-.js} +1 -1
- package/web/assets/{requirementDiagram-TGXJPOKE-DS5CqNNo.js → requirementDiagram-TGXJPOKE-CgpSiPTv.js} +1 -1
- package/web/assets/{sankeyDiagram-HTMAVEWB-DsnvjCXC.js → sankeyDiagram-HTMAVEWB-BxvReW6S.js} +1 -1
- package/web/assets/{search-BA4r_Yoa.js → search-DEgwpq-P.js} +1 -1
- package/web/assets/{select-D4TpCgnU.js → select-DGaccqVB.js} +1 -1
- package/web/assets/{selection-popup-DIME-60e.js → selection-popup-d94JnDPy.js} +1 -1
- package/web/assets/{sequenceDiagram-DBY2YBRQ-PI0WgJrf.js → sequenceDiagram-DBY2YBRQ-uuplzETI.js} +1 -1
- package/web/assets/{sizeCapture-X5ZJPWSS-Bpul3MSt.js → sizeCapture-X5ZJPWSS-Bi3F7nOa.js} +1 -1
- package/web/assets/{stateDiagram-2N3HPSRC-DZEEP9Z2.js → stateDiagram-2N3HPSRC-DqypF7lE.js} +1 -1
- package/web/assets/stateDiagram-v2-6OUMAXLB-EsEb0a5Q.js +1 -0
- package/web/assets/{swimlanes-5IMT3BWC-_qVjNiCh.js → swimlanes-5IMT3BWC-CGD9YT1l.js} +2 -2
- package/web/assets/swimlanesDiagram-G3AALYLV-DKIYuN5l.js +8 -0
- package/web/assets/{timeline-definition-FHXFAJF6-CJev7rIB.js → timeline-definition-FHXFAJF6-DCjNS9Ol.js} +1 -1
- package/web/assets/{vennDiagram-L72KCM5P-BrTVvREy.js → vennDiagram-L72KCM5P-BJ58yQgD.js} +1 -1
- package/web/assets/{view-context-Co01ON81.js → view-context-BrzQ7WBV.js} +3 -3
- package/web/assets/{viewer-capabilities-C_kjcYcl.js → viewer-capabilities-DCuJdf64.js} +1 -1
- package/web/assets/{wardleyDiagram-EHGQE667-XwMSgrT5.js → wardleyDiagram-EHGQE667-BiLuq9mr.js} +1 -1
- package/web/assets/{xychartDiagram-FW5EYKEG-Be1kFxeC.js → xychartDiagram-FW5EYKEG-DzAZpIRG.js} +1 -1
- package/web/index.html +1 -1
- package/web/assets/channel-DRnAhH31.js +0 -1
- package/web/assets/classDiagram-OUVF2IWQ-BPkIpFlc.js +0 -1
- package/web/assets/classDiagram-v2-EOCWNBFH-BPkIpFlc.js +0 -1
- package/web/assets/client-soK_bLWT.js +0 -5
- package/web/assets/stateDiagram-v2-6OUMAXLB-WAp7-BWX.js +0 -1
- package/web/assets/swimlanesDiagram-G3AALYLV-Dy4wBDSi.js +0 -8
package/README.md
CHANGED
|
@@ -96,6 +96,28 @@ package metadata, not from URL text. The transcripts plugin contract is package
|
|
|
96
96
|
When this file is absent, entity search allows only the workspace opened by
|
|
97
97
|
`knl`. Invalid config fails closed.
|
|
98
98
|
|
|
99
|
+
The config format is published as a JSON Schema (draft 2020-12):
|
|
100
|
+
|
|
101
|
+
- URL: `https://raw.githubusercontent.com/raggle-ai/kennel/main/cli/schemas/config.schema.json`
|
|
102
|
+
- npm: `kennel/config.schema.json` (file `schemas/config.schema.json` in the package)
|
|
103
|
+
|
|
104
|
+
Add `$schema` to the file for editor completion and validation:
|
|
105
|
+
|
|
106
|
+
```json
|
|
107
|
+
{
|
|
108
|
+
"$schema": "https://raw.githubusercontent.com/raggle-ai/kennel/main/cli/schemas/config.schema.json",
|
|
109
|
+
"allowedRoots": ["/path/to/workspace"]
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
The CLI validates the file against this schema each time it reads the config
|
|
114
|
+
and stops with the failing field paths when a value is malformed. Unknown keys
|
|
115
|
+
are rejected. `externalPlugins` records are resolved and written by
|
|
116
|
+
`kennel plugin add` (pinned commit, absolute entry files, export symbols); do
|
|
117
|
+
not write or edit them by hand. To change one, remove the record and add the
|
|
118
|
+
plugin again. The schema checks only the record shape: the install-time checks
|
|
119
|
+
for the cache path, package exports, and imports stay in the CLI.
|
|
120
|
+
|
|
99
121
|
Suggested convention for agents: write generated HTML components to
|
|
100
122
|
`.kennel/preview/<name>.html` and pop them with `knl pop
|
|
101
123
|
.kennel/preview/<name>.html --watch` (reuses 5180), so preview items share one
|
|
@@ -13,6 +13,7 @@ import { homedir, tmpdir } from "node:os";
|
|
|
13
13
|
import { basename, dirname, isAbsolute, join, relative, resolve, } from "node:path";
|
|
14
14
|
import { pathToFileURL, fileURLToPath } from "node:url";
|
|
15
15
|
import { spawnSync } from "node:child_process";
|
|
16
|
+
import { z } from "zod";
|
|
16
17
|
const CONFIG_FILE = join("kennel", "config.json");
|
|
17
18
|
const VALID_ID = /^[a-z][a-z0-9-]*$/u;
|
|
18
19
|
const CORE_IDS = new Set(["agents", "notes"]);
|
|
@@ -57,10 +58,51 @@ function run(command, args, options = {}) {
|
|
|
57
58
|
}
|
|
58
59
|
return result.stdout.trim();
|
|
59
60
|
}
|
|
61
|
+
let configSchema;
|
|
62
|
+
function userConfigSchema() {
|
|
63
|
+
if (!configSchema) {
|
|
64
|
+
const json = JSON.parse(readFileSync(join(cliRoot(), "schemas", "config.schema.json"), "utf8"));
|
|
65
|
+
configSchema = { id: json.$id, schema: z.fromJSONSchema(json) };
|
|
66
|
+
}
|
|
67
|
+
return configSchema;
|
|
68
|
+
}
|
|
69
|
+
function assertUserConfig(value, path) {
|
|
70
|
+
const { id, schema } = userConfigSchema();
|
|
71
|
+
const result = schema.safeParse(value);
|
|
72
|
+
if (result.success)
|
|
73
|
+
return;
|
|
74
|
+
throw new Error(`Invalid Kennel config at ${path} (schema ${id}):\n${describeIssues(result.error.issues).join("\n")}\nexternalPlugins records are managed by \`kennel plugin add\`; remove a malformed record and add the plugin again.`);
|
|
75
|
+
}
|
|
76
|
+
function issuePath(path) {
|
|
77
|
+
return path.reduce((text, key) => typeof key === "number" ? `${text}[${key}]` : text ? `${text}.${String(key)}` : String(key), "") || "(root)";
|
|
78
|
+
}
|
|
79
|
+
function describeIssues(issues, base = [], indent = " ") {
|
|
80
|
+
return issues.flatMap((issue) => {
|
|
81
|
+
const path = [...base, ...issue.path];
|
|
82
|
+
if (issue.code !== "invalid_union" || issue.errors.length === 0)
|
|
83
|
+
return [`${indent}${issuePath(path)}: ${issue.message}`];
|
|
84
|
+
return [
|
|
85
|
+
`${indent}${issuePath(path)}: matches none of the allowed shapes`,
|
|
86
|
+
...issue.errors.flatMap((branch, index) => [
|
|
87
|
+
`${indent} shape ${index + 1}:`,
|
|
88
|
+
...describeIssues(branch, path, `${indent} `),
|
|
89
|
+
]),
|
|
90
|
+
];
|
|
91
|
+
});
|
|
92
|
+
}
|
|
60
93
|
function readJson(path) {
|
|
61
94
|
if (!existsSync(path))
|
|
62
95
|
return {};
|
|
63
|
-
|
|
96
|
+
let value;
|
|
97
|
+
try {
|
|
98
|
+
value = JSON.parse(readFileSync(path, "utf8"));
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
102
|
+
throw new Error(`Invalid Kennel config at ${path}: ${message}`);
|
|
103
|
+
}
|
|
104
|
+
assertUserConfig(value, path);
|
|
105
|
+
return value;
|
|
64
106
|
}
|
|
65
107
|
function writeJsonAtomic(path, value) {
|
|
66
108
|
mkdirSync(dirname(path), { recursive: true });
|
|
@@ -350,19 +392,20 @@ export async function validateExternalPlugin(inputUrl, existing = [], options =
|
|
|
350
392
|
return entry;
|
|
351
393
|
}
|
|
352
394
|
export function readExternalPlugins() {
|
|
353
|
-
|
|
354
|
-
return Array.isArray(config.externalPlugins) ? config.externalPlugins : [];
|
|
395
|
+
return readJson(kennelConfigPath()).externalPlugins ?? [];
|
|
355
396
|
}
|
|
356
397
|
export async function installExternalPlugin(url, options = {}) {
|
|
357
398
|
const path = kennelConfigPath();
|
|
358
399
|
const config = readJson(path);
|
|
359
|
-
const externalPlugins =
|
|
400
|
+
const externalPlugins = config.externalPlugins ?? [];
|
|
360
401
|
let entry;
|
|
361
402
|
try {
|
|
362
403
|
entry = await validateExternalPlugin(url, externalPlugins, options);
|
|
363
404
|
const nextPlugins = [...externalPlugins, entry];
|
|
405
|
+
const nextConfig = { ...config, externalPlugins: nextPlugins };
|
|
406
|
+
assertUserConfig(nextConfig, path);
|
|
364
407
|
await ensureKernel(nextPlugins);
|
|
365
|
-
writeJsonAtomic(path,
|
|
408
|
+
writeJsonAtomic(path, nextConfig);
|
|
366
409
|
}
|
|
367
410
|
catch (error) {
|
|
368
411
|
const message = error instanceof Error ? error.message : String(error);
|