Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
72217d2
Create EPIC_NON_HTML_PAGES.md
emmadesilva Jul 13, 2026
48cb08a
Add agent instructions for epic-driven development
emmadesilva Jul 13, 2026
2139c04
Add support for declaring non-HTML output file extensions on pages
emmadesilva Jul 13, 2026
485bf59
Add unit tests for output file extension behavior
emmadesilva Jul 13, 2026
9b41911
Add feature tests for non-HTML in-memory page output
emmadesilva Jul 13, 2026
e134504
Add release notes for non-HTML page output support
emmadesilva Jul 13, 2026
0991fa2
Include declared non-HTML output file extensions in route keys
emmadesilva Jul 13, 2026
ff755a0
Document PR 1 decisions in the epic and refine release notes
emmadesilva Jul 13, 2026
63935d5
Build documentation
emmadesilva Jul 13, 2026
260bca9
Rename page source file extension API to sourceExtension
emmadesilva Jul 13, 2026
6ae37ef
Rename the output file extension API to outputExtension
emmadesilva Jul 13, 2026
5f36088
Expand the output path extension rule into an explicit conditional
emmadesilva Jul 13, 2026
3b2225d
Describe the explicit output extension allowlist by its behavior
emmadesilva Jul 13, 2026
ce88b6b
Inline the route key output extension handling
emmadesilva Jul 13, 2026
6faabfd
Build documentation for the renamed extension APIs
emmadesilva Jul 13, 2026
dc1c08f
Document the extension API rename and seed the upgrade script rules
emmadesilva Jul 13, 2026
03a11d7
Record the PR 1 review outcomes in the epic
emmadesilva Jul 13, 2026
9aed28b
Fix the swapped source and output directory setter docblocks
emmadesilva Jul 13, 2026
91c920e
Test subclass customization of the explicit output extensions
emmadesilva Jul 13, 2026
bb9884d
Generalize the output directory docblock beyond HTML output
emmadesilva Jul 13, 2026
d723bb1
Cover overridden method declarations in the extension rename migration
emmadesilva Jul 13, 2026
2f451f9
Append the output extension to the completed route key
emmadesilva Jul 13, 2026
705c57b
Validate declared output extensions
emmadesilva Jul 13, 2026
c47819e
Fail fast for page classes using the renamed v2 extension API
emmadesilva Jul 13, 2026
03c6d38
Reject redirect source paths that cannot produce a working redirect
emmadesilva Jul 13, 2026
4474317
Cover named arguments in the extension rename migration rule
emmadesilva Jul 13, 2026
67b6ca1
Test discoverable page class with distinct source and output extensions
emmadesilva Jul 13, 2026
b9e664a
Update stale epic note on redirect paths with non-HTML extensions
emmadesilva Jul 13, 2026
f31ee85
Merge pull request #2525 from hydephp/v3/non-html-pages-foundation
emmadesilva Jul 13, 2026
c2b1e6a
Resolve registered routes before proxying static assets in the dev se…
emmadesilva Jul 13, 2026
86b7ef3
Test route-first resolution against matching and missing static assets
emmadesilva Jul 13, 2026
ba3e4ad
Document realtime compiler route-first resolution in epic and release…
emmadesilva Jul 13, 2026
51774e1
Merge pull request #2526 from hydephp/v3/non-html-pages-realtime-comp…
emmadesilva Jul 13, 2026
574638e
Revise non-HTML pages epic scope
emmadesilva Jul 13, 2026
132bfd4
Revise the epic for changed scope
emmadesilva Jul 13, 2026
bf3d858
Update EPIC_NON_HTML_PAGES.md
emmadesilva Jul 13, 2026
a8f644f
Add page-level sitemap inclusion control via showInSitemap()
emmadesilva Jul 13, 2026
c5a38c9
Add showInSitemap to the page unit test contract
emmadesilva Jul 13, 2026
f13e5c1
Test sitemap exclusions for front matter, non-HTML pages, and search …
emmadesilva Jul 13, 2026
ede3358
Document the sitemap inclusion policy in the epic and release notes
emmadesilva Jul 13, 2026
1bb55af
Use filter_var to parse sitemap front matter boolean
emmadesilva Jul 13, 2026
d762ec1
Test that quoted false front matter excludes pages from the sitemap
emmadesilva Jul 13, 2026
9f4b161
Fix test setup
emmadesilva Jul 13, 2026
db53aae
Generate documentation
emmadesilva Jul 13, 2026
64d074e
Merge pull request #2528 from hydephp/v3/non-html-pages-sitemap-inclu…
emmadesilva Jul 13, 2026
68763e1
Add SitemapPage registered through core extension page discovery
emmadesilva Jul 13, 2026
b068978
Convert the sitemap from a post-build task to the registered page
emmadesilva Jul 13, 2026
7b1606b
Update tests for the sitemap build task to page conversion
emmadesilva Jul 13, 2026
5e64d19
Test the sitemap page registration, customization, and serving paths
emmadesilva Jul 13, 2026
842652e
Add release notes and upgrade guide for the sitemap page conversion
emmadesilva Jul 13, 2026
2e2cafd
Record PR 5 part A decisions and implementation notes in the epic
emmadesilva Jul 13, 2026
c02bf70
Disable sitemap generation in tests asserting exact default collections
emmadesilva Jul 13, 2026
205fea8
Merge pull request #2529 from hydephp/v3/non-html-pages-convert-sitemap
emmadesilva Jul 13, 2026
a245364
Add RssFeedPage registered through core extension page discovery
emmadesilva Jul 13, 2026
8396af9
Convert the RSS feed from a post-build task to the registered page
emmadesilva Jul 13, 2026
5d801a6
Update tests for the RSS feed build task to page conversion
emmadesilva Jul 13, 2026
dc1954c
Test the RSS feed page registration, customization, and serving paths
emmadesilva Jul 13, 2026
8c25fca
Add release notes, upgrade guide, and epic notes for the RSS feed pag…
emmadesilva Jul 13, 2026
8199923
Disable RSS feed generation in tests asserting exact default collections
emmadesilva Jul 13, 2026
c87e86b
Fail the sitemap and RSS commands with the unmet condition instead of…
emmadesilva Jul 13, 2026
77fcb35
Update command tests for the removed generation fallbacks
emmadesilva Jul 13, 2026
ff13bf4
Document the revised sitemap and RSS command guard semantics
emmadesilva Jul 13, 2026
ef9d524
Merge pull request #2530 from hydephp/v3/non-html-pages-convert-rss-feed
emmadesilva Jul 13, 2026
a9c4d06
Merge branch 'v3/non-html-pages-convert-rss-feed' into v3/non-html-pages
emmadesilva Jul 13, 2026
017b8d0
Cover the SimpleXML fallback skip reason in both XML build commands
emmadesilva Jul 13, 2026
588d700
Replace the dynamic skip reasons with a static error message
emmadesilva Jul 13, 2026
37d3c96
Document the generic command guard message revision
emmadesilva Jul 13, 2026
aa896ff
Add a generated robots.txt page
emmadesilva Jul 13, 2026
4f5518f
Adapt existing tests to the generated robots.txt page
emmadesilva Jul 13, 2026
2ba104b
Test the generated robots.txt page
emmadesilva Jul 13, 2026
b35a17d
Add release notes and upgrade guidance for the generated robots.txt
emmadesilva Jul 13, 2026
7cf6107
Mark PR 6 as implemented in the non-HTML pages epic
emmadesilva Jul 13, 2026
77cbb64
Validate that configured robots.txt disallow rules are strings
emmadesilva Jul 13, 2026
cd348f9
Document robots.txt disallow entries as rule values, not paths
emmadesilva Jul 13, 2026
1aa759f
Update CLAUDE.md
emmadesilva Jul 13, 2026
0c9e20d
Merge pull request #2531 from hydephp/v3/non-html-pages-robots
emmadesilva Jul 13, 2026
57b5c74
Create LLMS_TXT_RESEARCH.md
emmadesilva Jul 13, 2026
ddf9e57
Add page-level llms.txt inclusion policy
emmadesilva Jul 13, 2026
5c040c3
Add a generated llms.txt page
emmadesilva Jul 13, 2026
f929f0f
Test the generated llms.txt page
emmadesilva Jul 13, 2026
37c61d5
Adapt existing tests to the generated llms.txt page
emmadesilva Jul 13, 2026
562bf01
Add release notes and upgrade guidance for the generated llms.txt
emmadesilva Jul 13, 2026
9cd5305
Mark PR 7 as implemented in the non-HTML pages epic
emmadesilva Jul 13, 2026
5398218
Guard the llms.txt section config against drifting from the generator…
emmadesilva Jul 13, 2026
1fedc4f
Derive llms.txt inclusion from sitemap inclusion instead of a new pag…
emmadesilva Jul 13, 2026
f2f6822
Move the llms.txt sections from config into the generator
emmadesilva Jul 13, 2026
219c5cc
List pages in llms.txt based on their sitemap inclusion
emmadesilva Jul 13, 2026
ce85a13
Escape Markdown syntax in llms.txt link labels and pin the page ordering
emmadesilva Jul 13, 2026
354be98
Cover the generator override for pages excluded from the sitemap
emmadesilva Jul 13, 2026
f2eccda
Improve test clarity
emmadesilva Jul 13, 2026
15fe8db
Revert "Create LLMS_TXT_RESEARCH.md"
emmadesilva Jul 14, 2026
0099de3
Merge pull request #2534 from hydephp/v3/non-html-pages-llms-txt
emmadesilva Jul 14, 2026
4c99fcc
Add exact-path in-memory file pages
emmadesilva Jul 14, 2026
1e18227
Document exact-path in-memory files
emmadesilva Jul 14, 2026
fcb6f4d
Validate exact in-memory page paths
emmadesilva Jul 14, 2026
3f396a2
Rename exact output path tests
emmadesilva Jul 14, 2026
62feb3c
Document exact-path in-memory pages
emmadesilva Jul 14, 2026
0e7f2b2
Reject ambiguous exact output paths
emmadesilva Jul 14, 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
90 changes: 90 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Agent instructions for the HydePHP monorepo

