@twentyfirstmedia/ui 0.0.0-stage → 0.1.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.
Files changed (56) hide show
  1. package/LICENSE +30 -0
  2. package/README.md +43 -2
  3. package/dist/add.d.ts +10 -0
  4. package/dist/add.d.ts.map +1 -0
  5. package/dist/add.js +28 -0
  6. package/dist/add.js.map +1 -0
  7. package/dist/diff.d.ts +6 -0
  8. package/dist/diff.d.ts.map +1 -0
  9. package/dist/diff.js +57 -0
  10. package/dist/diff.js.map +1 -0
  11. package/dist/index.d.ts +10 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +160 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/init.d.ts +12 -0
  16. package/dist/init.d.ts.map +1 -0
  17. package/dist/init.js +79 -0
  18. package/dist/init.js.map +1 -0
  19. package/dist/knowledge.d.ts +124 -0
  20. package/dist/knowledge.d.ts.map +1 -0
  21. package/dist/knowledge.js +494 -0
  22. package/dist/knowledge.js.map +1 -0
  23. package/dist/knowledge.json +1 -0
  24. package/dist/list.d.ts +3 -0
  25. package/dist/list.d.ts.map +1 -0
  26. package/dist/list.js +21 -0
  27. package/dist/list.js.map +1 -0
  28. package/dist/mcp-init.d.ts +21 -0
  29. package/dist/mcp-init.d.ts.map +1 -0
  30. package/dist/mcp-init.js +114 -0
  31. package/dist/mcp-init.js.map +1 -0
  32. package/dist/mcp.d.ts +71 -0
  33. package/dist/mcp.d.ts.map +1 -0
  34. package/dist/mcp.js +746 -0
  35. package/dist/mcp.js.map +1 -0
  36. package/dist/project.d.ts +14 -0
  37. package/dist/project.d.ts.map +1 -0
  38. package/dist/project.js +31 -0
  39. package/dist/project.js.map +1 -0
  40. package/dist/shared/theme.d.ts +61 -0
  41. package/dist/shared/theme.d.ts.map +1 -0
  42. package/dist/shared/theme.js +200 -0
  43. package/dist/shared/theme.js.map +1 -0
  44. package/dist/source.d.ts +35 -0
  45. package/dist/source.d.ts.map +1 -0
  46. package/dist/source.js +229 -0
  47. package/dist/source.js.map +1 -0
  48. package/dist/theme.d.ts +18 -0
  49. package/dist/theme.d.ts.map +1 -0
  50. package/dist/theme.js +65 -0
  51. package/dist/theme.js.map +1 -0
  52. package/dist/util.d.ts +21 -0
  53. package/dist/util.d.ts.map +1 -0
  54. package/dist/util.js +29 -0
  55. package/dist/util.js.map +1 -0
  56. package/package.json +47 -3
