Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
a3436bf
fix(deploy): enable static export for R2 bucket hosting (#332)
perasperaactual Apr 10, 2026
6353011
fix(deploy): add trailing slash support for R2 static hosting (#334)
perasperaactual Apr 10, 2026
facb5c4
Merge branch 'main' into dev
perasperaactual Apr 10, 2026
cb7679e
fix(deploy): migrate from R2 to Cloudflare Pages (#336)
perasperaactual Apr 10, 2026
abce1d7
Fix/cloudflare pages (#337)
perasperaactual Apr 10, 2026
5fb4e1b
feat(hooks): add @stackwright/hooks-registry for cross-module singlet…
perasperaactual Apr 12, 2026
3a364fe
docs: document shared validation module architecture (fixes #338) (#342)
perasperaactual Apr 12, 2026
eb9a86e
fix(core): resolve theme tokens in icon color prop (fixes #339) (#343)
perasperaactual Apr 12, 2026
79b6c0c
feat(security): add secrets scanning and plugin security guidelines (…
perasperaactual Apr 13, 2026
83ce57d
feat(types,build-scripts): add env var resolution for integration sec…
Apr 13, 2026
bbf58ef
chore: add changeset for #245
Apr 13, 2026
8fa3dcf
feat(types,build-scripts): env var resolution for integration secrets…
perasperaactual Apr 13, 2026
68bdad5
fix(security): add plugin config schema validation (#242) (#349)
perasperaactual Apr 13, 2026
6326d49
feat(nextjs): add security headers - CSP, HSTS, COOP/CORP/COEP (#243)…
perasperaactual Apr 14, 2026
a410f02
fix(cli): remove duplicate preInstall hook call from processTemplate …
perasperaactual Apr 15, 2026
c2ade22
docs: remove ROADMAP.md and clean up stale documentation references (…
perasperaactual Apr 15, 2026
c036f5b
chore: consolidate dependabot dependency updates (#364)
perasperaactual Apr 16, 2026
35c5673
fix(deps): bump hono override to >=4.12.14 to patch GHSA-458j-xx4x-4375
Apr 16, 2026
90a22c6
fix(cli): --install flag now runs pnpm install before postInstall hoo…
perasperaactual Apr 16, 2026
5ad5035
fix(core): prevent duplicate TopAppBar rendering — double dark-mode t…
perasperaactual Apr 16, 2026
ef7684b
chore: adding image files to example pages
Apr 16, 2026
13ce285
fix: remove broken changeset referencing non-existent stackwright pac…
Apr 16, 2026
6eba223
fix: remove broken changeset referencing non-existent stackwright pac…
Apr 16, 2026
f0b74ef
feat(cli): add --content flag to page add for inline YAML (#188) (#367)
perasperaactual Apr 17, 2026
24ecf08
chore(deps-dev): bump @changesets/cli from 2.30.0 to 2.31.0
dependabot[bot] Apr 22, 2026
bdf7fe0
feat(types,build-scripts): pro plugin content schema extension + YAML…
perasperaactual Apr 27, 2026
5ffc0d2
Merge pull request #377 from Per-Aspera-LLC/dependabot/npm_and_yarn/c…
perasperaactual Apr 27, 2026
e1a8c5b
Merge remote-tracking branch 'origin/main' into dev
Apr 27, 2026
8925116
fix: basic-ftp HIGH vuln pnpm override, perf workflow playwright + br…
Apr 27, 2026
83ba70c
fix(build-scripts): preserve this binding in executePluginHook (#383)
perasperaactual Apr 28, 2026
5d1a5c8
fix: remove hardcoded pnpm version from CI workflows
Apr 28, 2026
5e0b7fb
chore: back-merge main into dev (dead-changeset cleanup)
Apr 28, 2026
bce04f1
chore(*): uuid update to version 14 (#385)
perasperaactual Apr 28, 2026
a6e1483
chore: enter prerelease mode [skip ci]
invalid-email-address Apr 28, 2026
877417c
chore: bump prerelease versions [skip ci]
invalid-email-address Apr 28, 2026
c54d17d
chore(*): uuid update to version 14 (#387)
perasperaactual Apr 28, 2026
bb4ecb7
fix(build-scripts): create parent dir for nested page slug output fil…
perasperaactual Apr 28, 2026
7d844a1
chore: bump prerelease versions [skip ci]
invalid-email-address Apr 28, 2026
0ddadb6
chore: back-merge main after release [skip ci]
github-actions[bot] Apr 28, 2026
504c699
fix(ci): remove duplicate pull_request trigger from release workflow …
perasperaactual Apr 29, 2026
0cb62d4
fix(changeset): correct phantom version baselines in pre.json, remove…
perasperaactual Apr 29, 2026
0d66403
chore: bump prerelease versions [skip ci]
invalid-email-address Apr 29, 2026
fb3393e
fix(core): bundle prismjs to eliminate bare ESM sub-path import error…
perasperaactual Apr 29, 2026
ffed49c
chore: bump prerelease versions [skip ci]
invalid-email-address Apr 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/add-plugin-content-schema-extension.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@stackwright/types": minor
---

Add `contentItemSchemas` and `knownContentTypeKeys` to `PrebuildPlugin` interface.
Add `buildExtendedPageContentSchema()` function for merging OSS and plugin content schemas.
Add `ValidatePageContentOptions` to `validatePageContent()` for plugin-aware validation.
6 changes: 6 additions & 0 deletions .changeset/add-pro-content-normalization.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@stackwright/build-scripts": minor
---

Add content format normalization (mapping-key YAML format → type-field format) to prebuild pipeline.
Plugin `contentItemSchemas` and `knownContentTypeKeys` are now applied during page validation.
15 changes: 15 additions & 0 deletions .changeset/dependabot-batch-updates.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
"@stackwright/core": patch
"@stackwright/icons": patch
"@stackwright/maplibre": patch
"@stackwright/nextjs": patch
"@stackwright/ui-shadcn": patch
---

chore: consolidate dependabot dependency updates

- `lucide-react`: `^0.525.0` → `^1.8.0` (icons, ui-shadcn) — includes icon rename fixes for v1 API (`CheckCircle` → `CircleCheck`, `Code2`/`Layout` backward-compat aliases)
- `@swc/core`: `^1.15.18` → `^1.15.26` (core, nextjs)
- `jsdom`: `^28.1.0` → `^29.0.2` (maplibre)
- `react-dom`: `19.2.4` → `19.2.5` (pnpm.overrides)
- `prettier`: `^3.8.1` → `^3.8.3` (devDependencies)
7 changes: 7 additions & 0 deletions .changeset/feat-188-page-add-content-flag.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@stackwright/cli": patch
---

feat(cli): add --content flag to `page add` for inline YAML (#188)

Agents can now create a page with full content in a single command instead of a two-step add + write sequence. Content is validated before writing; invalid YAML is rejected with field-level errors.
5 changes: 5 additions & 0 deletions .changeset/feat-243-security-headers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@stackwright/nextjs": minor
---

Add security headers (CSP, HSTS, COOP/CORP/COEP) to Next.js integration with customizable configuration
5 changes: 5 additions & 0 deletions .changeset/fix-352-install-flag-actually-installs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@stackwright/cli": patch
---

fix(cli): --install flag now runs pnpm install before postInstall hooks
6 changes: 6 additions & 0 deletions .changeset/fix-plugin-config-schema-242.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@stackwright/types": patch
"@stackwright/build-scripts": patch
---

Add configSchema field to PrebuildPlugin for plugin config validation
14 changes: 14 additions & 0 deletions .changeset/fix-plugin-this-binding.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"@stackwright/build-scripts": patch
---

fix(executePluginHook): preserve `this` binding when calling plugin lifecycle hooks

`executePluginHook` was extracting hook methods as unbound references
(`const hookFn = plugin[hook]`) and calling them as plain functions
(`hookFn(context)`). In strict-mode ES classes, this strips `this`,
causing any plugin that calls a private/instance method from `beforeBuild`
or `afterBuild` to throw `Cannot read properties of undefined`.

Fix: use `hookFn.call(plugin, context)` so the plugin instance is always
the receiver.
18 changes: 18 additions & 0 deletions .changeset/fix-preinstall-double-run.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
"@stackwright/cli": patch
---

fix(cli): remove duplicate preInstall hook call from processTemplate

`processTemplate()` was calling `runScaffoldHooks('preInstall', ...)` internally,
then `scaffold.ts` called it again after `processTemplate` returned — running every
preInstall handler twice. Worse, the second call passed the original empty `{}` object
(not the built package.json), so hooks registered via `scaffold.ts` could never affect
the written file.

Fix: lifecycle orchestration now lives entirely in `scaffold.ts`. `buildPackageJson` is
exported so `scaffold.ts` can build the default package.json before running preInstall
hooks, then passes the already-hooks-modified object into `processTemplate` for writing.
`processTemplate` no longer calls hooks.

Fixes #351.
15 changes: 15 additions & 0 deletions .changeset/fix-prismjs-esm-bundle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
"@stackwright/core": patch
---

fix(core): bundle prismjs to eliminate bare ESM sub-path imports

`@stackwright/core`'s published ESM bundle contained bare imports such as
`import 'prismjs/components/prism-javascript'` (no `.js` extension). Because
`prismjs` is a legacy CJS package with no `exports` map, Node.js ESM strict
resolver could not find these paths and threw `ERR_MODULE_NOT_FOUND`.

Added `noExternal: ['prismjs']` to `tsup.config.ts` so that esbuild bundles
prismjs inline at build time. All language grammar paths are resolved to real
`.js` files before the bundle is published — no bare specifiers escape into
the output.
5 changes: 5 additions & 0 deletions .changeset/grumpy-paws-create.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@stackwright/core": patch
---

fix(core): prevent duplicate TopAppBar rendering that caused a double dark-mode toggle icon
37 changes: 37 additions & 0 deletions .changeset/pre.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"mode": "pre",
"tag": "alpha",
"initialVersions": {
"stackwright-docs": "0.1.2",
"@stackwright/build-scripts": "0.5.1",
"@stackwright/cli": "0.8.1",
"@stackwright/collections": "0.1.0",
"@stackwright/core": "0.8.0",
"@stackwright/e2e": "0.3.0",
"@stackwright/hooks-registry": "0.1.0",
"@stackwright/icons": "0.5.0",
"launch-stackwright": "0.2.1",
"@stackwright/maplibre": "2.0.0",
"@stackwright/mcp": "0.4.1",
"@stackwright/nextjs": "0.4.0",
"@stackwright/otters": "0.2.0",
"@stackwright/sbom-generator": "0.2.0",
"@stackwright/scaffold-core": "0.3.0",
"@stackwright/themes": "0.5.2",
"@stackwright/types": "1.2.0",
"@stackwright/ui-shadcn": "0.1.1"
},
"changesets": [
"add-plugin-content-schema-extension",
"add-pro-content-normalization",
"dependabot-batch-updates",
"feat-188-page-add-content-flag",
"feat-243-security-headers",
"fix-352-install-flag-actually-installs",
"fix-plugin-config-schema-242",
"fix-plugin-this-binding",
"fix-preinstall-double-run",
"fix-prismjs-esm-bundle",
"grumpy-paws-create"
]
}
8 changes: 1 addition & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,6 @@ on:
push:
branches:
- main
pull_request:
branches:
- main
types:
- closed

permissions:
contents: write
Expand All @@ -21,7 +16,7 @@ jobs:
# Squash merges embed individual commit messages in the body, and automated
# commits (prerelease bumps, etc.) include [skip ci] — which would incorrectly
# suppress the release workflow if we used contains() on the full body.
if: "${{ !startsWith(github.event.head_commit.message, 'chore: version packages for release [skip ci]') }}"
if: "${{ github.event_name == 'push' && !startsWith(github.event.head_commit.message, 'chore: version packages for release [skip ci]') }}"
steps:
- name: Generate PerAsperaCI token
id: app-token
Expand All @@ -42,7 +37,6 @@ jobs:
node-version: 22
registry-url: 'https://registry.npmjs.org'
cache: 'pnpm'
provenance: true

- run: pnpm install --frozen-lockfile

Expand Down
32 changes: 32 additions & 0 deletions examples/stackwright-docs/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,37 @@
# stackwright-docs

## 0.1.3-alpha.2

### Patch Changes

- Updated dependencies [fb3393e]
- @stackwright/core@0.8.1-alpha.2
- @stackwright/nextjs@0.5.0-alpha.2

## 0.1.3-alpha.1

### Patch Changes

- Updated dependencies [c036f5b]
- Updated dependencies [6326d49]
- Updated dependencies [5ad5035]
- @stackwright/core@0.8.1-alpha.1
- @stackwright/icons@0.5.1-alpha.1
- @stackwright/nextjs@0.5.0-alpha.1
- @stackwright/ui-shadcn@0.1.2-alpha.1

## 0.1.3-alpha.0

### Patch Changes

- Updated dependencies [c036f5b]
- Updated dependencies [6326d49]
- Updated dependencies [5ad5035]
- @stackwright/core@0.8.1-alpha.0
- @stackwright/icons@0.5.1-alpha.0
- @stackwright/nextjs@0.5.0-alpha.0
- @stackwright/ui-shadcn@0.1.2-alpha.0

## 0.1.2

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion examples/stackwright-docs/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "stackwright-docs",
"version": "0.1.2",
"version": "0.1.3-alpha.2",
"private": true,
"scripts": {
"prebuild": "stackwright-prebuild",
Expand Down
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@
"hono": ">=4.12.14",
"@hono/node-server": ">=1.19.10",
"basic-ftp": ">=5.3.0",
"express-rate-limit": ">=8.2.2"
"express-rate-limit": ">=8.2.2",
"uuid": ">=14.0.0"
},
"onlyBuiltDependencies": [
"@swc/core",
Expand All @@ -114,4 +115,4 @@
"@commitlint/config-conventional"
]
}
}
}
25 changes: 25 additions & 0 deletions packages/build-scripts/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,30 @@
# @stackwright/build-scripts

## 0.6.0-alpha.0

### Minor Changes

- bdf7fe0: Add content format normalization (mapping-key YAML format → type-field format) to prebuild pipeline.
Plugin `contentItemSchemas` and `knownContentTypeKeys` are now applied during page validation.

### Patch Changes

- 68bdad5: Add configSchema field to PrebuildPlugin for plugin config validation
- 83ba70c: fix(executePluginHook): preserve `this` binding when calling plugin lifecycle hooks

`executePluginHook` was extracting hook methods as unbound references
(`const hookFn = plugin[hook]`) and calling them as plain functions
(`hookFn(context)`). In strict-mode ES classes, this strips `this`,
causing any plugin that calls a private/instance method from `beforeBuild`
or `afterBuild` to throw `Cannot read properties of undefined`.

Fix: use `hookFn.call(plugin, context)` so the plugin instance is always
the receiver.

- Updated dependencies [bdf7fe0]
- Updated dependencies [68bdad5]
- @stackwright/types@1.3.0-alpha.1

## 0.5.1

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/build-scripts/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@stackwright/build-scripts",
"version": "0.5.1",
"version": "0.6.0-alpha.0",
"description": "Build-time scripts for Stackwright projects (prebuild image processing, YAML compilation)",
"license": "MIT",
"repository": {
Expand Down
31 changes: 31 additions & 0 deletions packages/cli/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
# @stackwright/cli

## 0.8.2-alpha.0

### Patch Changes

- f0b74ef: feat(cli): add --content flag to `page add` for inline YAML (#188)

Agents can now create a page with full content in a single command instead of a two-step add + write sequence. Content is validated before writing; invalid YAML is rejected with field-level errors.

- 90a22c6: fix(cli): --install flag now runs pnpm install before postInstall hooks
- a410f02: fix(cli): remove duplicate preInstall hook call from processTemplate

`processTemplate()` was calling `runScaffoldHooks('preInstall', ...)` internally,
then `scaffold.ts` called it again after `processTemplate` returned — running every
preInstall handler twice. Worse, the second call passed the original empty `{}` object
(not the built package.json), so hooks registered via `scaffold.ts` could never affect
the written file.

Fix: lifecycle orchestration now lives entirely in `scaffold.ts`. `buildPackageJson` is
exported so `scaffold.ts` can build the default package.json before running preInstall
hooks, then passes the already-hooks-modified object into `processTemplate` for writing.
`processTemplate` no longer calls hooks.

Fixes #351.

- Updated dependencies [bdf7fe0]
- Updated dependencies [bdf7fe0]
- Updated dependencies [68bdad5]
- Updated dependencies [83ba70c]
- @stackwright/types@1.3.0-alpha.1
- @stackwright/build-scripts@0.6.0-alpha.0

## 0.8.1

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@stackwright/cli",
"version": "0.8.1",
"version": "0.8.2-alpha.0",
"description": "CLI for Stackwright framework",
"license": "MIT",
"repository": {
Expand Down
48 changes: 48 additions & 0 deletions packages/core/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,53 @@
# @stackwright/core

## 0.8.1-alpha.2

### Patch Changes

- fb3393e: fix(core): bundle prismjs to eliminate bare ESM sub-path imports

`@stackwright/core`'s published ESM bundle contained bare imports such as
`import 'prismjs/components/prism-javascript'` (no `.js` extension). Because
`prismjs` is a legacy CJS package with no `exports` map, Node.js ESM strict
resolver could not find these paths and threw `ERR_MODULE_NOT_FOUND`.

Added `noExternal: ['prismjs']` to `tsup.config.ts` so that esbuild bundles
prismjs inline at build time. All language grammar paths are resolved to real
`.js` files before the bundle is published — no bare specifiers escape into
the output.

## 0.8.1-alpha.1

### Patch Changes

- c036f5b: chore: consolidate dependabot dependency updates
- `lucide-react`: `^0.525.0` → `^1.8.0` (icons, ui-shadcn) — includes icon rename fixes for v1 API (`CheckCircle` → `CircleCheck`, `Code2`/`Layout` backward-compat aliases)
- `@swc/core`: `^1.15.18` → `^1.15.26` (core, nextjs)
- `jsdom`: `^28.1.0` → `^29.0.2` (maplibre)
- `react-dom`: `19.2.4` → `19.2.5` (pnpm.overrides)
- `prettier`: `^3.8.1` → `^3.8.3` (devDependencies)

- 5ad5035: fix(core): prevent duplicate TopAppBar rendering that caused a double dark-mode toggle icon
- Updated dependencies [bdf7fe0]
- Updated dependencies [68bdad5]
- @stackwright/types@1.3.0-alpha.1

## 0.8.1-alpha.0

### Patch Changes

- c036f5b: chore: consolidate dependabot dependency updates
- `lucide-react`: `^0.525.0` → `^1.8.0` (icons, ui-shadcn) — includes icon rename fixes for v1 API (`CheckCircle` → `CircleCheck`, `Code2`/`Layout` backward-compat aliases)
- `@swc/core`: `^1.15.18` → `^1.15.26` (core, nextjs)
- `jsdom`: `^28.1.0` → `^29.0.2` (maplibre)
- `react-dom`: `19.2.4` → `19.2.5` (pnpm.overrides)
- `prettier`: `^3.8.1` → `^3.8.3` (devDependencies)

- 5ad5035: fix(core): prevent duplicate TopAppBar rendering that caused a double dark-mode toggle icon
- Updated dependencies [bdf7fe0]
- Updated dependencies [68bdad5]
- @stackwright/types@1.3.0-alpha.0

## 0.8.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@stackwright/core",
"version": "0.8.0",
"version": "0.8.1-alpha.2",
"description": "Core framework for building applications from YAML configuration",
"license": "MIT",
"repository": {
Expand Down
Loading