@twentyfirstmedia/ui 0.0.0-stage → 0.1.1

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 +72 -0
  33. package/dist/mcp.d.ts.map +1 -0
  34. package/dist/mcp.js +768 -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/dist/list.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { type Logger } from "./util.js";
2
+ export declare function list(cwd: string, log: Logger): Map<string, string[]>;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,WAAW,CAAC;AAEpD,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAgBpE"}
package/dist/list.js ADDED
@@ -0,0 +1,21 @@
1
+ import { existsSync } from "node:fs";
2
+ import { loadCore } from "./source.js";
3
+ import { targetPath } from "./add.js";
4
+ import { readConfig } from "./util.js";
5
+ export function list(cwd, log) {
6
+ const core = loadCore(cwd);
7
+ const dir = readConfig(cwd)?.components ?? "components/ui";
8
+ const groups = new Map();
9
+ for (const [name, file] of core.components)
10
+ groups.set(file, [...(groups.get(file) ?? []), name]);
11
+ for (const [file, names] of groups) {
12
+ log.log(`${file}`);
13
+ log.log(" " +
14
+ names
15
+ .sort()
16
+ .map((n) => (existsSync(targetPath(cwd, dir, n)) ? `${n} (added)` : n))
17
+ .join(", "));
18
+ }
19
+ return groups;
20
+ }
21
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAe,UAAU,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,GAAW;IAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,IAAI,eAAe,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU;QAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAClG,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACnC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,CACL,IAAI;YACF,KAAK;iBACF,IAAI,EAAE;iBACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACtE,IAAI,CAAC,IAAI,CAAC,CAChB,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type KitName } from "./knowledge.js";
2
+ import { type Logger } from "./util.js";
3
+ export type Client = "claude" | "cursor" | "vscode";
4
+ export declare const CLIENTS: Client[];
5
+ export declare const serverArgs: (kit: KitName) => string[];
6
+ export declare const RULES_START = "<!-- twentyfirst-ui:start -->";
7
+ export declare const RULES_END = "<!-- twentyfirst-ui:end -->";
8
+ export declare function rulesBlock(kit: KitName): string;
9
+ /** Reads `--client claude,cursor` (or `all`); no value means all clients. */
10
+ export declare function parseClients(value: string | boolean | undefined): Client[];
11
+ /** Puts the rules block into the file: replaces an existing block, else appends one. */
12
+ export declare function withRules(content: string | null, kit: KitName): string;
13
+ export interface McpInitOptions {
14
+ cwd: string;
15
+ kit: KitName;
16
+ clients: Client[];
17
+ rules: boolean;
18
+ log: Logger;
19
+ }
20
+ export declare function mcpInit({ cwd, kit, clients, rules, log }: McpInitOptions): void;
21
+ //# sourceMappingURL=mcp-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-init.d.ts","sourceRoot":"","sources":["../src/mcp-init.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,KAAK,MAAM,EAAe,MAAM,WAAW,CAAC;AAErD,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACpD,eAAO,MAAM,OAAO,EAAE,MAAM,EAAmC,CAAC;AAUhE,eAAO,MAAM,UAAU,GAAI,KAAK,OAAO,aAAwD,CAAC;AAuBhG,eAAO,MAAM,WAAW,kCAAkC,CAAC;AAC3D,eAAO,MAAM,SAAS,gCAAgC,CAAC;AAEvD,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAE/C;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,EAAE,CAc1E;AA0CD,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAQtE;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,cAAc,GAAG,IAAI,CAc/E"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * `twentyfirst-ui mcp init`: registers the MCP server with the coding agents of a project and
3
+ * writes the kit rules into AGENTS.md (and CLAUDE.md when it exists).
4
+ */
5
+ import { join } from "node:path";
6
+ import { agentRules } from "./knowledge.js";
7
+ import { SERVER_NAME } from "./mcp.js";
8
+ import { read, write } from "./util.js";
9
+ export const CLIENTS = ["claude", "cursor", "vscode"];
10
+ export const serverArgs = (kit) => ["-y", "@twentyfirstmedia/ui", "mcp", "--kit", kit];
11
+ const CONFIGS = {
12
+ claude: {
13
+ label: "Claude Code",
14
+ file: ".mcp.json",
15
+ key: "mcpServers",
16
+ entry: (kit) => ({ command: "npx", args: serverArgs(kit) }),
17
+ },
18
+ cursor: {
19
+ label: "Cursor",
20
+ file: ".cursor/mcp.json",
21
+ key: "mcpServers",
22
+ entry: (kit) => ({ command: "npx", args: serverArgs(kit) }),
23
+ },
24
+ vscode: {
25
+ label: "VS Code",
26
+ file: ".vscode/mcp.json",
27
+ key: "servers",
28
+ entry: (kit) => ({ type: "stdio", command: "npx", args: serverArgs(kit) }),
29
+ },
30
+ };
31
+ export const RULES_START = "<!-- twentyfirst-ui:start -->";
32
+ export const RULES_END = "<!-- twentyfirst-ui:end -->";
33
+ export function rulesBlock(kit) {
34
+ return `${RULES_START}\n## Twentyfirst UI\n\n${agentRules(kit)}\n${RULES_END}`;
35
+ }
36
+ /** Reads `--client claude,cursor` (or `all`); no value means all clients. */
37
+ export function parseClients(value) {
38
+ if (value === undefined || value === true || value === "all")
39
+ return [...CLIENTS];
40
+ if (value === false)
41
+ return [];
42
+ const list = value
43
+ .split(",")
44
+ .map((s) => s.trim().toLowerCase())
45
+ .filter(Boolean);
46
+ if (list.includes("all"))
47
+ return [...CLIENTS];
48
+ const bad = list.filter((c) => !CLIENTS.includes(c));
49
+ if (bad.length || !list.length)
50
+ throw new Error(`--client takes ${CLIENTS.join(", ")} or all (comma-separated), not ${bad.join(", ") || "nothing"}`);
51
+ return [...new Set(list)];
52
+ }
53
+ function writeIfChanged(path, content, name, log) {
54
+ const before = read(path);
55
+ if (before === content) {
56
+ log.log(` unchanged ${name}`);
57
+ return;
58
+ }
59
+ write(path, content);
60
+ log.log(` ${before === null ? "created" : "updated"} ${name}`);
61
+ }
62
+ function writeClientConfig(cwd, client, kit, log) {
63
+ const cfg = CONFIGS[client];
64
+ const path = join(cwd, cfg.file);
65
+ const raw = read(path);
66
+ let data = {};
67
+ if (raw !== null && raw.trim()) {
68
+ let parsed;
69
+ try {
70
+ parsed = JSON.parse(raw);
71
+ }
72
+ catch (e) {
73
+ throw new Error(`${cfg.file} is not valid JSON (${e.message}); fix it and rerun.`, {
74
+ cause: e,
75
+ });
76
+ }
77
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
78
+ throw new Error(`${cfg.file} must hold a JSON object.`);
79
+ data = parsed;
80
+ }
81
+ const existing = data[cfg.key];
82
+ const servers = typeof existing === "object" && existing !== null && !Array.isArray(existing)
83
+ ? existing
84
+ : {};
85
+ data[cfg.key] = { ...servers, [SERVER_NAME]: cfg.entry(kit) };
86
+ writeIfChanged(path, `${JSON.stringify(data, null, 2)}\n`, `${cfg.file} (${cfg.label})`, log);
87
+ }
88
+ /** Puts the rules block into the file: replaces an existing block, else appends one. */
89
+ export function withRules(content, kit) {
90
+ const block = rulesBlock(kit);
91
+ if (content === null || !content.trim())
92
+ return `${block}\n`;
93
+ const start = content.indexOf(RULES_START);
94
+ const end = content.indexOf(RULES_END, start);
95
+ if (start >= 0 && end > start)
96
+ return content.slice(0, start) + block + content.slice(end + RULES_END.length);
97
+ return `${content.replace(/\s*$/, "")}\n\n${block}\n`;
98
+ }
99
+ export function mcpInit({ cwd, kit, clients, rules, log }) {
100
+ log.log(`Setting up the ${SERVER_NAME} MCP server (${kit} kit):`);
101
+ for (const c of clients)
102
+ writeClientConfig(cwd, c, kit, log);
103
+ if (rules) {
104
+ for (const file of ["AGENTS.md", "CLAUDE.md"]) {
105
+ const path = join(cwd, file);
106
+ const content = read(path);
107
+ if (file === "CLAUDE.md" && content === null)
108
+ continue;
109
+ writeIfChanged(path, withRules(content, kit), `${file} (rules)`, log);
110
+ }
111
+ }
112
+ log.log(`Done. Restart your agent or reload its MCP servers; the server runs \`npx ${serverArgs(kit).join(" ")}\`.`);
113
+ }
114
+ //# sourceMappingURL=mcp-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-init.js","sourceRoot":"","sources":["../src/mcp-init.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,72 @@
1
+ import { type Entry, type KitName, type Knowledge } from "./knowledge.js";
2
+ export declare const SERVER_NAME = "twentyfirst-ui";
3
+ export declare const PROTOCOL_VERSIONS: readonly ["2025-11-25", "2025-06-18", "2025-03-26", "2024-11-05"];
4
+ export declare const LATEST_PROTOCOL_VERSION: "2025-11-25";
5
+ export type JsonRpcId = string | number | null;
6
+ export interface JsonRpcRequest {
7
+ jsonrpc: "2.0";
8
+ id?: JsonRpcId;
9
+ method: string;
10
+ params?: Record<string, unknown>;
11
+ }
12
+ export interface JsonRpcError {
13
+ code: number;
14
+ message: string;
15
+ data?: unknown;
16
+ }
17
+ export type JsonRpcResponse = {
18
+ jsonrpc: "2.0";
19
+ id: JsonRpcId;
20
+ result: unknown;
21
+ } | {
22
+ jsonrpc: "2.0";
23
+ id: JsonRpcId;
24
+ error: JsonRpcError;
25
+ };
26
+ export declare const ErrorCode: {
27
+ readonly ParseError: -32700;
28
+ readonly InvalidRequest: -32600;
29
+ readonly MethodNotFound: -32601;
30
+ readonly InvalidParams: -32602;
31
+ readonly InternalError: -32603;
32
+ readonly ResourceNotFound: -32002;
33
+ };
34
+ interface TextContent {
35
+ type: "text";
36
+ text: string;
37
+ }
38
+ export interface ToolResult {
39
+ content: TextContent[];
40
+ isError?: boolean;
41
+ }
42
+ export interface ServerOptions {
43
+ /** Kit the answers use unless a tool call names another. */
44
+ kit: KitName;
45
+ }
46
+ export interface McpServer {
47
+ /** Answers one JSON-RPC message; notifications and responses get null. */
48
+ handle(message: unknown): Promise<JsonRpcResponse | null>;
49
+ }
50
+ /** `import { A, B } from "@twentyfirstmedia/<kit>";` for the components a page documents. */
51
+ export declare function importLine(k: Knowledge, e: Entry, kit: KitName): string;
52
+ /**
53
+ * Docs of a component by name. A page of its own wins; a component without one (Button, Badge…)
54
+ * gets its import, props and the example of the page that shows it best; else any page that
55
+ * documents it (findEntry).
56
+ */
57
+ export declare function componentDoc(k: Knowledge, name: string, kit: KitName): string | undefined;
58
+ export declare function createServer(k: Knowledge, options: ServerOptions): McpServer;
59
+ /** Loads the docs bundled with the CLI (dist/knowledge.json). */
60
+ export declare function loadKnowledge(url?: URL): Knowledge;
61
+ /**
62
+ * Serves newline-delimited JSON-RPC over stdin/stdout. Messages are answered in order; the
63
+ * promise resolves when the input ends and every answer is written, or when the client closes the
64
+ * output (EPIPE): then there is nobody left to answer, so the server stops quietly.
65
+ */
66
+ export declare function serveStdio(server: McpServer, io?: {
67
+ input?: NodeJS.ReadableStream;
68
+ output?: NodeJS.WritableStream;
69
+ onError?: (msg: string) => void;
70
+ }): Promise<void>;
71
+ export {};
72
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AASA,OAAO,EAqBL,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAC5C,eAAO,MAAM,iBAAiB,mEAAoE,CAAC;AACnG,eAAO,MAAM,uBAAuB,cAAuB,CAAC;AAM5D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAClD;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,SAAS;;;;;;;CAOZ,CAAC;AAcX,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAwBD,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CAC3D;AAsCD,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAIvE;AA4DD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAsDzF;AAcD,wBAAgB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,SAAS,CA8jB5E;AAYD,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,GAAG,GAAE,GAAkD,GAAG,SAAS,CAUhG;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,EACjB,EAAE,GAAE;IACF,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B,GACL,OAAO,CAAC,IAAI,CAAC,CA4Ff"}