This is the hydephp/develop monorepo. Framework code lives in `packages/framework`,
shared test utilities in `packages/testing`, the dev server in `packages/realtime-compiler`.
We are developing HydePHP v3; the main branch for PRs is `2.x`.

## Epic-driven workflow

- Multi-PR efforts are specified in epic documents at the repo root (like
`EPIC_NON_HTML_PAGES.md`). The epic is the source of truth: before implementing,
re-read the relevant PR section and design decisions; after implementing, check the
diff against them line by line.
- Deviations from the design and decisions the epic left open MUST be written back
into the epic in the same PR, and implemented sections marked (like "✅ Implemented").
- Before deviating, verify it is a *good* deviation: check side effects against the
rest of the epic (later PRs, design decisions) so the change doesn't drift from the
overall design. Also watch for silent under-delivery — implementing a design rule
only for the cases the current PR exercises will break later PRs that rely on it.
- Work on the epic happens in `v3/<epic-name>-*` branches off the epic base branch.
Check `git branch --list 'v3/*'` and the epic's status annotations (which may only
exist on PR branches) before assuming a PR is unimplemented.

## Commits

- Make atomic commits as you go: one logical change per commit (implementation,
tests, docs/release notes separately when they are separable). Do not batch a
whole PR into one commit at the end.

