dekit-cli 0.1.0 → 0.2.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/README.md +24 -1
  2. package/bin/dekit.ts +98 -34
  3. package/dist/editor/assets/{index-DK9iczjI.js → index-yt1AtkL3.js} +6 -6
  4. package/dist/editor/index.html +1 -1
  5. package/docs/usage.md +127 -0
  6. package/editor/src/App.tsx +9 -11
  7. package/editor/src/types.ts +1 -0
  8. package/package.json +34 -9
  9. package/src/chrome.test.ts +24 -0
  10. package/src/chrome.ts +37 -0
  11. package/src/cli/add.test.ts +62 -0
  12. package/src/cli/add.ts +104 -0
  13. package/src/cli/init.test.ts +61 -0
  14. package/src/cli/init.ts +46 -0
  15. package/src/cli/ls.test.ts +29 -0
  16. package/src/cli/ls.ts +24 -0
  17. package/src/cli/resolve.test.ts +43 -0
  18. package/src/cli/resolve.ts +92 -0
  19. package/src/cli/screenshot.test.ts +54 -0
  20. package/src/cli/screenshot.ts +154 -0
  21. package/src/cli/usage.ts +8 -0
  22. package/src/devices.ts +23 -0
  23. package/src/injected/inspector.ts +31 -0
  24. package/src/parser.test.ts +6 -6
  25. package/src/parser.ts +2 -2
  26. package/src/ref.test.ts +68 -0
  27. package/src/ref.ts +42 -0
  28. package/src/server.ts +8 -5
  29. package/src/types.ts +13 -0
  30. package/src/vite-plugin-dekit.ts +13 -6
  31. package/templates/components/blank/component.css +3 -0
  32. package/templates/components/blank/component.html +5 -0
  33. package/templates/pages/blank/page.css +3 -0
  34. package/templates/pages/blank/page.html +3 -0
  35. package/templates/pages/form/page.css +88 -0
  36. package/templates/pages/form/page.html +21 -0
  37. package/templates/pages/grid/page.css +84 -0
  38. package/templates/pages/grid/page.html +40 -0
  39. package/templates/pages/hero/page.css +62 -0
  40. package/templates/pages/hero/page.html +10 -0
  41. package/templates/projects/blank/dekit.yaml +9 -0
  42. package/templates/projects/blank/global.css +18 -0
  43. package/templates/projects/blank/pages/home/home.css +3 -0
  44. package/templates/projects/blank/pages/home/home.html +3 -0
  45. package/templates/projects/dashboard/dekit.yaml +9 -0
  46. package/templates/projects/dashboard/global.css +18 -0
  47. package/templates/projects/dashboard/pages/home/home.css +248 -0
  48. package/templates/projects/dashboard/pages/home/home.html +100 -0
  49. package/templates/projects/landing/dekit.yaml +9 -0
  50. package/templates/projects/landing/global.css +18 -0
  51. package/templates/projects/landing/pages/home/home.css +255 -0
  52. package/templates/projects/landing/pages/home/home.html +79 -0
  53. package/templates/projects/mobile/dekit.yaml +9 -0
  54. package/templates/projects/mobile/global.css +20 -0
  55. package/templates/projects/mobile/pages/home/home.css +267 -0
  56. package/templates/projects/mobile/pages/home/home.html +110 -0
package/README.md CHANGED
@@ -16,7 +16,7 @@ A code-first design toolkit — preview, inspect, and debug your HTML/CSS design
16
16
  Install globally:
17
17
 
18
18
  ```bash
19
- npm install -g dekit
19
+ npm install -g dekit-cli
20
20
  ```
21
21
 
22
22
  Create a `design.yaml` in your project:
@@ -76,3 +76,26 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
76
76
  ## License
77
77
 
78
78
  [Apache 2.0](LICENSE)
79
+
80
+ ## For Agents
81
+
82
+ Install dekit globally:
83
+
84
+ ```bash
85
+ npm install -g dekit-cli
86
+ ```
87
+
88
+ Run `dekit usage` to get the full usage guide.
89
+
90
+ ### Skill Setup (Optional)
91
+
92
+ Create a skill file for your agent (e.g. `.claude/skills/dekit.md`):
93
+
94
+ ```markdown
95
+ ---
96
+ name: dekit
97
+ description: Use dekit to create, preview, and iterate on HTML/CSS designs
98
+ ---
99
+ Run `dekit usage` to get the full usage guide.
100
+ Follow the guide to complete your design task.
101
+ ```
package/bin/dekit.ts CHANGED
@@ -6,73 +6,137 @@ import { startServers } from "../src/server.js";
6
6
 
7
7
  function printUsage() {
8
8
  console.log(`
9
- Usage: dekit [-c <design.yaml>]
9
+ Usage: dekit <command> [options]
10
+
11
+ Commands:
12
+ init [path] Initialize a new design project
13
+ add <type> <name> Add a page or component
14
+ ls List pages and components
15
+ serve Start the preview server (default)
16
+ screenshot <ref> Take a screenshot of a page or element
17
+ resolve <ref> Resolve a ref to file path and line range
18
+ usage Print the agent usage guide
10
19
 
11
20
  Options:
12
- -c, --config Path to design.yaml (default: ./design.yaml or ./design.yml)
13
- -p, --port Editor server port (default: 3000)
14
- --design-port Design server port (default: 3001)
15
- -h, --help Show this help message
21
+ -c, --config Path to dekit.yaml
22
+ -h, --help Show this help message
23
+
24
+ Run 'dekit <command> --help' for command-specific help.
16
25
  `);
17
26
  }
