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.
Files changed (96) hide show
  1. package/README.md +22 -0
  2. package/dist/cli/src/plugins/external.js +48 -5
  3. package/dist/core/runtime.js +59 -38485
  4. package/dist/plugins/external.js +48 -5
  5. package/kernel/packages/notes/src/ui/folder-notes-list.tsx +1 -1
  6. package/package.json +4 -2
  7. package/schemas/config.schema.json +114 -0
  8. package/web/assets/{abnfDiagram-VRR7QNED-CDr-U31F.js → abnfDiagram-VRR7QNED-CSaxgLw6.js} +1 -1
  9. package/web/assets/{app-DHGorUqZ.js → app-DoXXGPMx.js} +2 -2
  10. package/web/assets/{app-options-CtkiC8GR.js → app-options-jTBHy0A7.js} +1 -1
  11. package/web/assets/{app-view-header-DbQuD6_F.js → app-view-header-Cpx74SQs.js} +1 -1
  12. package/web/assets/{arc-Cwz5OeLQ.js → arc-DOrTJz--.js} +1 -1
  13. package/web/assets/{architectureDiagram-ZJ3FMSHR-igGC0b-J.js → architectureDiagram-ZJ3FMSHR-EjOjwlGK.js} +1 -1
  14. package/web/assets/{ask-tray-y8nkSKNG.js → ask-tray-DLEoRbpV.js} +1 -1
  15. package/web/assets/{blockDiagram-677ZJIJ3-D4SDltQ_.js → blockDiagram-677ZJIJ3-Dg2LWLOW.js} +1 -1
  16. package/web/assets/{c4Diagram-LMCZKHZV-Br15uN-s.js → c4Diagram-LMCZKHZV-CWHqGPk8.js} +1 -1
  17. package/web/assets/channel-54w4vQjC.js +1 -0
  18. package/web/assets/{chunk-2Q5K7J3B-B0RqrvJA.js → chunk-2Q5K7J3B-Dzz0QWV_.js} +1 -1
  19. package/web/assets/{chunk-32BRIVSS-De9VBEyE.js → chunk-32BRIVSS-BocStooX.js} +1 -1
  20. package/web/assets/{chunk-5VM5RSS4-YIMlZtW3.js → chunk-5VM5RSS4-D8BF5Y5h.js} +1 -1
  21. package/web/assets/{chunk-EX3LRPZG-y9kGcrYi.js → chunk-EX3LRPZG-CWMl9KkL.js} +1 -1
  22. package/web/assets/{chunk-JWPE2WC7-D0A13HAu.js → chunk-JWPE2WC7-BZEr7iFk.js} +1 -1
  23. package/web/assets/{chunk-MOJQB5TN-8v4jL8iu.js → chunk-MOJQB5TN-DbKnLJ33.js} +1 -1
  24. package/web/assets/{chunk-RYQCIY6F-Ri_iNmIp.js → chunk-RYQCIY6F-BF9KWoi2.js} +1 -1
  25. package/web/assets/{chunk-V7JOEXUC-b0mIbG_X.js → chunk-V7JOEXUC-e88zamUH.js} +1 -1
  26. package/web/assets/{chunk-VR4S4FIN-BkTZWt1n.js → chunk-VR4S4FIN-NDHM58HJ.js} +1 -1
  27. package/web/assets/{chunk-XXDRQBXY-D7muOXcd.js → chunk-XXDRQBXY-BtzSzNoD.js} +1 -1
  28. package/web/assets/classDiagram-OUVF2IWQ-Bh9Ib2pw.js +1 -0
  29. package/web/assets/classDiagram-v2-EOCWNBFH-Bh9Ib2pw.js +1 -0
  30. package/web/assets/client-BgUDusrU.js +5 -0
  31. package/web/assets/{client-Bkl3gwZ5.js → client-COaHUqSC.js} +1 -1
  32. package/web/assets/{client-BMso7lHb.js → client-UC06V2VL.js} +1 -1
  33. package/web/assets/{command-CsN8TfJg.js → command-BWtewOrt.js} +1 -1
  34. package/web/assets/{copy-context-DmBNpffM.js → copy-context-YESgZ_hu.js} +1 -1
  35. package/web/assets/{cose-bilkent-JH36ORCC-7hnQZylB.js → cose-bilkent-JH36ORCC-i7x8jZ9M.js} +1 -1
  36. package/web/assets/{cynefin-VYW2F7L2-CTbqXuvk.js → cynefin-VYW2F7L2-D8HPrHMt.js} +1 -1
  37. package/web/assets/{cynefinDiagram-TSTJHNR4-CmIJtocX.js → cynefinDiagram-TSTJHNR4-BtkeCNXb.js} +1 -1
  38. package/web/assets/{dagre-VKFMJZFB-BLPHNs2Y.js → dagre-VKFMJZFB-oIThwshO.js} +1 -1
  39. package/web/assets/{diagram-FQU43EPY-L6FVWAuj.js → diagram-FQU43EPY-DTuhEo03.js} +1 -1
  40. package/web/assets/{diagram-G47NLZAW-Bb26dbIM.js → diagram-G47NLZAW-BcQ_4_fE.js} +1 -1
  41. package/web/assets/{diagram-NH7WQ7WH-BBauwdU-.js → diagram-NH7WQ7WH-BA4VC8Du.js} +1 -1
  42. package/web/assets/{diagram-OA4YK3LP-Dj_9FE7R.js → diagram-OA4YK3LP-BOpyrmty.js} +1 -1
  43. package/web/assets/{diagram-WEI45ONY-Co1MS5BO.js → diagram-WEI45ONY-BzrSPDJ7.js} +1 -1
  44. package/web/assets/{document-_ETc5epn.js → document-BDtU3CbX.js} +3 -3
  45. package/web/assets/{ebnfDiagram-CCIWWBDH-COGAgW5z.js → ebnfDiagram-CCIWWBDH-BNV_4xDp.js} +1 -1
  46. package/web/assets/{entities-ByGFSWnQ.js → entities-D0qpC3B9.js} +1 -1
  47. package/web/assets/{erDiagram-Q63AITRT-CRMKCr0m.js → erDiagram-Q63AITRT-NT1La9pi.js} +1 -1
  48. package/web/assets/{file-viewer-Dqx7DbTw.js → file-viewer-C1N6vaip.js} +1 -1
  49. package/web/assets/{flowDiagram-23GEKE2U-Drv72N5g.js → flowDiagram-23GEKE2U-CIYWUYkz.js} +1 -1
  50. package/web/assets/{folder-filter-bar-Bs_uyU0g.js → folder-filter-bar-C_2Mobfq.js} +1 -1
  51. package/web/assets/{folder-image-BBNRcu1j.js → folder-image-Bz0xznQT.js} +1 -1
  52. package/web/assets/{folder-landing-0EXAzEpD.js → folder-landing-3gqbGaYS.js} +1 -1
  53. package/web/assets/{folder-list-Do8Kl8uk.js → folder-list-DDI0TF2e.js} +1 -1
  54. package/web/assets/{folder-metadata-DncP3Vx2.js → folder-metadata-DjV3ZUra.js} +1 -1
  55. package/web/assets/{folder-mobile-bar-D-XXKrip.js → folder-mobile-bar-CF4CpJXL.js} +1 -1
  56. package/web/assets/{folder-plugin-view-DoRQa8Dz.js → folder-plugin-view-C48J0HKe.js} +2 -2
  57. package/web/assets/{ganttDiagram-NO4QXBWP-DHEt2_9K.js → ganttDiagram-NO4QXBWP-DeUfoXQA.js} +1 -1
  58. package/web/assets/{gitGraphDiagram-IHSO6WYX-Bt6XsYTq.js → gitGraphDiagram-IHSO6WYX-DMeTgUPh.js} +1 -1
  59. package/web/assets/{index-7JCizcu7.js → index-CtuOSBHa.js} +2 -2
  60. package/web/assets/{infoDiagram-FWYZ7A6U-961DCJAH.js → infoDiagram-FWYZ7A6U-DI_P8Ghi.js} +1 -1
  61. package/web/assets/{ishikawaDiagram-FXEZZL3T-ibSYK50l.js → ishikawaDiagram-FXEZZL3T-B8bM-8CD.js} +1 -1
  62. package/web/assets/{journeyDiagram-5HDEW3XC-Cd0ZPqw2.js → journeyDiagram-5HDEW3XC-pviYejXU.js} +1 -1
  63. package/web/assets/{kanban-definition-HUTT4EX6-Bu5skY8G.js → kanban-definition-HUTT4EX6-DfvdDvpU.js} +1 -1
  64. package/web/assets/{linear-Cf8Xflqn.js → linear-DNOuKTk_.js} +1 -1
  65. package/web/assets/{mermaid.core-C9iHkrxr.js → mermaid.core-CisVJ_Cs.js} +4 -4
  66. package/web/assets/{metadata-CLq-ZGmh.js → metadata-C7E_6HIN.js} +1 -1
  67. package/web/assets/{mindmap-definition-LN4V7U3C-C5bK3O7k.js → mindmap-definition-LN4V7U3C-DzdcaduN.js} +1 -1
  68. package/web/assets/{pegDiagram-2B236MQR-5rN2nkjz.js → pegDiagram-2B236MQR-D_7xhlXd.js} +1 -1
  69. package/web/assets/{pieDiagram-ENE6RG2P-DnSBFuIb.js → pieDiagram-ENE6RG2P-CisikHMW.js} +1 -1
  70. package/web/assets/{project-search-dialog-Bo1JWdqR.js → project-search-dialog-BsHc39D0.js} +1 -1
  71. package/web/assets/{quadrantDiagram-ABIIQ3AL-xinqVpVM.js → quadrantDiagram-ABIIQ3AL-D6adg-7z.js} +1 -1
  72. package/web/assets/{railroadDiagram-RFXS5EU6-GsASFEVa.js → railroadDiagram-RFXS5EU6-CyPAHeJ-.js} +1 -1
  73. package/web/assets/{requirementDiagram-TGXJPOKE-DS5CqNNo.js → requirementDiagram-TGXJPOKE-CgpSiPTv.js} +1 -1
  74. package/web/assets/{sankeyDiagram-HTMAVEWB-DsnvjCXC.js → sankeyDiagram-HTMAVEWB-BxvReW6S.js} +1 -1
  75. package/web/assets/{search-BA4r_Yoa.js → search-DEgwpq-P.js} +1 -1
  76. package/web/assets/{select-D4TpCgnU.js → select-DGaccqVB.js} +1 -1
  77. package/web/assets/{selection-popup-DIME-60e.js → selection-popup-d94JnDPy.js} +1 -1
  78. package/web/assets/{sequenceDiagram-DBY2YBRQ-PI0WgJrf.js → sequenceDiagram-DBY2YBRQ-uuplzETI.js} +1 -1
  79. package/web/assets/{sizeCapture-X5ZJPWSS-Bpul3MSt.js → sizeCapture-X5ZJPWSS-Bi3F7nOa.js} +1 -1
  80. package/web/assets/{stateDiagram-2N3HPSRC-DZEEP9Z2.js → stateDiagram-2N3HPSRC-DqypF7lE.js} +1 -1
  81. package/web/assets/stateDiagram-v2-6OUMAXLB-EsEb0a5Q.js +1 -0
  82. package/web/assets/{swimlanes-5IMT3BWC-_qVjNiCh.js → swimlanes-5IMT3BWC-CGD9YT1l.js} +2 -2
  83. package/web/assets/swimlanesDiagram-G3AALYLV-DKIYuN5l.js +8 -0
  84. package/web/assets/{timeline-definition-FHXFAJF6-CJev7rIB.js → timeline-definition-FHXFAJF6-DCjNS9Ol.js} +1 -1
  85. package/web/assets/{vennDiagram-L72KCM5P-BrTVvREy.js → vennDiagram-L72KCM5P-BJ58yQgD.js} +1 -1
  86. package/web/assets/{view-context-Co01ON81.js → view-context-BrzQ7WBV.js} +3 -3
  87. package/web/assets/{viewer-capabilities-C_kjcYcl.js → viewer-capabilities-DCuJdf64.js} +1 -1
  88. package/web/assets/{wardleyDiagram-EHGQE667-XwMSgrT5.js → wardleyDiagram-EHGQE667-BiLuq9mr.js} +1 -1
  89. package/web/assets/{xychartDiagram-FW5EYKEG-Be1kFxeC.js → xychartDiagram-FW5EYKEG-DzAZpIRG.js} +1 -1
  90. package/web/index.html +1 -1
  91. package/web/assets/channel-DRnAhH31.js +0 -1
  92. package/web/assets/classDiagram-OUVF2IWQ-BPkIpFlc.js +0 -1
  93. package/web/assets/classDiagram-v2-EOCWNBFH-BPkIpFlc.js +0 -1
  94. package/web/assets/client-soK_bLWT.js +0 -5
  95. package/web/assets/stateDiagram-v2-6OUMAXLB-WAp7-BWX.js +0 -1
  96. 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
- return JSON.parse(readFileSync(path, "utf8"));
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
- const config = readJson(kennelConfigPath());
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 = Array.isArray(config.externalPlugins) ? config.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, { ...config, externalPlugins: nextPlugins });
408
+ writeJsonAtomic(path, nextConfig);
366
409
  }
367
410
  catch (error) {
368
411
  const message = error instanceof Error ? error.message : String(error);