Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
272 commits
Select commit Hold shift + click to select a range
cb24b3d
refactor(project): Rename watch handler events
RandomByte Dec 16, 2025
06265a6
refactor: Fix linting issues
matz3 Dec 17, 2025
af1dea5
test(fs): Adjust getIntegrity tests
matz3 Dec 17, 2025
2b00295
refactor: Integrity handling
matz3 Dec 17, 2025
d37a099
test(fs): Adjust getIntegrity tests again
matz3 Dec 17, 2025
db65bc8
refactor: Consider npm-shrinkwrap.json
matz3 Dec 17, 2025
86ac03d
refactor: Rename Tracker => MonitoredReader
RandomByte Dec 17, 2025
871c323
refactor(project): Use workspace version in stage name
RandomByte Dec 17, 2025
fcef958
refactor(project): Fix stage writer order
RandomByte Dec 17, 2025
35daf57
refactor(fs): Add Switch reader
RandomByte Dec 17, 2025
0bbae4c
refactor(project): Cleanup WatchHandler debounce
RandomByte Dec 17, 2025
7e6207a
refactor(project): Fix outdated API call
RandomByte Dec 17, 2025
10abde8
refactor(project): Fix build signature calculation
RandomByte Dec 17, 2025
d8ed11b
refactor(fs): Pass integrity to cloned resource
RandomByte Dec 17, 2025
16a1307
refactor(project): Fix pattern matching and resource comparison
RandomByte Dec 17, 2025
589a414
refactor(project): Import/overwrite stages from cache after saving
RandomByte Dec 18, 2025
d5fedd6
test(builder): Sort files/folders
matz3 Dec 19, 2025
557b93d
refactor(builder): Prevent duplicate entries on app build from cache
matz3 Dec 19, 2025
6825875
refactor(fs): Refactor MonitorReader API
RandomByte Dec 23, 2025
bb1f93a
refactor(fs): Always calculate integrity on clone
RandomByte Dec 24, 2025
e3fc555
refactor(fs): Add getter to WriterCollection
RandomByte Dec 29, 2025
4a9f88d
refactor(builder): Remove cache handling from tasks
RandomByte Dec 24, 2025
69cbcd4
refactor(builder): Add env variable for disabling workers
RandomByte Dec 30, 2025
2b11afb
refactor(project): Track resource changes using hash trees
RandomByte Dec 23, 2025
586f2db
refactor(project): Compress cache using gzip
RandomByte Jan 2, 2026
cc78b34
refactor(fs): Ensure writer collection uses unique readers
RandomByte Jan 2, 2026
0a22161
refactor(fs): Remove write tracking from MonitoredReaderWriter
RandomByte Jan 2, 2026
4397625
refactor(project): Identify written resources using stage writer
RandomByte Jan 2, 2026
da20690
refactor(project): Add basic differential update functionality
RandomByte Jan 2, 2026
0a5f64b
refactor(builder): Re-add cache handling in tasks
RandomByte Jan 7, 2026
62da565
refactor(project): Cleanup HashTree implementation
RandomByte Jan 7, 2026
0d8c360
refactor(project): Make WatchHandler wait for build to finish before …
RandomByte Jan 7, 2026
a4521d2
refactor(project): Use cleanup hooks in update builds
RandomByte Jan 7, 2026
d5a6542
refactor(logger): Log skipped projects/tasks info in grey color
RandomByte Jan 7, 2026
a2b538c
refactor(project): Fix cache update mechanism
RandomByte Jan 7, 2026
d8010a4
refactor(project): WatchHandler emit error event
RandomByte Jan 7, 2026
b49c3f4
refactor(server): Exit process on rebuild error
RandomByte Jan 7, 2026
ef36ddb
refactor(project): Fix delta indices
RandomByte Jan 7, 2026
f3aa487
refactor(logger): Support differential update task logging
RandomByte Jan 8, 2026
7cecf1b
refactor(project): Provide differential update flag to logger
RandomByte Jan 8, 2026
5721765
refactor(server): Log error stack on build error
RandomByte Jan 8, 2026
40da0a4
refactor(project): Add chokidar
RandomByte Jan 8, 2026
b9cbce3
refactor(project): Limit build signature to project name and config
RandomByte Jan 8, 2026
aa1a17d
refactor(project): Improve ResourceRequestGraph handling
RandomByte Jan 8, 2026
0158aec
refactor(server): Remove obsolete code from serveResources middleware
matz3 Jan 8, 2026
b496fae
refactor(project): Add env variable to skip cache update
RandomByte Jan 9, 2026
a8a7b8a
refactor(project): Fix hash tree updates
RandomByte Jan 9, 2026
6611d9a
refactor(project): Remove unused 'cacheDir' param
matz3 Jan 9, 2026
8cd318e
fix(project): Prevent projects from being always invalidated
matz3 Jan 9, 2026
e4671d2
fix(project): Prevent exception when not building in watch mode
matz3 Jan 12, 2026
a90aa2f
refactor(project): Only store new or modified cache entries
RandomByte Jan 9, 2026
dd1300a
refactor(project): Refactor project cache validation
RandomByte Jan 11, 2026
1e21a99
refactor(project): Extract project build into own method
matz3 Jan 13, 2026
4b2438a
fix(project): Clear cleanup task queue
matz3 Jan 13, 2026
b75953d
test(project): Add ProjectBuilder integration test
matz3 Jan 13, 2026
ba88f19
test(project): Add failing ProjectBuilder test case
matz3 Jan 13, 2026
22334cb
test(project): Enhance ProjectBuilder test assertions
matz3 Jan 13, 2026
bc64da0
test(project): Add library test case for ProjectBuilder
matz3 Jan 13, 2026
99753af
test(project): Build dependencies in application test of ProjectBuilder
matz3 Jan 13, 2026
17fa719
test(project): Refactor ProjectBuilder test code
matz3 Jan 14, 2026
e84ae46
refactor(project): Refactor task resource request tracking
RandomByte Jan 14, 2026
95bb2e8
test(project): Add theme-library test and update assertions for fixed…
matz3 Jan 14, 2026
4f0f748
test(project): Use graph.build for ProjectBuilder test
matz3 Jan 15, 2026
e87ede6
test(project): Add custom task to ProjectBuilder test
matz3 Jan 15, 2026
da1b82e
fix(project): Fix custom task execution
matz3 Jan 15, 2026
84a42d4
fix(project): Prevent writing cache when project build was skipped
matz3 Jan 16, 2026
bca9c45
refactor(project): Create dedicated SharedHashTree class
RandomByte Jan 15, 2026
e739d85
refactor(project): Re-implement differential task build
RandomByte Jan 15, 2026
b7f3f99
refactor(project): Fix HashTree tests
RandomByte Jan 16, 2026
59843e4
refactor(project): Fix handling cache handling of removed resources
RandomByte Jan 16, 2026
48f883f
test(project): Add cases for theme.library.e with seperate less files
maxreichmann Jan 20, 2026
3150fb2
refactor(project): Update graph traversal
RandomByte Jan 20, 2026
33ba705
refactor(project): Add BuildServer and BuildReader
RandomByte Jan 16, 2026
9ba2753
refactor(project): Refactor project result cache
RandomByte Jan 20, 2026
a239157
refactor(server): Integrate BuildServer
RandomByte Jan 20, 2026
9a5662b
refactor(project): Small build task cache restructuring, cleanup
RandomByte Jan 20, 2026
b9fad46
refactor(project): JSDoc cleanup
RandomByte Jan 20, 2026
d29beab
refactor(project): ProjectBuilder cleanup
RandomByte Jan 20, 2026
64c5fed
refactor(builder): Small stringReplacer cleanup
RandomByte Jan 20, 2026
3344eef
revert(fs): Add Switch reader
RandomByte Jan 20, 2026
33fbae0
refactor(project): Add perf logging, cleanups
RandomByte Jan 20, 2026
445656a
refactor(project): Add cache write perf logging
RandomByte Jan 20, 2026
3e48e97
refactor(project): Improve stage change handling
RandomByte Jan 21, 2026
0ffdd90
refactor(project): Implement queue system in BuildServer
matz3 Jan 21, 2026
a8eb3e4
refactor(server): Add error callback and handle in CLI
RandomByte Jan 21, 2026
09db83d
refactor(project): ProjectBuilder to provide callback on project built
RandomByte Jan 21, 2026
436151b
refactor(project): Do not always include root project in build
RandomByte Jan 21, 2026
35d6788
refactor(project): Refactor BuildServer init, add tests
RandomByte Jan 21, 2026
7c954ee
refactor(project): Minor ProjectBuildCache and ProjectBuildContext re…
RandomByte Jan 23, 2026
574a917
refactor(project): Handle abort signal in ProjectBuilder et al
RandomByte Jan 23, 2026
9b611ee
refactor(project): Refactor BuildServer queue
RandomByte Jan 23, 2026
9766d2b
refactor(project): Fix cache invalidation tracking
RandomByte Jan 23, 2026
fb01c69
refactor(project): Fix stage restore
RandomByte Jan 26, 2026
e2b9e53
refactor(project): Add cache support for custom tasks
RandomByte Jan 26, 2026
9769c76
test(project): Add file deletion case for theme.library.e
maxreichmann Jan 26, 2026
7fc40bb
fix(builder): Filter out non-JS resources in minify task
matz3 Jan 26, 2026
425c79c
test(project): Add test case for minify task fix
matz3 Jan 26, 2026
8b65488
test(project): Add ResourceRequestManager tests
RandomByte Jan 26, 2026
9733b30
refactor(project): Fix derived trees unexpected upsert in parents
RandomByte Jan 26, 2026
8aaf30b
test(project): Adjust test cases for .library changes
matz3 Jan 26, 2026
e2416e6
fix: Ensure dot-file matching with micromatch
matz3 Jan 26, 2026
bc8f5ed
test(project): Add test case for ui5.yaml changes
matz3 Jan 26, 2026
e7a4b8f
fix(project): Handle BuildServer race condition when changing files
matz3 Jan 26, 2026
2868a40
test(project): Remove test.serial.only
matz3 Jan 26, 2026
7d433cd
deps: Fix depcheck issues
matz3 Jan 26, 2026
e858a41
test(project): Update ProjectBuildCache and TaskBuildCache tests
RandomByte Jan 26, 2026
f5beb16
test(project): Update ProjectBuilder tests and JSDoc
RandomByte Jan 26, 2026
c6c5b80
test(project): Update TaskRunner tests
RandomByte Jan 26, 2026
b39d4fc
test(project): Update various tests
RandomByte Jan 26, 2026
bd6f826
test(project): Add missing comma
matz3 Jan 27, 2026
493651c
refactor(project): Improve abort signal handling
RandomByte Jan 27, 2026
5e173f2
refactor(project): Fix additional tests
RandomByte Jan 27, 2026
e261c5f
refactor(project): Move dependency indice init into PBC
RandomByte Jan 27, 2026
bfb57fc
fix(project): Improve BuildServer stability on resource changes
matz3 Jan 27, 2026
80930f9
test(project): Add case for BuildServer which requests application an…
maxreichmann Jan 27, 2026
ee1aa28
test(project): Add cases
maxreichmann Jan 28, 2026
5d5cb2d
test(project): Add cases for project type "module" (ProjectBuilder)
maxreichmann Jan 29, 2026
7a9d1c9
refactor(project): ProjectBuildCache state handling
RandomByte Jan 28, 2026
ad5e35c
test(project): Update node_modules deps to be aligned with actual fix…
maxreichmann Feb 4, 2026
b6c80da
test(project): Add "library" dependencies to "module" fixture
maxreichmann Feb 5, 2026
46e2731
test(project): Update ProjectBuildContext tests
matz3 Feb 9, 2026
384edc2
Revert "test(project): Update node_modules deps to be aligned with ac…
maxreichmann Feb 10, 2026
fd57bd3
refactor(project): Rename task param 'supportsDifferentialUpdates' =>…
RandomByte Feb 10, 2026
ba13474
test(project): Extend FixtureTester (ProjectBuilder) for non-task pro…
maxreichmann Feb 10, 2026
9e3aee0
test(project): Add cases for ui5.yaml path mapping (Modules)
maxreichmann Feb 10, 2026
5730669
test(project): Add race condition test
RandomByte Feb 10, 2026
149c3b1
test(project): Add modify file case for modules
maxreichmann Feb 11, 2026
7f299a9
test(project): Add case for multiple custom tasks (tag handling)
maxreichmann Feb 16, 2026
7f23e09
fix(project): Fix build manifest access
matz3 Feb 18, 2026
a930066
test(project): Fix multiple-task tests (Address review)
maxreichmann Feb 18, 2026
83a2b2c
test(project): Re-Add eslint rule (removed by accident)
maxreichmann Feb 18, 2026
7326cb2
refactor(fs): Add MonitoredResourceTagCollection
RandomByte Feb 23, 2026
47ceda7
refactor(project): Add basic handling for resource tags
RandomByte Feb 23, 2026
45ed1d9
test(project): Add another multiple-task / tag handling case
maxreichmann Feb 25, 2026
cef7b6c
test(project): Add case for dependency content changes
maxreichmann Feb 26, 2026
868779a
test(project): Clean-up temporary comments
maxreichmann Feb 27, 2026
b622eaa
test(project): Add case for JSDoc builds (Standard Tasks)
maxreichmann Mar 5, 2026
6efcd3b
test(project): Address review of @RandomByte
maxreichmann Mar 5, 2026
ba484f7
refactor(project): Enhance build cache logging for signatures
RandomByte Mar 5, 2026
f29a488
test(project): Add basic library build test for BuildServer
RandomByte Mar 5, 2026
e270bf7
test(project): Add cases for custom preload configs (for application,…
maxreichmann Mar 5, 2026
ecc27cb
refactor(project): Adapt tests after refactoring of resource tag hand…
RandomByte Mar 6, 2026
f8c96c7
refactor(fs): Fix resource integrity for resources without content
RandomByte Mar 6, 2026
96f48f3
test(logger): Fix tests
RandomByte Mar 6, 2026
2e7a026
test(project): Add case for self-contained builds (Standard Tasks)
maxreichmann Mar 6, 2026
9344ef7
refactor(project): Fix incorrect stage signature when using delta sta…
RandomByte Mar 9, 2026
d891958
test(project): Add cases for custom bundling builds
maxreichmann Mar 9, 2026
bd2917a
test(project): Add cases for file deletion (TC4)
d3xter666 Mar 10, 2026
8a3daf0
test(project): Refactor "custom tasks 2" case
maxreichmann Mar 10, 2026
be209df
test(project): Add tests for various dependency relations
maxreichmann Mar 10, 2026
8e66262
test(project): Add cases for race condition (add/remove file)
d3xter666 Mar 16, 2026
888818f
refactor(project): Cleanup cache state handling
RandomByte Mar 11, 2026
1f8f02e
feat(project): Incorporate resource tags into hash tree leaf node hashes
RandomByte Mar 10, 2026
a8e80db
refactor(fs): Add ResourceTagCollection#getAllTagsForResource method
RandomByte Mar 11, 2026
b30e39a
refactor(project): Add test for cross-project resource tag handling
RandomByte Mar 12, 2026
653db47
refactor(fs): Expose getTags method on resource
RandomByte Mar 12, 2026
35d0193
refactor(project): Fix tag handling, align test
RandomByte Mar 13, 2026
6d33de6
refactor(project): Improve build abort handling, ease race-condition …
RandomByte Mar 16, 2026
03b1be2
refactor(project): Cleanup comment
RandomByte Mar 16, 2026
b2783d4
test(project): Add case for --include-dependency (Cover build with on…
maxreichmann Mar 16, 2026
8c3b6bf
test(project): Check if sap-ui-version.json contains correct content
d3xter666 Mar 18, 2026
0c9633f
test(project): Add case for removing a dependency
maxreichmann Mar 19, 2026
65d0123
refactor(project): Validate source files after build finishes
RandomByte Mar 19, 2026
da37c8c
refactor(project): Store source files in CAS
RandomByte Mar 19, 2026
6297f67
refactor(project): Use stored source files in ProjectResources
RandomByte Mar 19, 2026
5219071
test(project): Add tests for cross project source file modifications
RandomByte Mar 19, 2026
a528fb1
perf(project): Parallelize I/O in HashTree.upsertResources and TreeRe…
RandomByte Apr 16, 2026
627ee8e
perf(project): Parallelize I/O in ResourceRequestManager
RandomByte Apr 17, 2026
faa8ec3
perf(project): Skip redundant metadata checks for shared tree nodes
RandomByte Apr 17, 2026
79a81ab
perf(project): Prefetch stage cache lookups for next task
RandomByte Apr 17, 2026
84ff8c9
perf(project): Add performance instrumentation to build cache
RandomByte Apr 17, 2026
716c67b
perf(project): Add orchestration-level timing instrumentation
RandomByte Apr 17, 2026
4f4f6ec
perf(project): Parallelize source index initialization across projects
RandomByte Apr 17, 2026
2130b2a
perf(project): Defer cacache I/O in cached stage proxy readers
RandomByte Apr 17, 2026
146d824
perf(project): Skip redundant dependency index updates for tasks with…
RandomByte Apr 17, 2026
8cdee30
docs: Add skills
RandomByte Apr 16, 2026
5a8254d
perf(project): Skip redundant CAS lookups for unchanged resources dur…
RandomByte Apr 20, 2026
b8be120
perf(project): Suppress redundant change propagation on initial stage…
RandomByte Apr 20, 2026
61a863b
perf(project): Skip dependency index refresh when no changes were pro…
RandomByte Apr 20, 2026
0b574ed
perf(project): Add instrumentation for allTasksCompleted, recordTaskR…
RandomByte Apr 22, 2026
c3fc17a
perf(project): Pre-populate known CAS integrities from cached source …
RandomByte Apr 22, 2026
15e1293
perf(project): Reuse previous frozen source metadata for unchanged files
RandomByte Apr 22, 2026
e917d9f
refactor(server): Skip bundling by default
RandomByte Apr 22, 2026
883c3f7
test(project): Add tests for dependency index refresh skip optimization
RandomByte Apr 22, 2026
f94fce4
docs(fs): Add skill for @ui5/fs package
RandomByte Apr 23, 2026
f6704a1
perf(project): Replace cacache with custom CAS for faster dist writes
RandomByte Apr 23, 2026
ace983b
docs(project): Update incremental build skill
RandomByte Apr 23, 2026
1f23ab1
perf(fs): Add CAS-aware fast path in FileSystem._write()
RandomByte Apr 23, 2026
d51f350
test(project): Add tests for delta cacheInfo path in recordTaskResult
RandomByte Apr 24, 2026
4a1113d
perf(project): Replace file-based metadata cache with SQLite storage
RandomByte Apr 27, 2026
c4ecba4
perf(project): Replace file-based CAS with SQLite BLOB storage
RandomByte Apr 27, 2026
1f3512f
perf(project): Add batch transaction support to MetadataStorage
RandomByte Apr 27, 2026
cbbe910
refactor(project): Merge CAS and metadata into unified BuildCacheStorage
RandomByte Apr 28, 2026
dd7c628
perf(project): Compress metadata blobs in BuildCacheStorage
RandomByte Apr 28, 2026
52e02ad
perf(project): Add batch signature existence check for cache lookups
RandomByte Apr 28, 2026
536dad6
perf(project): Tune SQLite PRAGMA settings for build cache
RandomByte Apr 28, 2026
8ff5819
perf(project): Use shallow hash recomputation for ancestor directory …
RandomByte Apr 28, 2026
48d9554
test(project): Add shallow recomputation safety tests and remove dead…
RandomByte Apr 29, 2026
b02de50
refactor: Fix eslint problem
RandomByte Apr 29, 2026
b76f749
perf(project): Optimize writeStageResources compression and add batch…
RandomByte Apr 29, 2026
0bcb02e
perf(project): Move compression outside transaction and parallelize v…
RandomByte Apr 29, 2026
1c33a27
perf(fs): Use buffer factory for integrity computation to avoid doubl…
RandomByte Apr 29, 2026
f9f13b8
perf(project): Skip compression for tiny resources in build cache
RandomByte Apr 29, 2026
8c4121c
refactor(fs): Fix missing import
RandomByte Apr 29, 2026
274c417
test(cli): Fix build and serve tests for incremental build changes
RandomByte Apr 30, 2026
0a61694
test(server): Fix tests for incremental build server changes
Apr 30, 2026
5512653
refactor(server): Destroy build server on close to prevent process hang
RandomByte May 4, 2026
d7cb4e4
test(builder): Isolate build cache data directory in tests
RandomByte May 5, 2026
06debde
refactor(project): Set busy_timeout before WAL mode to prevent lock e…
RandomByte May 5, 2026
76b95b4
test(builder): Expect undefined for unchanged resources in processors
RandomByte May 5, 2026
4d56205
test(project): Use correct event stubs in build server assertions
RandomByte May 5, 2026
5028c87
refactor(project): Apply style transforms to frozen source reader
RandomByte May 8, 2026
4b02bed
refactor(fs): Replace deprecated getStatInfo() calls with isDirectory()
RandomByte May 8, 2026
8c567f4
refactor(project): Correct stage reader priority for ThemeLibrary and…
RandomByte May 8, 2026
3a1ce99
refactor(project): Recognize build manifest version 1.0 and apply cac…
RandomByte May 9, 2026
b2362dc
test(logger): Cover isDifferentialBuild branch in Console writer
RandomByte May 11, 2026
67a25fb
test(fs): Improve code coverage to meet thresholds
RandomByte May 11, 2026
7ef1afc
test(project): Improve code coverage to meet configured thresholds
RandomByte May 11, 2026
3f22c22
refactor(project): Add reference counting to CacheManager singleton
RandomByte May 11, 2026
0ce06c3
refactor(project): Handle source changes during build as retriable in…
RandomByte May 11, 2026
94a7c21
refactor(cli): Resolve esmock race condition in serve tests on Node 22
RandomByte May 11, 2026
50b51da
refactor(project): Resolve EBUSY errors on Windows from leaked SQLite…
RandomByte May 11, 2026
a3e718d
test(server): Improve code coverage to meet configured thresholds
RandomByte May 12, 2026
8eaaa9b
refactor(project): Normalize path separators in getVirtualPath on Win…
RandomByte May 12, 2026
2eca9e4
refactor(project): Prevent state corruption when source changes arriv…
RandomByte May 12, 2026
1dca90c
refactor(builder): Fix Windows test timeouts caused by leaked handles…
RandomByte May 12, 2026
20e6642
refactor(fs): Handle legacy streams lacking Symbol.asyncIterator in R…
RandomByte May 13, 2026
000f20c
test(project): Update skip reason for dependency content changes test
RandomByte May 13, 2026
a7cb9f5
refactor(project): Remove unused ssri dependency
RandomByte May 13, 2026
37b56c6
refactor(project): Resolve JSDoc type expression parse errors in jsdo…
RandomByte May 13, 2026
1e5ba40
refactor: Support of referencing legacy middlewares in UI5 CLI middle…
d3xter666 May 18, 2026
98a1e5f
refactor(project): Verify size to detect mtime-preserved content changes
RandomByte May 19, 2026
4696d87
refactor(project): Detect file replacement via inode in cache check
RandomByte May 19, 2026
ef82eac
refactor(project): Rename matchResourceMetadataStrict to isResourceUn…
RandomByte May 19, 2026
7043174
refactor(project): Cleanup build cache utils
RandomByte May 19, 2026
95a90df
refactor(fs): Stop fabricating inode 0 for in-memory resources
RandomByte May 19, 2026
ba3aef7
refactor(project): Add ui5DataDir build option for cache isolation
RandomByte May 20, 2026
7754784
docs: Reflect documentation review comments (#1393)
d3xter666 May 22, 2026
f64a0bd
feat: Offer --cache option to control cache mode (Incremental Build) …
maxreichmann May 26, 2026
a67c83d
refactor(project): Improve cacheMode: Off handling
RandomByte May 27, 2026
46e116a
test(project): Fix renamed SnapshotCache enum test
RandomByte May 27, 2026
0ce8882
refactor(cli): Add cache-mode deprecation to tree command
RandomByte May 27, 2026
404acbe
refactor(cli): Remove obsolete cacheDir param, fix tests
RandomByte May 27, 2026
a3ceda2
refactor(cli): Update cache parameter description for server
RandomByte May 27, 2026
1354aff
refactor(cli): Allow for lower-case cache parameter values
RandomByte May 27, 2026
731c5fa
refactor(project): Do not create a CacheManager if cache mode is Off
RandomByte May 27, 2026
203847e
test(server): Use different port for main server test
RandomByte May 27, 2026
17b6274
test(cli): Cover --cache and --output-style coerce in unit tests
RandomByte May 27, 2026
082031b
refactor(project): Await file-watcher readiness in BuildServer
RandomByte May 28, 2026
66296d5
refactor(project): Always close CacheManager in BuildServer destroy
RandomByte May 28, 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
38 changes: 38 additions & 0 deletions .claude/skills/incremental-build/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
name: incremental-build
description: >
Work on the incremental (delta) build system in @ui5/project: build caching,
resource indexing, hash trees, stage caching, build server, file watching,
task execution caching, and delta builds.
when_to_use: >
TRIGGER when: the user asks about or wants to modify code related to incremental builds,
build caching, resource indexing, hash trees, stage caching, build server, file watching,
task execution caching, delta builds, resource tags in build context, or any component
listed in the Component Map in architecture.md.
DO NOT TRIGGER when: the user is working on unrelated CLI commands, general tooling,
or non-build features.
user-invocable: true
---

# Incremental Build Skill

You are working on the incremental (delta) build system in `@ui5/project`. Read `architecture.md` in this skill directory for the full architecture reference, including the component map, key flows, caching architecture, and data structures. Read `performance-investigation.md` for guidance on profiling builds, reading perf logs, and known performance peculiarities.

## Guidelines for Working on This Code

1. **Always read the source file before modifying it.** The Component Map in `architecture.md` tells you where each piece lives.
2. **Understand the cache flow direction.** Changes propagate: source change -> index update -> signature change -> cache miss -> task re-execution.
3. **Be careful with tag side effects.** `getTags()` is not a pure read -- it triggers lazy tag application. Avoid calling it in unexpected contexts.
4. **Respect abort signals.** Any long-running operation should check `signal?.throwIfAborted()` periodically.
5. **Test with incremental rebuilds.** A single build passing is not enough; the interesting bugs appear on the second and third builds after file changes.
6. **Watch for stale stage readers after abort.** If a build is aborted, stage writers may contain partial results that shadow source files.
7. **Signature stability matters.** Any change to how hashes are computed (e.g., adding new fields to hash input) invalidates all existing caches.
8. **SharedHashTree operations must go through TreeRegistry.** Never mutate a SharedHashTree directly; always schedule via the registry and flush.

## Known Constraints

- `StageCache` (in-memory) has no `clear()` method -- stage entries persist for the lifetime of the `ProjectBuildCache` instance
- `ProjectBuildContext` instances (including their caches) are reused across sequential builds of the same project within a session
- `resource.getTags()` has side effects: it triggers `#applyCachedResourceTags()` and creates `MonitoredResourceTagCollection` instances, which modify tag collection state. This means calling `getTags()` during hash tree operations (e.g., in `TreeRegistry.flush()`) can affect the stage pipeline state.
- `updateProjectIndices` uses `project.getReader()` (stage pipeline reader) to read resources. After an aborted build, stage writers may contain in-memory resources that shadow updated source content, causing stale reads.
- `getSourcePaths()` and `getVirtualPath()` are NOT consistent with `getSourceReader()` for all project types. Module has no `getVirtualPath()` (base class throws). ThemeLibrary's `getSourcePaths()` returns only `[src/]` and `getVirtualPath()` only maps `src/`, but `_getReader()` also includes `test/` when `_testPathExists`. Any optimization that replaces `sourceReader.byGlob()` with direct filesystem enumeration via `getSourcePaths()` + `getVirtualPath()` must handle these mismatches.
370 changes: 370 additions & 0 deletions .claude/skills/incremental-build/architecture.md

Large diffs are not rendered by default.

378 changes: 378 additions & 0 deletions .claude/skills/incremental-build/performance-investigation.md

Large diffs are not rendered by default.

67 changes: 67 additions & 0 deletions .claude/skills/ui5-fs/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
---
name: ui5-fs
description: >
Work on the @ui5/fs package: the virtual file system abstraction layer providing
Resource, Adapters (FileSystem, Memory), Reader Collections (ReaderCollection,
ReaderCollectionPrioritized, DuplexCollection, WriterCollection), specialized readers
(Filter, Link, Proxy), resource tagging, monitoring, and the resourceFactory API.
when_to_use: >
TRIGGER when: the user asks about or wants to modify code related to @ui5/fs,
the virtual file system, resources, adapters, reader collections, writer collections,
DuplexCollection, resourceFactory, ResourceTagCollection, MonitoredReader, fsInterface,
ResourceFacade, or any file within packages/fs/.
DO NOT TRIGGER when: the user is working on builder tasks/processors, CLI commands,
server middleware, or project graph resolution that does not touch the FS layer.
user-invocable: true
---

# @ui5/fs Skill

You are working on the `@ui5/fs` package — the virtual file system abstraction layer for UI5 CLI. Read `architecture.md` in this skill directory for the full architecture reference, including the class hierarchy, API surface, adapter internals, and collection patterns.

## Package Location

Source: `packages/fs/lib/`
Tests: `packages/fs/test/lib/`
Fixtures: `packages/fs/test/fixtures/`

## Guidelines for Working on This Code

1. **Always read the source file before modifying it.** The Component Map in `architecture.md` tells you where each piece lives.
2. **Understand the content type state machine.** Resources have internal content types (BUFFER, STREAM, FACTORY, DRAINED_STREAM, IN_TRANSFORMATION) with strict transitions. Never bypass `modifyStream()` for content transformations — it handles mutex locking and state management.
3. **Respect the mutex.** Resource content access is protected by `async-mutex`. Concurrent `getBuffer()` / `getString()` calls are safe, but `modifyStream()` acquires an exclusive lock. Never hold a reference to content across an `await` that could trigger a transformation.
4. **Virtual paths are POSIX-absolute.** All virtual paths must be absolute POSIX paths (start with `/`). Base paths must end with `/`. Adapters normalize patterns relative to their `virBasePath`.
5. **Content parameters are mutually exclusive.** When creating a Resource, only one of `buffer`, `string`, `stream`, `createStream`, or `createBuffer` can be provided. The `createBuffer`/`createStream` factories enable lazy loading.
6. **byGlob randomizes result order.** `AbstractReader.byGlob()` intentionally shuffles results to prevent consumers from relying on ordering. Do not assume or depend on glob result order.
7. **Clone semantics matter.** Resources are cloned on retrieval from adapters. `resource.clone()` creates an independent copy including content. When modifying resources from collections, understand whether you're working on the original or a clone.
8. **ResourceFacade is immutable.** `ResourceFacade.setPath()` throws. The facade wraps a resource with a different virtual path (used by Link reader). Use `getOriginalPath()` to get the underlying path.
9. **Tag format is strict.** Tags follow the pattern `"namespace:Name"` — namespace is lowercase alphanumeric, name is PascalCase. Tags are validated on set. Use `ResourceTagCollection` or `MonitoredResourceTagCollection` for tag operations.
10. **Test with both FileSystem and Memory adapters.** Behavior can differ between adapters (e.g., FileSystem uses `globby` while Memory uses `micromatch`; FileSystem has lazy content loading via factories, Memory clones on read).

## Known Constraints

- `Resource.getStream()` is deprecated — use `getStreamAsync()` or `getBuffer()` / `getString()` instead. The deprecation warning is only logged once per process.
- `Resource.getStatInfo()` is deprecated — use `getLastModified()`, `getSize()`, `getInode()` instead.
- FileSystem adapter's `write()` uses `fs.copyFile` for unmodified resources (optimization). It also detects same-source-same-target writes and skips them, but switches to buffer-based writes if the content was modified (to avoid stream read-during-write conflicts).
- Memory adapter auto-creates virtual directory entries in its hierarchy on `write()`.
- `WriterCollection` matches the **longest prefix** (greedy match) when routing writes to writers.
- `DuplexCollection` uses an internal `ReaderCollectionPrioritized` with the writer first, so written resources shadow the reader's resources.
- `fsInterface` provides a Node.js `fs`-compatible wrapper but only implements `readFile`, `stat`, and `readdir`. `mkdir` is a no-op.
- `Resource.getIntegrity()` computes SHA-256 via `ssri` — this triggers full content loading if not already loaded.
- Monitored readers/writers (`MonitoredReader`, `MonitoredReaderWriter`) prevent reads/writes after being sealed. They track all access patterns for build caching analysis.

## Running Tests

```bash
# All tests
npm run unit --workspace=@ui5/fs

# Single file
cd packages/fs && npx ava test/lib/Resource.js

# Verbose with logging
npm run unit-verbose --workspace=@ui5/fs

# Coverage
npm run coverage --workspace=@ui5/fs
```
Loading
Loading