## Testing

The goal is full confidence: feature tests give 100% coverage by exercising all user
paths end-to-end (e.g. register a page, run the real `build` command, assert the
output file), and unit tests cover every code unit.

- Run suites with `vendor/bin/pest --testsuite FeatureFramework|UnitFramework|FeatureHyde`.
Use `--filter` for targeted runs. Run `php monorepo/HydeStan/run.php` before finishing.
- Every public method on page classes is part of the `BaseHydePageUnitTest` contract
(`packages/testing/src/Common/`): adding public API to `HydePage` means adding an
abstract test there and implementing it in all page unit tests in
`packages/framework/tests/Unit/Pages/`. `TestAllPageTypesHaveUnitTestsTest` enforces
one unit test class per page class.
- The suites read the real project root and pollute the working tree: they delete
`_media/app.css` and leave untracked junk (`_assets/`, `_docs/docs.md`, `_docs/index.md`,
`_pages/root.md`, `_pages/root1.md`, `_posts/my-new-post.md`, `_media/app.js`, `_site/`).
Dozens of environmental failures follow from that state — they are not regressions.
Restore with `git checkout -- _media/app.css` and delete the junk between runs.
- To prove a change introduces no regressions: run the suite at HEAD, then
`git checkout HEAD~N -- packages` (pre-change baseline), clean the tree, re-run,
and diff the sorted `FAILED` lines. Identical lists means no regressions. Restore
with `git checkout HEAD -- packages`. Don't pipe long pest runs through `tail` —
redirect to a file and grep it.
- Known pre-existing failure: `FeaturedImageUnitTest` on PHP 8.5 (`MediaFile::findHash()`).

