Repository navigation
Deepen the build, index, config and watch modules - #92
Merged
Merged
Conversation
A link to its own parent, or to nothing, added during a watch was indexed as a directory, or never reported, so the watch built a tree a fresh build wouldn't and dropped the unresolved-link warning. applyChanges now reads an added entry's type from the disk and classifies it by the scan's rule, indexes an added directory whole, skips what is gone, and queues behind a scan in progress. DiskWatcher reports a link it won't follow, and its removal, instead of hiding it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The root scan now decides an init folder's members once, applying `exclude` at every level inside it. A file excluded inside an init folder is excluded in `where` (it was reported as placed) and in the build (a file excluded in a subfolder of one reached Rojo). FileLocator reads the members instead of walking the index itself. Placement records the files the template displaced, so FolderMetaApplier and the template-clash rule stop joining routed files with leftOut, and it no longer carries the index. ConfigBuilder builds one config in memory and is what run and locate share; its BuiltProject carries the Placement, so a test places and builds once. OutputWriter owns the staged write. CoreBuildService keeps only its interface: the set checks, run and locate. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… about Every command that reads configs ran initialize, then its own validity gate, then asked for the unselected config files in a second call. Now initialize returns a ConfigSelection: its entries, the config files it didn't pick, requireValid() and brokenError. requireBuildable takes the selection, so build, watch, where and list all start the same way. getBrokenError, listConfigFiles and listUnselectedConfigFiles leave the ConfigService interface, and requireValidEntries becomes the selection's method. The no-routes check stays with the build: the spec makes building a config without routes the error, not the config itself. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…resenter prints it The watch session translated each ConfigBuild into a RebuildReport with its own field names, threw on notWritten, and WatchLog translated it back into BuildLog calls; text build made the same choice its own way and printed a failed config's warnings with no line naming its out file. RebuildReport is now a ConfigBuild with its entry and whether the round checked the sync dir. BuildLog.outcome holds the only switch from outcome to lines, and build and watch both call it, so text build now says "<out file> · not written" for a config it didn't write, as watch does. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ithout patching it The watch command's tests overwrote watchService.watch to subscribe to the session's updates, and most of them exercised the session: what it watches, source changes, linked directories and hot reload. Those groups now live in the session's tests, against the same in-memory watcher and file system. The command's tests keep startup, output, shutdown and flags, and assert only what the command shows or writes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
BuildLog.outcome takes the config entry and the build, which already names its config, instead of the config twice. The index joins paths with joinPosix and names the flag that tolerates a replaced directory. A test comment goes, and router.ts loses a formatting-only change. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…n WatchLog failedBuild moves into the build contract, so CoreBuildService and the watch session's blocked rebuild make a failed ConfigBuild the same way. BuildLog.outcome takes an optional note for the end of the line instead of a repeated flag. WatchLog, which keeps the history of what it printed, says "same errors as before" itself; the output is unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The warnings and sync warnings travel together, and two positional arrays of one type could swap without a compile error. A BuiltProject already has both, so the write-failure path passes it as is. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Six changes from an architecture review, each in its own commit.
Bugs fixed
wherereported a file excluded inside an init folder as placed, and the build let Rojo sync one excluded in a subfolder of an init folder. The root scan now decides an init folder's members once, applyingexcludeat every level. A new e2e case (structure/exclude-inside-init-folder) checks it with real Rojo.DiskWatcherreports a link it won't follow, and its removal.Refactors
Placementrecords the files the template displaced and no longer carries the index.ConfigBuilderbuilds one config and is whatrunandlocateshare; itsBuiltProjectcarries the placement.OutputWriterstages the write.CoreBuildServicekeeps only its interface.ConfigService.initializereturns aConfigSelection(entries, unselected files,requireValid(),brokenError), andrequireBuildabletakes it.getBrokenError,listConfigFilesandlistUnselectedConfigFilesleave the interface.RebuildReportis aConfigBuildwith its entry and whether the round checked the sync dir.BuildLog.outcomeis the one place that turns an outcome into lines, andbuildandwatchboth call it.watchService.watch.Visible changes
buildnow prints<out file> · not writtenbefore its errors, aswatchdoes. Two e2e transcripts change by that one line.Not changed on purpose
rogen liststill shows a routeless config as healthy.Testing
npm test: 2070 passed, including the e2e cases against real Rojo.npm run lintandtsc --noEmitare clean.🤖 Generated with Claude Code