18
27
 
19
28
  function findDefaultConfig(): string | undefined {
20
- for (const name of ["design.yaml", "design.yml"]) {
29
+ for (const name of ["dekit.yaml", "dekit.yml", "design.yaml", "design.yml"]) {
21
30
  const p = resolve(name);
22
31
  if (existsSync(p)) return p;
23
32
  }
24
33
  }
25
34
 
26
- function parseArgs(args: string[]) {
27
- const result: Record<string, string> = {};
35
+ function extractGlobalArgs(args: string[]): {
36
+ config?: string;
37
+ help: boolean;
38
+ rest: string[];
39
+ } {
40
+ const rest: string[] = [];
41
+ let config: string | undefined;
42
+ let help = false;
28
43
  for (let i = 0; i < args.length; i++) {
29
44
  const arg = args[i];
30
45
  if (arg === "-c" || arg === "--config") {
31
- result.config = args[++i];
32
- } else if (arg === "-p" || arg === "--port") {
33
- result.port = args[++i];
34
- } else if (arg === "--design-port") {
35
- result.designPort = args[++i];
46
+ config = args[++i];
36
47
  } else if (arg === "-h" || arg === "--help") {
37
- result.help = "true";
48
+ help = true;
49
+ } else {
50
+ rest.push(arg);
38
51
  }
39
52
  }
40
- return result;
53
+ return { config, help, rest };
41
54
  }
42
55
 
43
- async function main() {
44
- const args = parseArgs(process.argv.slice(2));
45
-
46
- if (args.help) {
47
- printUsage();
48
- process.exit(0);
49
- }
50
-
51
- const configPath = args.config
52
- ? resolve(args.config)
53
- : findDefaultConfig();
54
-
56
+ async function loadConfig(configArg?: string) {
57
+ const configPath = configArg ? resolve(configArg) : findDefaultConfig();
55
58
  if (!configPath) {
56
59
  console.error(
57
- "Error: no design.yaml or design.yml found in current directory. Use -c to specify a config file.\n"
60
+ "Error: no dekit.yaml found in current directory. Use -c to specify a config file.\n"
58
61
  );
59
- printUsage();
60
62
  process.exit(1);
61
63
  }
62
- let config;
63
64
  try {
64
- config = await parseDesignConfig(configPath);
65
+ return await parseDesignConfig(configPath);
65
66
  } catch (err) {
66
67
  console.error(
67
68
  `Error parsing config: ${err instanceof Error ? err.message : err}`
68
69
  );
69
70
  process.exit(1);
70
71
  }
72
+ }
73
+
74
+ async function main() {
75
+ const { config: configArg, help, rest } = extractGlobalArgs(
76
+ process.argv.slice(2)
77
+ );
78
+ const command = rest[0] ?? "serve";
79
+ const commandArgs = rest.slice(1);
71
80
 
72
- const port = parseInt(args.port ?? "3000", 10);
73
- const designPort = parseInt(args.designPort ?? "3001", 10);
81
+ if (help && !rest.length) {
82
+ printUsage();
83
+ process.exit(0);
84
+ }
74
85
 
75
- await startServers({ config, port, designPort });
86
+ switch (command) {
87
+ case "init": {
88
+ const { runInit } = await import("../src/cli/init.js");
89
+ await runInit(commandArgs);
90
+ break;
91
+ }
92
+ case "add": {
93
+ const config = await loadConfig(configArg);
94
+ const { runAdd } = await import("../src/cli/add.js");
95
+ await runAdd(config, commandArgs);
96
+ break;
97
+ }
98
+ case "ls": {
99
+ const config = await loadConfig(configArg);
100
+ const { runLs } = await import("../src/cli/ls.js");
101
+ await runLs(config);
102
+ break;
103
+ }
104
+ case "serve": {
105
+ const config = await loadConfig(configArg);
106
+ const port = parseInt(
107
+ commandArgs.find((_, i, a) => a[i - 1] === "-p") ?? "3000",
108
+ 10
109
+ );
110
+ const designPort = parseInt(
111
+ commandArgs.find((_, i, a) => a[i - 1] === "--design-port") ?? "3001",
112
+ 10
113
+ );
114
+ const noOpen = commandArgs.includes("--no-open");
115
+ await startServers({ config, port, designPort, noOpen });
116
+ break;
117
+ }
118
+ case "screenshot": {
119
+ const config = await loadConfig(configArg);
120
+ const { runScreenshot } = await import("../src/cli/screenshot.js");
121
+ await runScreenshot(config, commandArgs);
122
+ break;
123
+ }
124
+ case "resolve": {
125
+ const config = await loadConfig(configArg);
126
+ const { runResolve } = await import("../src/cli/resolve.js");
127
+ await runResolve(config, commandArgs);
128
+ break;
129
+ }
130
+ case "usage": {
131
+ const { runUsage } = await import("../src/cli/usage.js");
132
+ await runUsage();
133
+ break;
134
+ }
135
+ default:
136
+ console.error(`Unknown command: ${command}\n`);
137
+ printUsage();
138
+ process.exit(1);
139
+ }
76
140
  }
77
141
 
78
142
  main();