promptslide 0.3.0 → 0.3.2

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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,57 @@
1
+ # Changelog
2
+
3
+ ## [0.3.2](https://github.com/prompticeu/promptslide/compare/promptslide-v0.3.1...promptslide-v0.3.2) (2026-03-07)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * correct package.json path resolution in CLI commands ([#59](https://github.com/prompticeu/promptslide/issues/59)) ([a79e81d](https://github.com/prompticeu/promptslide/commit/a79e81dab73606494cf334121bcbff52273d038c))
9
+
10
+ ## [0.3.1](https://github.com/prompticeu/promptslide/compare/promptslide-v0.3.0...promptslide-v0.3.1) (2026-03-07)
11
+
12
+
13
+ ### Features
14
+
15
+ * **cli:** track promptslide version on publish and warn on add ([#58](https://github.com/prompticeu/promptslide/issues/58)) ([503e1f0](https://github.com/prompticeu/promptslide/commit/503e1f0bdac8066fb047b001c4b07c7ff6d87b23))
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * hoist deckBaseSlug to fix ReferenceError in publish command ([#56](https://github.com/prompticeu/promptslide/issues/56)) ([dd29c36](https://github.com/prompticeu/promptslide/commit/dd29c36ecd862d2e52844933478cb8ef652c0c23))
21
+ * include CHANGELOG.md in published npm packages ([#53](https://github.com/prompticeu/promptslide/issues/53)) ([8a38a55](https://github.com/prompticeu/promptslide/commit/8a38a5533b0ea41593eba901551b0815e9da0515))
22
+
23
+ ## [0.3.0](https://github.com/prompticeu/promptslide/compare/promptslide-v0.2.6...promptslide-v0.3.0) (2026-03-07)
24
+
25
+
26
+ ### ⚠ BREAKING CHANGES
27
+
28
+ * move SlideFooter from core to user-land layouts ([#47](https://github.com/prompticeu/promptslide/issues/47))
29
+
30
+ ### Features
31
+
32
+ * add theme system and reusable slide layouts ([#8](https://github.com/prompticeu/promptslide/issues/8)) ([b107f35](https://github.com/prompticeu/promptslide/commit/b107f35bb9bcc4edf9b171f5947e5e1d0ad8eb2a))
33
+ * **cli:** add --yes flag for non-interactive project scaffolding ([#21](https://github.com/prompticeu/promptslide/issues/21)) ([88d233f](https://github.com/prompticeu/promptslide/commit/88d233fc6f8cc970e4a13f1876cb5a2f06dd13b9))
34
+ * **cli:** add lockfile integrity with file hashing and tracking ([4c6238a](https://github.com/prompticeu/promptslide/commit/4c6238ad6e0cee85e3b918b4a120450262fedb7b))
35
+ * **cli:** add org management, preview image generation, and registry improvements ([a5d36eb](https://github.com/prompticeu/promptslide/commit/a5d36eb8d6dc6098f8bba2746aae711da16461fa))
36
+ * **cli:** add registry commands with lockfile integrity and file hashing ([72ba46e](https://github.com/prompticeu/promptslide/commit/72ba46eff408a28132b6318c0f7b78e7b6b203fe))
37
+ * **cli:** add SlideEmbed and /embed route ([#44](https://github.com/prompticeu/promptslide/issues/44)) ([3014ff8](https://github.com/prompticeu/promptslide/commit/3014ff8fdae6b1bbf8807c00f8c7410a78eff529))
38
+ * merge promptslide-core into promptslide package ([9248ed2](https://github.com/prompticeu/promptslide/commit/9248ed21d4a9d075d9246dd4b2892aa21c41eb0a))
39
+ * move SlideFooter from core to user-land layouts ([#47](https://github.com/prompticeu/promptslide/issues/47)) ([8beae61](https://github.com/prompticeu/promptslide/commit/8beae615f299d3601eedf9faabba38ae7b3ccf81))
40
+ * persist publish slug and add promptslide pull ([#45](https://github.com/prompticeu/promptslide/issues/45)) ([c6b3781](https://github.com/prompticeu/promptslide/commit/c6b37810c272d0ee62223d0362e09d7bb1d37eac))
41
+ * **registry:** add registry cli funcs ([cb3cc2e](https://github.com/prompticeu/promptslide/commit/cb3cc2eca14d9bfe17c24050e066102f83ae093c))
42
+ * show URL after publishing deck or slides ([#46](https://github.com/prompticeu/promptslide/issues/46)) ([25d9791](https://github.com/prompticeu/promptslide/commit/25d97914bb0d666e36756b851cd05fd69fe98a14))
43
+
44
+
45
+ ### Bug Fixes
46
+
47
+ * add Windows support for browser open in login command ([3ac57bc](https://github.com/prompticeu/promptslide/commit/3ac57bc375e841a2ef711c1f040f6230b6f2870d))
48
+ * address PR review feedback — arg parsing, import path, and lockfile bugs ([9087a7e](https://github.com/prompticeu/promptslide/commit/9087a7ec001bab05544f401673af0b043d49e90c))
49
+ * build promptslide package and add development exports ([#12](https://github.com/prompticeu/promptslide/issues/12)) ([2e60766](https://github.com/prompticeu/promptslide/commit/2e60766bb41f3a72775bae196d4d7e89bd08897a))
50
+ * CLI security hardening and bug fixes ([52fa1af](https://github.com/prompticeu/promptslide/commit/52fa1af3b4392cdfbd5d673e7a7a9d43ac2db26c))
51
+ * grid view and studio broken by stale file: paths ([#43](https://github.com/prompticeu/promptslide/issues/43)) ([3f5c548](https://github.com/prompticeu/promptslide/commit/3f5c54892e05c5a12e6c7b6f473745e0e7adc8f1))
52
+ * prevent directory argument from being filtered out in create command ([#40](https://github.com/prompticeu/promptslide/issues/40)) ([c1ff8f5](https://github.com/prompticeu/promptslide/commit/c1ff8f5779f0e1687b0064f107ab8d64c753c35f))
53
+ * remove leftover optional chaining on storedFiles in update command ([ed10b3f](https://github.com/prompticeu/promptslide/commit/ed10b3fae1e761deee9b4d046b1af1c93c89cf4a))
54
+ * replace PROJECT_NAME placeholder in theme.ts during scaffolding ([#14](https://github.com/prompticeu/promptslide/issues/14)) ([62f03db](https://github.com/prompticeu/promptslide/commit/62f03db7da286562b574c91f406b800f145edafd))
55
+ * resolve all linting errors in CLI commands ([#50](https://github.com/prompticeu/promptslide/issues/50)) ([8e2a5e8](https://github.com/prompticeu/promptslide/commit/8e2a5e810786cb704e8b42e294bf695ca0e2f9dc))
56
+ * update default registry to promptslide.eu ([#35](https://github.com/prompticeu/promptslide/issues/35)) ([910dd62](https://github.com/prompticeu/promptslide/commit/910dd623c0b17786fe3fc8f15b4b8c94c2be80b6))
57
+ * vertically center content in SlideLayoutCentered layout ([#42](https://github.com/prompticeu/promptslide/issues/42)) ([f53851e](https://github.com/prompticeu/promptslide/commit/f53851ec4cab60b697a186d01f01c8cc6bd7d781))
package/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # promptslide
2
+
3
+ Vibe-code beautiful slide decks using your favorite coding agent.
4
+
5
+ PromptSlide is a local-first slide framework built with React, Tailwind CSS, and Framer Motion. Open your coding agent (Claude Code, Cursor, Windsurf, etc.), describe the slides you want in natural language, and watch them appear in real-time via Vite's hot module replacement.
6
+
7
+ ## Quick Start
8
+
9
+ ```bash
10
+ bun create slides my-deck
11
+ cd my-deck
12
+ bun install
13
+ bun run dev
14
+ ```
15
+
16
+ Then open your coding agent and say:
17
+
18
+ > "Create me a 10-slide deck about AgenticRAG"
19
+
20
+ ## CLI Commands
21
+
22
+ All commands are run via `npx promptslide <command>` (or `bunx promptslide <command>`).
23
+
24
+ | Command | Description |
25
+ | --------- | ---------------------------------------- |
26
+ | `create` | Scaffold a new slide deck project |
27
+ | `studio` | Start the dev server with hot reload |
28
+ | `build` | Build the deck for production |
29
+ | `preview` | Preview the production build |
30
+ | `add` | Add a slide to the current deck |
31
+ | `remove` | Remove a slide from the current deck |
32
+ | `list` | List all slides in the current deck |
33
+ | `publish` | Publish the deck to PromptSlide registry |
34
+ | `search` | Search published decks |
35
+ | `pull` | Pull a published deck |
36
+
37
+ ## How It Works
38
+
39
+ 1. **You describe** what you want in natural language
40
+ 2. **Your coding agent** uses the [promptslide Skill](https://github.com/prompticeu/promptslide/tree/main/skills/promptslide) to understand the framework
41
+ 3. **Agent creates** `.tsx` slide files in `src/slides/`
42
+ 4. **Vite hot-reloads** -- slides appear instantly in your browser
43
+ 5. **Present** in fullscreen or export to PDF
44
+
45
+ > The Skill is installed automatically when you run `promptslide create`. To install it manually: `npx skills add prompticeu/promptslide`
46
+
47
+ ## Links
48
+
49
+ - [GitHub](https://github.com/prompticeu/promptslide)
50
+ - [create-slides](https://www.npmjs.com/package/create-slides) -- scaffolding shortcut
51
+
52
+ ## License
53
+
54
+ MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "promptslide",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "CLI and slide engine for PromptSlide presentations",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,7 +18,9 @@
18
18
  "files": [
19
19
  "src/",
20
20
  "dist/",
21
- "templates/"
21
+ "templates/",
22
+ "CHANGELOG.md",
23
+ "README.md"
22
24
  ],
23
25
  "scripts": {
24
26
  "build": "tsup",
@@ -1,8 +1,9 @@
1
1
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs"
2
2
  import { execFileSync } from "node:child_process"
3
- import { join, dirname, resolve, sep } from "node:path"
3
+ import { dirname, join, resolve, sep } from "node:path"
4
+ import { fileURLToPath } from "node:url"
4
5
 
5
- import { bold, green, cyan, red, dim } from "../utils/ansi.mjs"
6
+ import { bold, green, cyan, red, dim, yellow } from "../utils/ansi.mjs"
6
7
  import { requireAuth } from "../utils/auth.mjs"
7
8
  import {
8
9
  fetchRegistryItem,
@@ -22,6 +23,15 @@ import {
22
23
  } from "../utils/deck-config.mjs"
23
24
  import { confirm, closePrompts } from "../utils/prompts.mjs"
24
25
 
26
+ const __dirname = dirname(fileURLToPath(import.meta.url))
27
+ const CLI_VERSION = JSON.parse(readFileSync(join(__dirname, "..", "..", "package.json"), "utf-8")).version
28
+
29
+ /** Extract minor version number from a version string like "0.3.0" or "^0.3.0". */
30
+ function parseMinor(version) {
31
+ const match = version.replace(/^[\^~>=<\s]+/, "").match(/^(\d+)\.(\d+)/)
32
+ return match ? Number(match[2]) : null
33
+ }
34
+
25
35
  export async function add(args) {
26
36
  const cwd = process.cwd()
27
37
 
@@ -181,6 +191,21 @@ export async function add(args) {
181
191
  }
182
192
  }
183
193
 
194
+ // Check promptslide version compatibility
195
+ const publishedVersion = item.promptslideVersion
196
+ if (publishedVersion) {
197
+ const publishedMinor = parseMinor(publishedVersion)
198
+ const localMinor = parseMinor(CLI_VERSION)
199
+ if (publishedMinor !== null && localMinor !== null && publishedMinor !== localMinor) {
200
+ console.log()
201
+ console.log(` ${yellow("⚠")} This content was published with promptslide ${bold(`v${publishedVersion}`)}`)
202
+ console.log(` You have ${bold(`v${CLI_VERSION}`)} installed — this may cause issues.`)
203
+ const pm = detectPackageManager(cwd)
204
+ const installCmd = pm === "bun" ? "bun add" : pm === "pnpm" ? "pnpm add" : pm === "yarn" ? "yarn add" : "npm install"
205
+ console.log(` Run: ${cyan(`${installCmd} promptslide@^${publishedVersion}`)}`)
206
+ }
207
+ }
208
+
184
209
  // Install npm dependencies
185
210
  const existingPkg = join(cwd, "package.json")
186
211
  if (Object.keys(resolved.npmDeps).length > 0 && existsSync(existingPkg)) {
@@ -3,7 +3,7 @@ import { existsSync, cpSync, readFileSync, writeFileSync, mkdirSync } from "node
3
3
  import { join, resolve, dirname } from "node:path"
4
4
  import { fileURLToPath } from "node:url"
5
5
 
6
- import { bold, green, cyan, red, dim } from "../utils/ansi.mjs"
6
+ import { bold, green, cyan, red, dim, yellow } from "../utils/ansi.mjs"
7
7
  import { requireAuth } from "../utils/auth.mjs"
8
8
  import { hexToOklch, isValidHex } from "../utils/colors.mjs"
9
9
  import { prompt, confirm, closePrompts } from "../utils/prompts.mjs"
@@ -169,6 +169,17 @@ export async function create(args) {
169
169
  const versionTag = item.version ? ` ${dim(`v${item.version}`)}` : ""
170
170
  console.log(` Using deck ${bold(item.title || item.name)}${versionTag}`)
171
171
 
172
+ // Warn if the deck was published with a different minor version
173
+ if (item.promptslideVersion) {
174
+ const pubParts = item.promptslideVersion.match(/^(\d+)\.(\d+)/)
175
+ const localParts = CLI_VERSION.match(/^(\d+)\.(\d+)/)
176
+ if (pubParts && localParts && pubParts[2] !== localParts[2]) {
177
+ console.log()
178
+ console.log(` ${yellow("⚠")} This deck was published with promptslide ${bold(`v${item.promptslideVersion}`)}`)
179
+ console.log(` You have ${bold(`v${CLI_VERSION}`)} installed — some slides may need updating.`)
180
+ }
181
+ }
182
+
172
183
  let resolved
173
184
  try {
174
185
  resolved = await resolveRegistryDependencies(item, auth, targetDir)
@@ -1,5 +1,6 @@
1
1
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs"
2
- import { join, basename, relative, extname } from "node:path"
2
+ import { dirname, join, basename, relative, extname } from "node:path"
3
+ import { fileURLToPath } from "node:url"
3
4
 
4
5
  import { bold, green, cyan, red, dim } from "../utils/ansi.mjs"
5
6
  import { requireAuth } from "../utils/auth.mjs"
@@ -8,6 +9,9 @@ import { publishToRegistry, registryItemExists, searchRegistry, updateLockfileIt
8
9
  import { prompt, confirm, select, closePrompts } from "../utils/prompts.mjs"
9
10
  import { parseDeckConfig } from "../utils/deck-config.mjs"
10
11
 
12
+ const __dirname = dirname(fileURLToPath(import.meta.url))
13
+ const CLI_VERSION = JSON.parse(readFileSync(join(__dirname, "..", "..", "package.json"), "utf-8")).version
14
+
11
15
  function readDeckPrefix(cwd) {
12
16
  // Prefer stored prefix from lockfile (user's previous choice)
13
17
  const lock = readLockfile(cwd)
@@ -292,7 +296,8 @@ async function publishItem({ filePath, cwd, auth, typeOverride, interactive = tr
292
296
  npmDependencies: Object.keys(npmDeps).length ? npmDeps : undefined,
293
297
  registryDependencies: prefixedDeps.length ? prefixedDeps : undefined,
294
298
  releaseNotes: releaseNotes || undefined,
295
- previewImage: previewImage || undefined
299
+ previewImage: previewImage || undefined,
300
+ promptslideVersion: CLI_VERSION
296
301
  }
297
302
 
298
303
  const result = await publishToRegistry(payload, auth)
@@ -378,6 +383,9 @@ export async function publish(args) {
378
383
  const existingSlug = existingLock.deckSlug
379
384
  let deckPrefix, deckSlug
380
385
 
386
+ const dirName = basename(cwd)
387
+ const deckBaseSlug = dirName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")
388
+
381
389
  if (existingSlug) {
382
390
  console.log(` ${dim("Previously published as")} ${cyan(existingSlug)}`)
383
391
  console.log()
@@ -388,14 +396,10 @@ export async function publish(args) {
388
396
  deckPrefix = existingSlug.split("/")[0]
389
397
  } else {
390
398
  deckPrefix = await promptDeckPrefix(cwd, true)
391
- const dirName = basename(cwd)
392
- const deckBaseSlug = dirName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")
393
399
  deckSlug = `${deckPrefix}/${deckBaseSlug}`
394
400
  }
395
401
  } else {
396
402
  deckPrefix = await promptDeckPrefix(cwd, true)
397
- const dirName = basename(cwd)
398
- const deckBaseSlug = dirName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")
399
403
  deckSlug = `${deckPrefix}/${deckBaseSlug}`
400
404
  }
401
405
 
@@ -580,7 +584,8 @@ export async function publish(args) {
580
584
  title: "Theme",
581
585
  files: themePayloadFiles,
582
586
  registryDependencies: assetDeps.length ? assetDeps : undefined,
583
- npmDependencies: Object.keys(npmDeps).length ? npmDeps : undefined
587
+ npmDependencies: Object.keys(npmDeps).length ? npmDeps : undefined,
588
+ promptslideVersion: CLI_VERSION
584
589
  }, auth)
585
590
  console.log(` [${itemIndex}/${totalItems}] ${green("✓")} theme ${cyan(themeSlug)} ${dim(`v${result.version}`)}`)
586
591
  updateLockfileItem(cwd, themeSlug, result.version ?? 0, themeFileHashes)
@@ -618,7 +623,8 @@ export async function publish(args) {
618
623
  title: titleCase(layoutName),
619
624
  files: [{ path: layoutFile, target: "src/layouts/", content }],
620
625
  registryDependencies: regDeps.length ? regDeps : undefined,
621
- npmDependencies: Object.keys(npmDeps).length ? npmDeps : undefined
626
+ npmDependencies: Object.keys(npmDeps).length ? npmDeps : undefined,
627
+ promptslideVersion: CLI_VERSION
622
628
  }, auth)
623
629
  console.log(` [${itemIndex}/${totalItems}] ${green("✓")} layout ${cyan(layoutSlug)} ${dim(`v${result.version}`)}`)
624
630
  updateLockfileItem(cwd, layoutSlug, result.version ?? 0, fileHashes)
@@ -669,7 +675,8 @@ export async function publish(args) {
669
675
  section,
670
676
  registryDependencies: regDeps.length ? regDeps : undefined,
671
677
  npmDependencies: Object.keys(npmDeps).length ? npmDeps : undefined,
672
- previewImage: slidePreview || undefined
678
+ previewImage: slidePreview || undefined,
679
+ promptslideVersion: CLI_VERSION
673
680
  }, auth)
674
681
  console.log(` [${itemIndex}/${totalItems}] ${green("✓")} slide ${cyan(slideSlug)} ${dim(`v${result.version}`)}`)
675
682
  updateLockfileItem(cwd, slideSlug, result.version ?? 0, fileHashes)
@@ -698,7 +705,8 @@ export async function publish(args) {
698
705
  files: [],
699
706
  registryDependencies: allDeckDeps.length ? allDeckDeps : undefined,
700
707
  releaseNotes: releaseNotes || undefined,
701
- previewImage: previewImage || undefined
708
+ previewImage: previewImage || undefined,
709
+ promptslideVersion: CLI_VERSION
702
710
  }, auth)
703
711
  console.log(` [${itemIndex}/${totalItems}] ${green("✓")} deck ${cyan(deckSlug)} ${dim(`v${result.version}`)}`)
704
712
  updateLockfileItem(cwd, deckSlug, result.version ?? 0, {})
@@ -886,7 +894,8 @@ export async function publish(args) {
886
894
  npmDependencies: Object.keys(npmDeps).length ? npmDeps : undefined,
887
895
  registryDependencies: prefixedRegistryDeps.length ? prefixedRegistryDeps : undefined,
888
896
  releaseNotes: releaseNotes || undefined,
889
- previewImage: previewImage || undefined
897
+ previewImage: previewImage || undefined,
898
+ promptslideVersion: CLI_VERSION
890
899
  }
891
900
 
892
901
  try {