package/LICENSE ADDED
@@ -0,0 +1,30 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Twentyfirst Media
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ ---
24
+
25
+ The kits bundle these fonts, each under the SIL Open Font License 1.1; their license
26
+ files ship next to the fonts in each package's `dist/fonts`:
27
+
28
+ - Plus Jakarta Sans (Halo)
29
+ - IBM Plex Mono (Halo)
30
+ - Geist and Geist Mono (Pro)
package/README.md CHANGED
@@ -1,3 +1,44 @@
1
- # Temporary Holding Version
1
+ # @twentyfirstmedia/ui
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ The CLI and MCP server of the [Twentyfirst UI](https://ui.twentyfirst.media) kits.
4
+
5
+ [Website](https://ui.twentyfirst.media) · [Halo docs](https://ui.twentyfirst.media/halo/) · [Pro docs](https://ui.twentyfirst.media/pro/) · [GitHub](https://github.com/twentyfirstmedia/ui) · [llms.txt](https://ui.twentyfirst.media/llms.txt)
6
+
7
+ ## Set up an app
8
+
9
+ ```sh
10
+ npx @twentyfirstmedia/ui init --kit halo # or pro; --both loads both kits
11
+ npx @twentyfirstmedia/ui add DataTable # copy a component into components/ui to own it
12
+ npx @twentyfirstmedia/ui list # every component, copied ones marked
13
+ npx @twentyfirstmedia/ui diff DataTable # compare your copy with the package
14
+ ```
15
+
16
+ `init` installs the kit, imports its styles (and the Tailwind v4 preset when the app uses Tailwind), creates `components/ui-root.tsx` with the `UIProvider` and wires up the Next.js layout. Running it again changes nothing.
17
+
18
+ ## MCP server for coding agents
19
+
20
+ ![An agent using the MCP server](https://raw.githubusercontent.com/twentyfirstmedia/ui/main/.github/assets/agents-light.png)
21
+
22
+ ```sh
23
+ npx @twentyfirstmedia/ui mcp init # Claude Code, Cursor, VS Code + AGENTS.md rules
24
+ claude mcp add twentyfirst-ui -- npx -y @twentyfirstmedia/ui mcp --kit halo
25
+ ```
26
+
27
+ A stdio MCP server with the bundled docs of this version: offline, no account, no runtime dependencies.
28
+
29
+ | Tool | Returns |
30
+ | --- | --- |
31
+ | `search_docs` | Matching components, patterns, guides, tokens and icons |
32
+ | `list_components` | Every component page by group |
33
+ | `get_component` | Import, description, example code and props |
34
+ | `get_pattern` | A complete screen with its code |
35
+ | `get_guide` | Installation, CLI, theming, AI agents, status and approvals |
36
+ | `get_tokens` | Token names with Halo and Pro values |
37
+ | `list_icons` | Every valid icon name |
38
+ | `check_usage` | Unknown components, props or icons, missing required props, colour literals |
39
+
40
+ Every page is also a resource (`twentyfirst-ui://components/DataTable`), and the prompts `build_screen` and `review_ui` start the two most common jobs. Docs: [AI agents and MCP](https://ui.twentyfirst.media/halo/ai/).
41
+
42
+ ## License
43
+
44
+ [MIT](https://github.com/twentyfirstmedia/ui/blob/main/LICENSE) © Twentyfirst Media. Fonts under the SIL Open Font License 1.1.
package/dist/add.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { type Logger } from "./util.js";
2
+ export interface AddOptions {
3
+ cwd: string;
4
+ components: string[];
5
+ overwrite?: boolean;
6
+ log: Logger;
7
+ }
8
+ export declare function targetPath(cwd: string, dir: string, name: string): string;
9
+ export declare function add(o: AddOptions): string[];
10
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../src/add.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,MAAM,EAA4B,MAAM,WAAW,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAqB3C"}
package/dist/add.js ADDED
@@ -0,0 +1,28 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join, relative } from "node:path";
3
+ import { buildCopy, loadCore } from "./source.js";
4
+ import { kebab, readConfig, write } from "./util.js";
5
+ export function targetPath(cwd, dir, name) {
6
+ return join(cwd, dir, `${kebab(name)}.tsx`);
7
+ }
8
+ export function add(o) {
9
+ const cfg = readConfig(o.cwd);
10
+ const dir = cfg?.components ?? "components/ui";
11
+ const core = loadCore(o.cwd);
12
+ const written = [];
13
+ for (const name of o.components) {
14
+ const copy = buildCopy(core, name);
15
+ const path = targetPath(o.cwd, dir, name);
16
+ if (existsSync(path) && !o.overwrite) {
17
+ o.log.warn(` · ${relative(o.cwd, path)} exists; use --overwrite to replace it`);
18
+ continue;
19
+ }
20
+ write(path, copy.content);
21
+ written.push(path);
22
+ o.log.log(` ✓ ${relative(o.cwd, path)}`);
23
+ }
24
+ if (written.length)
25
+ o.log.log(`\nImport from the copy instead of the package, e.g. import { ${o.components[0]} } from "@/${dir}/${kebab(o.components[0])}";`);
26
+ return written;
27
+ }
28
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../src/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAe,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AASlE,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,GAAW,EAAE,IAAY;IAC/D,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAa;IAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,GAAG,EAAE,UAAU,IAAI,eAAe,CAAC;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACrC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACjF,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM;QAChB,CAAC,CAAC,GAAG,CAAC,GAAG,CACP,gEAAgE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAW,CAAC,IAAI,CACzI,CAAC;IACJ,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import { type Logger } from "./util.js";
2
+ /** Line diff (LCS) as unified-style lines prefixed with " ", "-" or "+". */
3
+ export declare function lineDiff(a: string[], b: string[]): string[];
4
+ /** Shows how the local copy differs from the current package source. Returns the number of changed lines. */
5
+ export declare function diff(cwd: string, name: string, log: Logger): number;
6
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,MAAM,EAAoB,MAAM,WAAW,CAAC;AAE1D,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAwB3D;AAKD,6GAA6G;AAC7G,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAqBnE"}
package/dist/diff.js ADDED
@@ -0,0 +1,57 @@
1
+ import { relative } from "node:path";
2
+ import { buildCopy, loadCore } from "./source.js";
3
+ import { targetPath } from "./add.js";
4
+ import { read, readConfig } from "./util.js";
5
+ /** Line diff (LCS) as unified-style lines prefixed with " ", "-" or "+". */
6
+ export function lineDiff(a, b) {
7
+ const n = a.length, m = b.length;
8
+ const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
9
+ for (let i = n - 1; i >= 0; i--)
10
+ for (let j = m - 1; j >= 0; j--)
11
+ dp[i][j] =
12
+ a[i] === b[j]
13
+ ? dp[i + 1][j + 1] + 1
14
+ : Math.max(dp[i + 1][j], dp[i][j + 1]);
15
+ const out = [];
16
+ let i = 0, j = 0;
17
+ while (i < n && j < m) {
18
+ if (a[i] === b[j]) {
19
+ out.push(" " + a[i]);
20
+ i++;
21
+ j++;
22
+ }
23
+ else if (dp[i + 1][j] >= dp[i][j + 1])
24
+ out.push("-" + a[i++]);
25
+ else
26
+ out.push("+" + b[j++]);
27
+ }
28
+ while (i < n)
29
+ out.push("-" + a[i++]);
30
+ while (j < m)
31
+ out.push("+" + b[j++]);
32
+ return out;
33
+ }
34
+ const body = (s) => s.split("\n").filter((l) => !/^\/\* (\w+: copied from|`twentyfirst-ui diff)/.test(l));
35
+ /** Shows how the local copy differs from the current package source. Returns the number of changed lines. */
36
+ export function diff(cwd, name, log) {
37
+ const dir = readConfig(cwd)?.components ?? "components/ui";
38
+ const path = targetPath(cwd, dir, name);
39
+ const local = read(path);
40
+ if (local == null)
41
+ throw new Error(`${relative(cwd, path)} does not exist. Add it with \`twentyfirst-ui add ${name}\`.`);
42
+ const upstream = buildCopy(loadCore(cwd), name).content;
43
+ const lines = lineDiff(body(upstream), body(local));
44
+ const changed = lines.filter((l) => l[0] !== " ");
45
+ if (!changed.length) {
46
+ log.log(`${name}: no changes against the package.`);
47
+ return 0;
48
+ }
49
+ log.log(`--- ${name} (package)\n+++ ${relative(cwd, path)} (yours)`);
50
+ lines.forEach((l, k) => {
51
+ const near = lines.slice(Math.max(0, k - 2), k + 3).some((x) => x[0] !== " ");
52
+ if (near)
53
+ log.log(l);
54
+ });
55
+ return changed.length;
56
+ }
57
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { type Logger } from "./util.js";
3
+ export declare function parseArgs(argv: string[]): {
4
+ cmd: string;
5
+ args: string[];
6
+ flags: Record<string, string | boolean>;
7
+ };
8
+ /** Exit code; a promise while the MCP server runs (it resolves when stdin ends). */
9
+ export declare function run(argv: string[], log?: Logger): number | Promise<number>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAWA,OAAO,EAA2B,KAAK,MAAM,EAAc,MAAM,WAAW,CAAC;AAsB7E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CACzC,CAsBA;AASD,oFAAoF;AACpF,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuEzF"}
package/dist/index.js ADDED
@@ -0,0 +1,160 @@
1
+ #!/usr/bin/env node
2
+ import { realpathSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { add } from "./add.js";
6
+ import { diff } from "./diff.js";
7
+ import { init } from "./init.js";
8
+ import { list } from "./list.js";
9
+ import { theme } from "./theme.js";
10
+ import { createServer, loadKnowledge, serveStdio } from "./mcp.js";
11
+ import { mcpInit, parseClients } from "./mcp-init.js";
12
+ import { consoleLogger, readConfig } from "./util.js";
13
+ const HELP = `twentyfirst-ui: set up and copy components of the Twentyfirst UI kits
14
+
15
+ Usage
16
+ twentyfirst-ui init [--kit halo|pro] [--both] [--no-install] [--components components/ui]
17
+ twentyfirst-ui add <Component…> [--overwrite]
18
+ twentyfirst-ui list
19
+ twentyfirst-ui diff <Component>
20
+ twentyfirst-ui theme <preset|#colour[,#dark]|shadcn-theme.css> [--kit halo|pro] [--both] [--out app/theme.css]
21
+ write a shadcn-style theme (presets: blue, violet, emerald, orange, rose, teal) and import it
22
+ twentyfirst-ui mcp [--kit halo|pro]
23
+ start the MCP server for coding agents (stdio)
24
+ twentyfirst-ui mcp init [--client claude,cursor,vscode|all] [--kit halo|pro] [--no-rules]
25
+ register the MCP server in .mcp.json, .cursor/mcp.json and .vscode/mcp.json
26
+ and add the kit rules to AGENTS.md (and CLAUDE.md when it exists)
27
+
28
+ Options
29
+ --cwd <dir> run in another directory
30
+ --kit defaults to the kit in twentyfirst.json, else halo
31
+ `;
32
+ export function parseArgs(argv) {
33
+ const [cmd = "help", ...rest] = argv;
34
+ const args = [];
35
+ const flags = {};
36
+ for (let i = 0; i < rest.length; i++) {
37
+ const a = rest[i];
38
+ if (a.startsWith("--no-"))
39
+ flags[a.slice(5)] = false;
40
+ else if (a.startsWith("--")) {
41
+ const [k, v] = a.slice(2).split("=");
42
+ const next = rest[i + 1];
43
+ if (v !== undefined)
44
+ flags[k] = v;
45
+ else if (next &&
46
+ !next.startsWith("--") &&
47
+ ["kit", "cwd", "components", "out", "client"].includes(k)) {
48
+ flags[k] = next;
49
+ i++;
50
+ }
51
+ else
52
+ flags[k] = true;
53
+ }
54
+ else
55
+ args.push(a);
56
+ }
57
+ return { cmd, args, flags };
58
+ }
59
+ /** The kit from --kit, else twentyfirst.json, else halo. */
60
+ function resolveKit(flag, cwd) {
61
+ const kit = typeof flag === "string" ? flag : (readConfig(cwd)?.kit ?? "halo");
62
+ if (kit !== "halo" && kit !== "pro")
63
+ throw new Error(`--kit must be halo or pro, not ${kit}`);
64
+ return kit;
65
+ }
66
+ /** Exit code; a promise while the MCP server runs (it resolves when stdin ends). */
67
+ export function run(argv, log = consoleLogger) {
68
+ const { cmd, args, flags } = parseArgs(argv);
69
+ const cwd = resolve(typeof flags.cwd === "string" ? flags.cwd : process.cwd());
70
+ try {
71
+ switch (cmd) {
72
+ case "init": {
73
+ const kit = (flags.kit ?? "halo");
74
+ if (kit !== "halo" && kit !== "pro")
75
+ throw new Error(`--kit must be halo or pro, not ${String(kit)}`);
76
+ init({
77
+ cwd,
78
+ kit,
79
+ both: flags.both === true,
80
+ install: flags.install !== false,
81
+ components: typeof flags.components === "string" ? flags.components : undefined,
82
+ log,
83
+ });
84
+ return 0;
85
+ }
86
+ case "add":
87
+ if (!args.length)
88
+ throw new Error("Name at least one component: twentyfirst-ui add Button");
89
+ add({ cwd, components: args, overwrite: flags.overwrite === true, log });
90
+ return 0;
91
+ case "list":
92
+ list(cwd, log);
93
+ return 0;
94
+ case "diff":
95
+ if (!args[0])
96
+ throw new Error("Name a component: twentyfirst-ui diff Button");
97
+ diff(cwd, args[0], log);
98
+ return 0;
99
+ case "theme": {
100
+ if (!args[0])
101
+ throw new Error("Name a preset, a colour or a shadcn theme file: twentyfirst-ui theme blue | #2563eb | theme.css");
102
+ const kit = typeof flags.kit === "string" ? resolveKit(flags.kit, cwd) : undefined;
103
+ theme({
104
+ cwd,
105
+ source: args[0],
106
+ kit,
107
+ both: flags.both === true ? true : undefined,
108
+ out: typeof flags.out === "string" ? flags.out : undefined,
109
+ log,
110
+ });
111
+ return 0;
112
+ }
113
+ case "mcp": {
114
+ const sub = args[0];
115
+ const kit = resolveKit(flags.kit, cwd);
116
+ if (sub === "init") {
117
+ mcpInit({
118
+ cwd,
119
+ kit,
120
+ clients: parseClients(flags.client),
121
+ rules: flags.rules !== false,
122
+ log,
123
+ });
124
+ return 0;
125
+ }
126
+ if (sub)
127
+ throw new Error(`Unknown mcp command "${sub}". Use: twentyfirst-ui mcp [init]`);
128
+ const server = createServer(loadKnowledge(), { kit });
129
+ return serveStdio(server, { onError: (m) => log.warn(m) }).then(() => 0);
130
+ }
131
+ default:
132
+ log.log(HELP);
133
+ return cmd === "help" || flags.help ? 0 : 1;
134
+ }
135
+ }
136
+ catch (e) {
137
+ log.warn(`Error: ${e.message}`);
138
+ return 1;
139
+ }
140
+ }
141
+ const stderrLogger = {
142
+ log: (m) => console.error(m),
143
+ warn: (m) => console.error(m),
144
+ };
145
+ function isMain() {
146
+ try {
147
+ return (!!process.argv[1] &&
148
+ realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1]));
149
+ }
150
+ catch {
151
+ return false;
152
+ }
153
+ }
154
+ if (isMain()) {
155
+ // the MCP server owns stdout; everything else goes to stderr there
156
+ const argv = process.argv.slice(2);
157
+ const log = argv[0] === "mcp" && argv[1] !== "init" ? stderrLogger : consoleLogger;
158
+ void Promise.resolve(run(argv, log)).then((code) => process.exit(code));
159
+ }
160
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,aAAa,EAAyB,UAAU,EAAE,MAAM,WAAW,CAAC;AAE7E,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;CAkBZ,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAc;IAKtC,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAqC,EAAE,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAC5B,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;aAChD,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,SAAS;gBAAE,KAAK,CAAC,CAAW,CAAC,GAAG,CAAC,CAAC;iBACvC,IACH,IAAI;gBACJ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBACtB,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAW,CAAC,EACnE,CAAC;gBACD,KAAK,CAAC,CAAW,CAAC,GAAG,IAAI,CAAC;gBAC1B,CAAC,EAAE,CAAC;YACN,CAAC;;gBAAM,KAAK,CAAC,CAAW,CAAC,GAAG,IAAI,CAAC;QACnC,CAAC;;YAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,4DAA4D;AAC5D,SAAS,UAAU,CAAC,IAAkC,EAAE,GAAW;IACjE,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;IAC/E,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;IAC9F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,GAAG,CAAC,IAAc,EAAE,MAAc,aAAa;IAC7D,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,MAAM,CAAQ,CAAC;gBACzC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK;oBACjC,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnE,IAAI,CAAC;oBACH,GAAG;oBACH,GAAG;oBACH,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI;oBACzB,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,KAAK;oBAChC,UAAU,EAAE,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;oBAC/E,GAAG;iBACJ,CAAC,CAAC;gBACH,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,KAAK;gBACR,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;gBAC5F,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACzE,OAAO,CAAC,CAAC;YACX,KAAK,MAAM;gBACT,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACf,OAAO,CAAC,CAAC;YACX,KAAK,MAAM;gBACT,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;gBAC9E,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACxB,OAAO,CAAC,CAAC;YACX,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBACV,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;gBACJ,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACnF,KAAK,CAAC;oBACJ,GAAG;oBACH,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;oBACf,GAAG;oBACH,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;oBAC5C,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;oBAC1D,GAAG;iBACJ,CAAC,CAAC;gBACH,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACvC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBACnB,OAAO,CAAC;wBACN,GAAG;wBACH,GAAG;wBACH,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;wBACnC,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK;wBAC5B,GAAG;qBACJ,CAAC,CAAC;oBACH,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,IAAI,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,mCAAmC,CAAC,CAAC;gBACzF,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBACtD,OAAO,UAAU,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;YACD;gBACE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,UAAW,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAW;IAC3B,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;CAC9B,CAAC;AAEF,SAAS,MAAM;IACb,IAAI,CAAC;QACH,OAAO,CACL,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC/E,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,MAAM,EAAE,EAAE,CAAC;IACb,mEAAmE;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;IAC3F,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1E,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import { type Config, type Kit, type Logger } from "./util.js";
2
+ export interface InitOptions {
3
+ cwd: string;
4
+ kit: Kit;
5
+ /** Load both kits and switch at runtime. */
6
+ both?: boolean;
7
+ install?: boolean;
8
+ components?: string;
9
+ log: Logger;
10
+ }
11
+ export declare function init(o: InitOptions): Config;
12
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,MAAM,EAAE,KAAK,GAAG,EAAE,KAAK,MAAM,EAAsB,MAAM,WAAW,CAAC;AAEhG,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,GAAG,CAAC;IACT,4CAA4C;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAYD,wBAAgB,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAyE3C"}
package/dist/init.js ADDED
@@ -0,0 +1,79 @@
1
+ import { execSync } from "node:child_process";
2
+ import { join, relative } from "node:path";
3
+ import { detect, installCommand } from "./project.js";
4
+ import { CONFIG_FILE, SCOPE, read, write } from "./util.js";
5
+ const PROVIDER = (kit, both) => `"use client";
6
+ import type { ReactNode } from "react";
7
+ import { UIProvider } from "${SCOPE}/${kit}";
8
+
9
+ /** Kit settings for the whole app. Created by \`twentyfirst-ui init\`. */
10
+ export function UIRoot({ children }: { children: ReactNode }) {
11
+ return <UIProvider${both ? ` kit="${kit}"` : ""}>{children}</UIProvider>;
12
+ }
13
+ `;
14
+ export function init(o) {
15
+ const p = detect(o.cwd);
16
+ const pkgs = o.both ? [`${SCOPE}/halo`, `${SCOPE}/pro`] : [`${SCOPE}/${o.kit}`];
17
+ const done = [];
18
+ if (o.install !== false) {
19
+ const cmd = installCommand(p.pm, pkgs);
20
+ o.log.log(`$ ${cmd}`);
21
+ execSync(cmd, { cwd: o.cwd, stdio: "inherit" });
22
+ done.push(`installed ${pkgs.join(", ")}`);
23
+ }
24
+ // stylesheet
25
+ const css = p.css ?? join(o.cwd, p.srcDir ? "src/app/globals.css" : "app/globals.css");
26
+ let sheet = read(css) ?? "";
27
+ const styles = o.both ? `${SCOPE}/ui-core/themes.css` : `${SCOPE}/${o.kit}/styles.css`;
28
+ if (!sheet.includes(`${SCOPE}/`)) {
29
+ const imports = [`@import "${styles}";`];
30
+ if (p.usesTailwind)
31
+ imports.push(`@import "${SCOPE}/${o.kit}/tailwind.css";`);
32
+ if (p.usesTailwind) {
33
+ sheet = sheet.replace(/(@import\s+["']tailwindcss["'];?\s*\n?)/, (m) => `${m.endsWith("\n") ? m : m + "\n"}${imports.join("\n")}\n`);
34
+ }
35
+ else
36
+ sheet = imports.join("\n") + "\n" + sheet;
37
+ write(css, sheet);
38
+ done.push(`${relative(o.cwd, css)}: ${imports.length > 1 ? "kit styles and Tailwind preset" : "kit styles"}`);
39
+ }
40
+ // provider
41
+ const componentsDir = o.components ?? (p.srcDir ? "src/components/ui" : "components/ui");
42
+ const rootDir = join(o.cwd, componentsDir, "..");
43
+ const providerPath = join(rootDir, "ui-root.tsx");
44
+ if (!read(providerPath)) {
45
+ write(providerPath, PROVIDER(o.kit, !!o.both));
46
+ done.push(`${relative(o.cwd, providerPath)}: UIRoot with UIProvider`);
47
+ }
48
+ // layout: wrap children, set data-kit on <html> so the first paint is right
49
+ if (p.layout) {
50
+ let layout = read(p.layout);
51
+ if (!layout.includes("UIRoot")) {
52
+ const importPath = "./" +
53
+ relative(join(p.layout, ".."), providerPath)
54
+ .replace(/\\/g, "/")
55
+ .replace(/\.tsx$/, "");
56
+ const spec = importPath.startsWith("./..") ? importPath.slice(2) : importPath;
57
+ layout = layout.replace(/(\n?)((?:import[^\n]*\n)+)/, (_m, nl, imps) => `${nl}${imps}import { UIRoot } from "${spec}";\n`);
58
+ layout = layout.replace(/\{children\}/, "<UIRoot>{children}</UIRoot>");
59
+ layout = layout.replace(/<html(\s|>)/, (_m, c) => `<html data-kit="${o.kit}"${c}`);
60
+ write(p.layout, layout);
61
+ done.push(`${relative(o.cwd, p.layout)}: UIRoot around the app, data-kit on <html>`);
62
+ }
63
+ }
64
+ const config = {
65
+ kit: o.kit,
66
+ components: componentsDir,
67
+ css: relative(o.cwd, css),
68
+ };
69
+ if (o.both)
70
+ config.both = true;
71
+ write(join(o.cwd, CONFIG_FILE), JSON.stringify(config, null, 2) + "\n");
72
+ done.push(`${CONFIG_FILE}: settings for \`add\` and \`diff\``);
73
+ for (const d of done)
74
+ o.log.log(` ✓ ${d}`);
75
+ if (o.install === false)
76
+ o.log.log(` · then install: ${installCommand(p.pm, pkgs)}`);
77
+ return config;
78
+ }
79
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * The docs as data: guides, components, patterns, props, tokens and icons of both kits.
3
+ *
4
+ * One source for three readers: the docs site (Markdown version of every page, llms.txt,
5
+ * llms-full.txt), the MCP server (`twentyfirst-ui mcp`) and agents reading either. The data is
6
+ * collected at build time by scripts/knowledge.ts; this module only renders and searches it.
7
+ * It has no imports, so node can also load it straight from scripts/.
8
+ */
9
+ export type KitName = "halo" | "pro";
10
+ export interface Prop {
11
+ name: string;
12
+ type: string;
13
+ optional: boolean;
14
+ doc: string;
15
+ }
16
+ /** A component page or a pattern page of the docs. */
17
+ export interface Entry {
18
+ name: string;
19
+ title: string;
20
+ group: string;
21
+ /** First sentence of the description. */
22
+ summary: string;
23
+ /** Markdown. */
24
+ description: string;
25
+ /** Kit components the example uses (the props of these are documented on the page). */
26
+ components: string[];
27
+ /** The example, importing from @twentyfirstmedia/ui-core. */
28
+ code: string;
29
+ /** Path below /<kit>/, e.g. "components/Button". */
30
+ path: string;
31
+ }
32
+ export interface Guide {
33
+ slug: string;
34
+ title: string;
35
+ description: string;
36
+ /** Markdown with {{kit}}, {{Kit}}, {{other}}, {{Other}}, {{site}} placeholders. */
37
+ markdown: string;
38
+ }
39
+ export type TokenValue = string | {
40
+ light: string;
41
+ dark: string;
42
+ };
43
+ export interface Token {
44
+ name: string;
45
+ value: TokenValue;
46
+ usage?: string;
47
+ }
48
+ export interface KitInfo {
49
+ name: KitName;
50
+ label: string;
51
+ package: string;
52
+ tagline: string;
53
+ defaultTheme: string;
54
+ defaultDensity: string;
55
+ tokens: Record<string, Token[]>;
56
+ }
57
+ export interface Knowledge {
58
+ version: string;
59
+ /** Site URL including the base path, without a trailing slash. */
60
+ site: string;
61
+ kits: KitInfo[];
62
+ guides: Guide[];
63
+ components: Entry[];
64
+ patterns: Entry[];
65
+ props: Record<string, Prop[]>;
66
+ /** Source file → exported component names. */
67
+ exports: Record<string, string[]>;
68
+ /** Everything else the packages export: provider, hooks, formatters, Icon. */
69
+ utilities: string[];
70
+ icons: string[];
71
+ }
72
+ export declare const PRODUCT = "Twentyfirst UI";
73
+ export declare const TOKEN_GROUPS: {
74
+ group: string;
75
+ title: string;
76
+ }[];
77
+ export declare function summaryOf(markdown: string): string;
78
+ /** Markdown inline syntax removed, for meta descriptions and one-line summaries. */
79
+ export declare function plain(s: string): string;
80
+ export declare function kitInfo(k: Knowledge, kit: KitName): KitInfo;
81
+ export declare function forKit(k: Knowledge, text: string, kit: KitName): string;
82
+ /** Example code as an app writes it: imports from the kit package. */
83
+ export declare function appCode(code: string, kit: KitName): string;
84
+ export declare function pageUrl(k: Knowledge, kit: KitName, path: string): string;
85
+ /** The Markdown twin of a page: /halo/components/Button/ → /halo/components/Button.md */
86
+ export declare function mdPath(kit: KitName, path: string): string;
87
+ export declare function mdUrl(k: Knowledge, kit: KitName, path: string): string;
88
+ export declare function allEntries(k: Knowledge): Entry[];
89
+ /** An entry by page name, title or any component it documents ("tabpanel" finds Tabs). */
90
+ export declare function findEntry(k: Knowledge, name: string): Entry | undefined;
91
+ export declare function findGuide(k: Knowledge, slug: string): Guide | undefined;
92
+ export declare function exportedNames(k: Knowledge): Set<string>;
93
+ export declare function propsMarkdown(k: Knowledge, component: string): string;
94
+ export declare function entryMarkdown(k: Knowledge, e: Entry, kit: KitName): string;
95
+ export declare function tokensMarkdown(k: Knowledge, group?: string): string;
96
+ export declare function guideMarkdown(k: Knowledge, g: Guide, kit: KitName): string;
97
+ /** /halo/components.md: every component by group with its one-line summary. */
98
+ export declare function componentsIndexMarkdown(k: Knowledge, kit: KitName): string;
99
+ /** Rules an agent should follow when it writes code with the kits. */
100
+ export declare function agentRules(kit?: KitName | "both"): string;
101
+ export declare function overviewMarkdown(k: Knowledge, kit: KitName): string;
102
+ /** llms.txt (llmstxt.org): what the kits are, then a link list of every page's Markdown. */
103
+ export declare function llmsTxt(k: Knowledge): string;
104
+ /** llms-full.txt: every guide and every component page in one file (patterns are linked). */
105
+ export declare function llmsFull(k: Knowledge): string;
106
+ export interface Hit {
107
+ kind: "component" | "pattern" | "guide" | "token" | "icon";
108
+ name: string;
109
+ title: string;
110
+ summary: string;
111
+ score: number;
112
+ }
113
+ export declare function search(k: Knowledge, query: string, limit?: number): Hit[];
114
+ export interface Finding {
115
+ line: number;
116
+ severity: "error" | "warning";
117
+ message: string;
118
+ }
119
+ /**
120
+ * A quick check of code that uses the kits: unknown components and props, missing required props,
121
+ * unknown icon names, colour literals and arbitrary Tailwind values. Heuristic, not a type checker.
122
+ */
123
+ export declare function checkUsage(k: Knowledge, code: string): Finding[];
124
+ //# sourceMappingURL=knowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../src/knowledge.ts"],"names":[],"mappings":"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"}