@deckspec/cli 0.1.0 → 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 (40) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +114 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/approve.d.ts +2 -0
  6. package/dist/commands/approve.d.ts.map +1 -0
  7. package/dist/commands/approve.js +56 -0
  8. package/dist/commands/approve.js.map +1 -0
  9. package/dist/commands/dev.d.ts +2 -0
  10. package/dist/commands/dev.d.ts.map +1 -0
  11. package/dist/commands/dev.js +331 -0
  12. package/dist/commands/dev.js.map +1 -0
  13. package/dist/commands/init.d.ts +5 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +257 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/lock.d.ts +2 -0
  18. package/dist/commands/lock.d.ts.map +1 -0
  19. package/dist/commands/lock.js +155 -0
  20. package/dist/commands/lock.js.map +1 -0
  21. package/dist/commands/patterns.d.ts +6 -0
  22. package/dist/commands/patterns.d.ts.map +1 -0
  23. package/dist/commands/patterns.js +97 -0
  24. package/dist/commands/patterns.js.map +1 -0
  25. package/dist/commands/render.d.ts +6 -0
  26. package/dist/commands/render.d.ts.map +1 -0
  27. package/dist/commands/render.js +41 -0
  28. package/dist/commands/render.js.map +1 -0
  29. package/dist/commands/validate.d.ts +6 -0
  30. package/dist/commands/validate.d.ts.map +1 -0
  31. package/dist/commands/validate.js +37 -0
  32. package/dist/commands/validate.js.map +1 -0
  33. package/dist/index.d.ts +5 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +5 -0
  36. package/dist/index.js.map +1 -0
  37. package/package.json +8 -4
  38. package/src/cli.ts +7 -0
  39. package/src/commands/init.ts +284 -0
  40. package/tsconfig.json +0 -14
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env node
2
+ import { validateCommand } from "./commands/validate.js";
3
+ import { renderCommand } from "./commands/render.js";
4
+ import { approveCommand } from "./commands/approve.js";
5
+ import { lockCommand } from "./commands/lock.js";
6
+ import { patternsCommand } from "./commands/patterns.js";
7
+ import { devCommand } from "./commands/dev.js";
8
+ import { initCommand } from "./commands/init.js";
9
+ const USAGE = `
10
+ Usage: deckspec <command> [options]
11
+
12
+ Commands:
13
+ init [dir] [--theme <name>] Scaffold a new DeckSpec project
14
+ validate <file> Validate a deck YAML file
15
+ render <file> -o <output> Render a deck YAML file to HTML
16
+ approve <file> [options] Approve/reject slides or archive/activate decks
17
+ lock <file> [options] Lock an approved slide as a reusable pattern
18
+ patterns [--theme <name>] List available patterns with schemas
19
+ dev [dir] Start dev server with dashboard (port 3002)
20
+
21
+ Approve options:
22
+ --slide <index[,...]> Slide indices to approve
23
+ --reject Reject (reset to generated) instead of approve
24
+ --archive Archive the deck
25
+ --activate Activate an archived deck
26
+
27
+ Lock options:
28
+ --slide <index> Slide index to lock
29
+ --name <pattern-name> Name for the generated pattern
30
+
31
+ Options:
32
+ --help Show this help message
33
+ `.trim();
34
+ async function main() {
35
+ const args = process.argv.slice(2);
36
+ if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
37
+ console.log(USAGE);
38
+ process.exit(0);
39
+ }
40
+ const command = args[0];
41
+ switch (command) {
42
+ case "validate": {
43
+ const filePath = args[1];
44
+ if (!filePath) {
45
+ console.error("Error: Missing file path.\n");
46
+ console.error("Usage: deckspec validate <file>");
47
+ process.exit(1);
48
+ }
49
+ await validateCommand(filePath);
50
+ break;
51
+ }
52
+ case "render": {
53
+ const filePath = args[1];
54
+ if (!filePath) {
55
+ console.error("Error: Missing file path.\n");
56
+ console.error("Usage: deckspec render <file> -o <output>");
57
+ process.exit(1);
58
+ }
59
+ const outputFlagIndex = args.indexOf("-o");
60
+ const outputPath = outputFlagIndex !== -1 ? args[outputFlagIndex + 1] : undefined;
61
+ if (!outputPath) {
62
+ console.error("Error: Missing output path. Use -o <output> to specify.\n");
63
+ console.error("Usage: deckspec render <file> -o <output>");
64
+ process.exit(1);
65
+ }
66
+ await renderCommand(filePath, outputPath);
67
+ break;
68
+ }
69
+ case "approve": {
70
+ const filePath = args[1];
71
+ if (!filePath) {
72
+ console.error("Error: Missing file path.\n");
73
+ console.error("Usage: deckspec approve <file> --slide <index>");
74
+ process.exit(1);
75
+ }
76
+ await approveCommand(filePath, args.slice(2));
77
+ break;
78
+ }
79
+ case "lock": {
80
+ const filePath = args[1];
81
+ if (!filePath) {
82
+ console.error("Error: Missing file path.\n");
83
+ console.error("Usage: deckspec lock <file> --slide <index> --name <pattern-name>");
84
+ process.exit(1);
85
+ }
86
+ await lockCommand(filePath, args.slice(2));
87
+ break;
88
+ }
89
+ case "patterns": {
90
+ await patternsCommand(args.slice(1));
91
+ break;
92
+ }
93
+ case "dev": {
94
+ const dir = args[1] || process.cwd();
95
+ await devCommand(dir);
96
+ break;
97
+ }
98
+ case "init": {
99
+ await initCommand(args.slice(1));
100
+ break;
101
+ }
102
+ default: {
103
+ console.error(`Error: Unknown command "${command}".\n`);
104
+ console.log(USAGE);
105
+ process.exit(1);
106
+ }
107
+ }
108
+ }
109
+ main().catch((error) => {
110
+ const message = error instanceof Error ? error.message : String(error);
111
+ console.error(`Error: ${message}`);
112
+ process.exit(1);
113
+ });
114
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function approveCommand(filePath: string, extraArgs: string[]): Promise<void>;
2
+ //# sourceMappingURL=approve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAwCA,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -0,0 +1,56 @@
1
+ import { approveSlide, rejectSlide, archiveDeck, activateDeck, } from "@deckspec/dsl";
2
+ function parseOptions(args) {
3
+ const options = {};
4
+ for (let i = 0; i < args.length; i++) {
5
+ const arg = args[i];
6
+ if (arg === "--slide" && args[i + 1]) {
7
+ options.slideIndices = args[i + 1].split(",").map((s) => {
8
+ const n = parseInt(s.trim(), 10);
9
+ if (Number.isNaN(n) || n < 0) {
10
+ throw new Error(`Invalid slide index: "${s.trim()}"`);
11
+ }
12
+ return n;
13
+ });
14
+ i++;
15
+ }
16
+ else if (arg === "--reject") {
17
+ options.reject = true;
18
+ }
19
+ else if (arg === "--archive") {
20
+ options.archive = true;
21
+ }
22
+ else if (arg === "--activate") {
23
+ options.activate = true;
24
+ }
25
+ }
26
+ return options;
27
+ }
28
+ export async function approveCommand(filePath, extraArgs) {
29
+ const options = parseOptions(extraArgs);
30
+ if (options.archive) {
31
+ await archiveDeck(filePath);
32
+ console.log(`Archived deck: ${filePath}`);
33
+ return;
34
+ }
35
+ if (options.activate) {
36
+ await activateDeck(filePath);
37
+ console.log(`Activated deck: ${filePath}`);
38
+ return;
39
+ }
40
+ if (!options.slideIndices || options.slideIndices.length === 0) {
41
+ console.error("Error: Specify slides with --slide <index[,index,...]>");
42
+ console.error(" Or use --archive / --activate for deck lifecycle.");
43
+ process.exit(1);
44
+ }
45
+ for (const index of options.slideIndices) {
46
+ if (options.reject) {
47
+ await rejectSlide(filePath, index);
48
+ console.log(`Rejected slide ${index} in ${filePath}`);
49
+ }
50
+ else {
51
+ await approveSlide(filePath, index);
52
+ console.log(`Approved slide ${index} in ${filePath}`);
53
+ }
54
+ }
55
+ }
56
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,GACb,MAAM,eAAe,CAAC;AASvB,SAAS,YAAY,CAAC,IAAc;IAClC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACjC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACxD,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;YACH,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;QACxB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,SAAmB;IAEnB,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAExC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,OAAO,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,OAAO,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function devCommand(dir: string): Promise<void>;
2
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAsTA,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD3D"}
@@ -0,0 +1,331 @@
1
+ import { createServer } from "node:http";
2
+ import { resolve, dirname, join } from "node:path";
3
+ import { loadDeckFile, validateDeck, scanDecks, approveSlide, rejectSlide, archiveDeck, activateDeck } from "@deckspec/dsl";
4
+ import { readdir, readFile, stat } from "node:fs/promises";
5
+ import { renderDeck, renderDashboard, renderSlide, renderThemeDetail, loadThemeCSS, loadThemeTokens, extractThemeName, resolveThemePatternsDir, resolveThemePatternsSrcDir, compileTsxCached, clearCompileCache } from "@deckspec/renderer";
6
+ const PORT = 3002;
7
+ /** SSE clients for live reload */
8
+ const sseClients = new Set();
9
+ function sendSSE(event, data = "") {
10
+ for (const res of sseClients) {
11
+ res.write(`event: ${event}\ndata: ${data}\n\n`);
12
+ }
13
+ }
14
+ function readBody(req) {
15
+ return new Promise((resolve, reject) => {
16
+ const chunks = [];
17
+ req.on("data", (chunk) => chunks.push(chunk));
18
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
19
+ req.on("error", reject);
20
+ });
21
+ }
22
+ function json(res, status, data) {
23
+ res.writeHead(status, { "Content-Type": "application/json" });
24
+ res.end(JSON.stringify(data));
25
+ }
26
+ function html(res, content) {
27
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
28
+ res.end(content);
29
+ }
30
+ function error(res, status, message) {
31
+ res.writeHead(status, { "Content-Type": "text/plain" });
32
+ res.end(message);
33
+ }
34
+ async function renderDeckByPath(baseDir, relativePath) {
35
+ const filePath = resolve(baseDir, relativePath);
36
+ const raw = await loadDeckFile(filePath);
37
+ const basePath = dirname(filePath);
38
+ const themeName = extractThemeName(raw);
39
+ const patternsDir = resolveThemePatternsDir(themeName);
40
+ const result = await validateDeck(raw, { basePath, patternsDir, compileTsx: compileTsxCached });
41
+ if (!result.valid) {
42
+ const errors = result.results
43
+ .filter((r) => !r.valid)
44
+ .map((r) => `slides[${r.index}]: ${r.errors?.issues.map((i) => i.message).join(", ")}`)
45
+ .join("\n");
46
+ throw new Error(`Validation failed:\n${errors}`);
47
+ }
48
+ const deck = raw;
49
+ const themeCSS = await loadThemeCSS(deck.meta.theme);
50
+ const patternsSrcDir = resolveThemePatternsSrcDir(themeName);
51
+ return renderDeck(deck, themeCSS, { basePath, patternsDir, patternsSrcDir });
52
+ }
53
+ async function handleRequest(req, res, baseDir) {
54
+ const url = new URL(req.url ?? "/", `http://localhost:${PORT}`);
55
+ const pathname = url.pathname;
56
+ const method = req.method ?? "GET";
57
+ try {
58
+ // SSE endpoint
59
+ if (method === "GET" && pathname === "/events") {
60
+ res.writeHead(200, {
61
+ "Content-Type": "text/event-stream",
62
+ "Cache-Control": "no-cache",
63
+ Connection: "keep-alive",
64
+ });
65
+ res.write(":\n\n");
66
+ sseClients.add(res);
67
+ req.on("close", () => sseClients.delete(res));
68
+ return;
69
+ }
70
+ // Dashboard
71
+ if (method === "GET" && pathname === "/") {
72
+ const summaries = await scanDecks(baseDir);
73
+ // Scan themes
74
+ const themes = [];
75
+ const themesDir = join(baseDir, "themes");
76
+ try {
77
+ const themeDirs = await readdir(themesDir);
78
+ for (const dir of themeDirs) {
79
+ try {
80
+ const dirStat = await stat(join(themesDir, dir));
81
+ if (!dirStat.isDirectory())
82
+ continue;
83
+ const tokens = await loadThemeTokens(dir);
84
+ const patternsSrcDir = resolveThemePatternsSrcDir(dir);
85
+ let patternCount = 0;
86
+ try {
87
+ const patternEntries = await readdir(patternsSrcDir);
88
+ patternCount = patternEntries.filter((e) => !e.startsWith("_") && !e.startsWith(".") && !e.includes(".")).length;
89
+ }
90
+ catch { /* no patterns dir */ }
91
+ themes.push({
92
+ name: dir,
93
+ displayName: tokens.displayName,
94
+ patternCount,
95
+ colors: [
96
+ { name: "foreground", hex: tokens.colors.foreground },
97
+ { name: "primary", hex: tokens.colors.primary },
98
+ { name: "background", hex: tokens.colors.background },
99
+ { name: "card", hex: tokens.colors["card-background"] ?? tokens.colors.background },
100
+ ],
101
+ });
102
+ }
103
+ catch { /* skip invalid theme */ }
104
+ }
105
+ }
106
+ catch { /* no themes dir */ }
107
+ // Build previews for each deck (first slide only for thumbnail)
108
+ const decksWithPreviews = [];
109
+ let themeCSS = "";
110
+ for (const summary of summaries) {
111
+ try {
112
+ const raw = await loadDeckFile(summary.filePath);
113
+ const deck = raw;
114
+ const basePath = dirname(summary.filePath);
115
+ const themeName = extractThemeName(raw);
116
+ const patternsDir = resolveThemePatternsDir(themeName);
117
+ const patternsSrcDir = resolveThemePatternsSrcDir(themeName);
118
+ if (!themeCSS) {
119
+ themeCSS = await loadThemeCSS(deck.meta.theme);
120
+ }
121
+ // Only render first slide for Home thumbnail
122
+ const slidePreviews = [];
123
+ if (deck.slides.length > 0) {
124
+ const slide = deck.slides[0];
125
+ let previewHtml;
126
+ try {
127
+ previewHtml = await renderSlide(slide, { basePath, patternsDir, patternsSrcDir });
128
+ }
129
+ catch {
130
+ previewHtml = `<div style="padding:1rem;color:#999;font-size:12px">Preview unavailable</div>`;
131
+ }
132
+ slidePreviews.push({
133
+ index: 0,
134
+ state: String(slide.state ?? "generated"),
135
+ html: previewHtml,
136
+ file: slide.file,
137
+ });
138
+ }
139
+ // Get mtime of deck.yaml
140
+ let mtime;
141
+ try {
142
+ const fileStat = await stat(summary.filePath);
143
+ mtime = fileStat.mtime.toISOString();
144
+ }
145
+ catch { /* ignore */ }
146
+ decksWithPreviews.push({ summary, slidePreviews, mtime });
147
+ }
148
+ catch {
149
+ let mtime;
150
+ try {
151
+ const fileStat = await stat(summary.filePath);
152
+ mtime = fileStat.mtime.toISOString();
153
+ }
154
+ catch { /* ignore */ }
155
+ decksWithPreviews.push({
156
+ summary,
157
+ slidePreviews: [],
158
+ mtime,
159
+ });
160
+ }
161
+ }
162
+ const dashboardHtml = renderDashboard(decksWithPreviews, {
163
+ mode: "interactive",
164
+ themeCSS,
165
+ }, themes);
166
+ html(res, dashboardHtml);
167
+ return;
168
+ }
169
+ // Theme detail: /theme/<name>
170
+ if (method === "GET" && pathname.startsWith("/theme/")) {
171
+ const themeName = decodeURIComponent(pathname.slice(7));
172
+ const tokens = await loadThemeTokens(themeName);
173
+ // Read pattern names and generate previews
174
+ const patternsSrcDir = resolveThemePatternsSrcDir(themeName);
175
+ const patternsDir = resolveThemePatternsDir(themeName);
176
+ let patternInfos = [];
177
+ try {
178
+ const entries = await readdir(patternsSrcDir);
179
+ const patternNames = entries.filter((e) => !e.startsWith("_") && !e.startsWith(".") && !e.includes(".")).sort();
180
+ for (const name of patternNames) {
181
+ let previewHtml;
182
+ try {
183
+ // Check for examples.yaml
184
+ const examplesPath = join(patternsSrcDir, name, "examples.yaml");
185
+ const examplesRaw = await readFile(examplesPath, "utf-8");
186
+ const { load } = await import("js-yaml");
187
+ const examples = load(examplesRaw);
188
+ if (examples && examples.length > 0) {
189
+ const firstExample = examples[0];
190
+ previewHtml = await renderSlide({ file: name, vars: firstExample.vars }, { basePath: patternsSrcDir, patternsDir, patternsSrcDir });
191
+ }
192
+ }
193
+ catch { /* no examples or render failed */ }
194
+ patternInfos.push({ name, previewHtml });
195
+ }
196
+ }
197
+ catch { /* no patterns */ }
198
+ // Load theme CSS for pattern previews
199
+ let themeCSS = "";
200
+ try {
201
+ themeCSS = await loadThemeCSS(themeName);
202
+ }
203
+ catch { /* no theme CSS */ }
204
+ // Read design.md description (first paragraph)
205
+ let designDescription = "";
206
+ try {
207
+ const designMd = await readFile(join(baseDir, "themes", themeName, "design.md"), "utf-8");
208
+ const lines = designMd.split("\n");
209
+ const descLines = [];
210
+ let pastTitle = false;
211
+ for (const line of lines) {
212
+ if (!pastTitle) {
213
+ if (line.startsWith("# ")) {
214
+ pastTitle = true;
215
+ continue;
216
+ }
217
+ continue;
218
+ }
219
+ if (line.startsWith("## "))
220
+ break;
221
+ if (line.trim() === "" && descLines.length > 0)
222
+ break;
223
+ if (line.trim() !== "")
224
+ descLines.push(line.trim());
225
+ }
226
+ designDescription = descLines.join("\n");
227
+ }
228
+ catch { /* no design.md */ }
229
+ const detailHtml = renderThemeDetail({ tokens, patterns: patternInfos, designDescription, themeCSS });
230
+ html(res, detailHtml);
231
+ return;
232
+ }
233
+ // Deck viewer: /deck/<name> → decks/<name>/deck.yaml
234
+ if (method === "GET" && pathname.startsWith("/deck/")) {
235
+ const deckName = decodeURIComponent(pathname.slice(6));
236
+ const relativePath = `decks/${deckName}/deck.yaml`;
237
+ const deckHtml = await renderDeckByPath(baseDir, relativePath);
238
+ html(res, deckHtml);
239
+ return;
240
+ }
241
+ // API: approve slide
242
+ if (method === "POST" && pathname === "/api/approve") {
243
+ const body = JSON.parse(await readBody(req));
244
+ const filePath = resolve(baseDir, body.file);
245
+ await approveSlide(filePath, body.slideIndex);
246
+ sendSSE("reload");
247
+ json(res, 200, { ok: true });
248
+ return;
249
+ }
250
+ // API: reject slide
251
+ if (method === "POST" && pathname === "/api/reject") {
252
+ const body = JSON.parse(await readBody(req));
253
+ const filePath = resolve(baseDir, body.file);
254
+ await rejectSlide(filePath, body.slideIndex);
255
+ sendSSE("reload");
256
+ json(res, 200, { ok: true });
257
+ return;
258
+ }
259
+ // API: archive deck
260
+ if (method === "POST" && pathname === "/api/archive") {
261
+ const body = JSON.parse(await readBody(req));
262
+ const filePath = resolve(baseDir, body.file);
263
+ await archiveDeck(filePath);
264
+ sendSSE("reload");
265
+ json(res, 200, { ok: true });
266
+ return;
267
+ }
268
+ // API: activate deck
269
+ if (method === "POST" && pathname === "/api/activate") {
270
+ const body = JSON.parse(await readBody(req));
271
+ const filePath = resolve(baseDir, body.file);
272
+ await activateDeck(filePath);
273
+ sendSSE("reload");
274
+ json(res, 200, { ok: true });
275
+ return;
276
+ }
277
+ error(res, 404, "Not found");
278
+ }
279
+ catch (err) {
280
+ const message = err instanceof Error ? err.message : String(err);
281
+ console.error(`[dev] Error: ${message}`);
282
+ error(res, 500, message);
283
+ }
284
+ }
285
+ export async function devCommand(dir) {
286
+ const baseDir = resolve(dir);
287
+ // Try dynamic import of chokidar for file watching
288
+ let watcherActive = false;
289
+ try {
290
+ const chokidar = await import("chokidar");
291
+ const fsWatcher = chokidar.watch([
292
+ join(baseDir, "decks/**/*.yaml"),
293
+ join(baseDir, "decks/**/*.html"),
294
+ join(baseDir, "decks/**/*.tsx"),
295
+ join(baseDir, "themes/**/*"),
296
+ ], {
297
+ ignoreInitial: true,
298
+ awaitWriteFinish: { stabilityThreshold: 200 },
299
+ });
300
+ fsWatcher.on("change", (filePath) => {
301
+ console.log("[dev] File changed, reloading...");
302
+ // Clear compile cache for .tsx files so they get recompiled
303
+ if (filePath.endsWith(".tsx")) {
304
+ clearCompileCache(filePath).catch(() => { });
305
+ }
306
+ sendSSE("reload");
307
+ });
308
+ fsWatcher.on("add", () => {
309
+ sendSSE("reload");
310
+ });
311
+ watcherActive = true;
312
+ }
313
+ catch {
314
+ console.warn("[dev] chokidar not installed — file watching disabled. Run: pnpm add -D chokidar");
315
+ }
316
+ const server = createServer((req, res) => {
317
+ handleRequest(req, res, baseDir).catch((err) => {
318
+ console.error("[dev] Unhandled error:", err);
319
+ if (!res.headersSent) {
320
+ error(res, 500, "Internal server error");
321
+ }
322
+ });
323
+ });
324
+ server.listen(PORT, () => {
325
+ console.log(`\n DeckSpec Dev Server`);
326
+ console.log(` Dashboard: http://localhost:${PORT}/`);
327
+ console.log(` Watching: ${baseDir}`);
328
+ console.log(` ${watcherActive ? "Live reload: enabled" : "Live reload: disabled (install chokidar)"}\n`);
329
+ });
330
+ }
331
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * deckspec init [dir] --theme <name>
3
+ */
4
+ export declare function initCommand(args: string[]): Promise<void>;
5
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA6MA;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2E/D"}