## Release notes and docs

- Add release-notes entries to `HYDEPHP_V3_PLANNING.md` and upgrade steps to
`UPGRADE.md` as part of the PR that makes the change.
- Breaking-change notes must describe realistic impact. If the note describes a
scenario nobody would plausibly be in (like relying on double-extension output
such as `data.json.html`), say that no real impact is expected instead of
prescribing a migration.

## Code comments

If you catch yourself writing a code comment, stop and think about why. A comment is
usually a smell that the code is doing something weird — step back and look at what
you are actually trying to do before reaching for a comment. Comments are only for:

1. Adding better type support (docblocks, `@param`/`@var` annotations).
2. Documenting public APIs.
3. Explaining why unusual-looking code has to be that way, when there is no other option.

Never write comments that narrate what the next line does, where code came from, or
why a change is correct — that belongs in the PR description, not the code.

## Developer Experience

HydePHP treats Developer Experience as a design constraint, not a layer of polish added after a feature works. The framework exists to make creating content-focused websites feel simple without taking away the power developers expect from Laravel. Its guiding promise is that users should be able to begin with Markdown and sensible defaults, while retaining the freedom to use Blade, customize the frontend, replace conventions, or extend the build process when their project demands it.

The default path should therefore be the shortest path. A common task should work without configuration, manual registration, or knowledge of internal architecture. HydePHP favors convention over configuration, automatic discovery, appropriate default layouts, generated navigation, scaffolding commands, and ready-to-use frontend assets. Configuration and extension points are still important, but they should remain optional until the user has a reason to reach for them. A new feature is aligned with HydePHP when its basic use feels obvious and its advanced use remains possible.

HydePHP also aims to reuse mental models its users already know. APIs should follow Laravel conventions where practical, and features should compose naturally with familiar tools such as collections, facades, Blade components, console commands, configuration files, service providers, and lifecycle callbacks. Naming should describe what an operation does rather than expose how Hyde implements it. Before inventing a new abstraction, an agent should look for the closest existing HydePHP or Laravel pattern and extend that vocabulary consistently.

Good Developer Experience includes the failure path. HydePHP should validate assumptions early, produce actionable error messages, and avoid letting mistakes silently reach the generated site. Recent work on the asset and data systems reflects this approach through automatic validation, clearer exception handling, syntax checking, and helpers that remove repetitive filesystem work. Commands should explain what they are doing, generated files should be predictable, and errors should tell the developer what needs to change.

Performance and feedback speed matter as well. Improvements such as realtime compilation, Vite integration, hot module replacement, intelligent caching, and faster document processing are Developer Experience features because they shorten the distance between an edit and a trustworthy result. Agents should avoid unnecessary work in normal builds, preserve deterministic output, and prefer lazy or cached computation where it reduces repeated cost without making behavior harder to understand.

Finally, a feature is not complete when its implementation compiles. HydePHP requires focused changes, tests that demonstrate the intended behavior, and documentation for changes users can observe. Backward compatibility and the appropriate release branch must also be considered. Tests protect the experience from regression, while documentation confirms that the public API can be explained clearly. When an API is difficult to test or document, that is often evidence that it is also difficult to use.

An AI coding agent working on HydePHP should evaluate every feature with a simple standard: does this make the common case joyful, preserve control for advanced users, behave like the rest of the Laravel ecosystem, fail helpfully, and remain understandable through tests and documentation? The most Hyde-like implementation is rarely the one with the most options or abstractions. It is the one that removes the most friction while introducing the least surprise.
Loading
Loading