* feat(cli): add GitHub Actions CI and raw app sync tests
- Add CLI tests GitHub Action that runs on Linux and Windows
- Add build check job that runs on CLI and openapi.yaml changes
- Uses Rust cargo backend instead of Docker for better CI compatibility
- Add cargo_backend.ts and test_backend.ts for test infrastructure
- Fix Windows path separator bug in raw_apps.ts (use "/" for relative paths)
- Fix PostgreSQL URL parsing in cargo_backend.ts
- Update tests to use gitBranches format instead of deprecated overrides
- Add raw_app_sync.test.ts for raw app sync workflow testing (ignored for now - needs EE)
- Skip tests that require EE features (git sync settings, raw apps)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): Fix Windows path compatibility issues in tests
- Use fromFileUrl() in cargo_backend.ts for proper Windows path handling
- Normalize path separators to forward slashes in resource_folders.ts
- Fix readDirRecursive to return normalized paths in test helper
- Use forward slashes consistently in buildMetadataPath and detection functions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): Use SEP in test assertions instead of modifying logic
- Revert resource_folders.ts to use SEP as intended
- Update test assertions to use SEP for platform-specific paths
- Keep readDirRecursive normalization for consistent test comparisons
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): Use SEP for all path separators in test assertions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): Use resolve() for proper cross-platform path handling in cargo_backend
String concatenation with path separators creates malformed paths on Windows.
Use path.resolve() instead for proper cross-platform path resolution.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(backend): Add cfg attributes for Windows compatibility
- Add #[cfg(unix)] to anyhow::anyhow import (only used in unix cfg block)
- Add #[cfg(not(windows))] to parse_file function (uses cat, only for cgroups)
- Remove unused std::io import, use std::io::Result directly
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: Windows compilation + convert integration tests to withTestBackend
- Fix unused import SYSTEM_ROOT in csharp_executor.rs on Windows by
requiring both windows and csharp feature
- Fix unused variable id in handle_child.rs on Windows by adding
#[allow(unused_variables)] since id is only used in cfg(unix) code
- Convert all RUN_INTEGRATION_TESTS dependent tests in sync_pull_push.test.ts
to use withTestBackend pattern for automatic backend setup
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: configurable test features with CI_MINIMAL_FEATURES env var
- Default: full features (zip, private, enterprise) for local development
- CI mode: minimal features (zip only) when CI_MINIMAL_FEATURES=true
- Add shouldSkipOnCI() helper for tests requiring EE features
- Update EE-dependent tests to use shouldSkipOnCI()
- Add test instructions to cli/README.md
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: enable raw app tests (not EE-dependent)
Raw apps work with minimal features. 2 tests pass, 2 have test logic
bugs to investigate separately:
- "delete file and push" - file deletion not syncing correctly
- "dry-run push shows expected changes" - JSON output parsing issue
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: gate cgroups module to Linux only
cgroups are Linux-specific, the module was causing dead_code warnings
on Windows compilation.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(ci): add CI_MINIMAL_FEATURES env var to CLI tests workflow
Set CI_MINIMAL_FEATURES=true in both Linux and Windows test jobs so
the backend compiles with minimal features (zip only) and EE-dependent
tests self-skip via shouldSkipOnCI().
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): raw app tests and backend startup timing
- Add 5s delay after backend ready for migrations to complete
- Fix dry-run JSON output parsing (handle pretty-printed JSON)
- Temporarily ignore "delete file" test (needs isSuperset fix)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): raw app file deletion sync
- Add deepEqual check for files in raw_apps.ts isSuperset comparison
- Handle raw_app file deletions in sync.ts by re-pushing the entire app
- Fix test to remove CSS import before deleting the file
When deleting a file from a raw app, the sync now properly updates
the backend with the new file list (excluding the deleted file).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): Windows path separators in tests
Normalize paths for cross-platform comparison by converting
backslashes to forward slashes before path assertions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): normalize featurePaths in multi_instance_workspace test
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(cli): add mixed case paths sync tests for Windows compatibility
Add comprehensive tests for sync pull/push with capitalized folder paths
to catch Windows case-insensitivity issues:
- Scripts in f/MyFolder/MyScript
- Flows in f/MyFlows/DataProcessor
- Apps in f/MyApps/Dashboard
- Variables in f/MyVars/ApiKey
- Deeply nested paths with mixed case
- Multiple resources in same capitalized folder
- CamelCase folder names with numbers
Each test verifies the full pull -> modify -> push -> verify cycle.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(cli): add idempotency check to mixed case paths tests
After each push, pull again with --dry-run --json-output and verify
that no changes are detected. This ensures the sync is stable and
catches issues where pull/push cycles cause spurious diffs.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat: add workspace setting to disable error handler for u/ scripts/flows
Add a new workspace setting `error_handler_muted_on_user_path` that allows
disabling the error handler for jobs related to scripts/flows that start
with the "u/" prefix (user scripts/flows).
Changes:
- Add migration to add `error_handler_muted_on_user_path` column to workspace_settings
- Update WorkspaceSettings struct and get_settings query
- Update EditErrorHandler struct and edit_error_handler API endpoint
- Update error handler cache to include the new setting
- Add skip logic in send_error_to_workspace_handler for u/ paths
- Add toggle in workspace settings UI
The implementation uses the existing cached settings to avoid additional
database queries, making it efficient.
Closes#7633
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* all
* update ee private
* combine migrations
* sqlx
* fix: migration fixes for auto_invite JSONB column
- Fix TEXT[] to JSONB conversion using to_jsonb()
- Add GIN index on auto_invite for efficient ? operator queries
- Add index cleanup to down migration
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* sqlx
* all
* all
* all
---------
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Paths in wmill-lock.yaml are now normalized to use forward slashes,
ensuring the lockfile is portable between Windows and Linux. This also
applies to paths used in hash computation for flows and apps.
- Add normalizeLockPath() helper function
- Update v2LockPath() to normalize path and subpath
- Normalize paths in generateFlowHash() and generateAppHash()
- Add comprehensive tests for path normalization
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
When a type (folders, settings, variables, resources, triggers) is NOT
configured in specificItems, branch-specific files of that type should
be ignored and only base files used.
Added isItemTypeConfigured() function to distinguish between:
- Type not configured → skip branch-specific file, use base file
- Type configured but doesn't match pattern → skip branch-specific file
- Type configured and matches → use branch-specific file
Added comprehensive tests to prevent regression.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Extends the getTypeStrFromPath function to recognize branch-specific
variants of settings.yaml and encryption_key.yaml (e.g., settings.main.yaml,
encryption_key.dev.yaml). Previously, only base filenames were recognized,
causing branch-specific files to throw "Could not infer type of path" errors.
This follows the same fix pattern applied to folder.meta files.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The function only matched `folder.meta` but not branch-specific variants
like `folder.main.meta` or `folder.dev.meta`. This caused branch-specific
folder files to be skipped during sync operations with --branch flag.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds `wmill workspace list` command that fetches and displays all
workspaces the user has access to on the remote server.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(cli): add folders as branch-specific items
Folders can now be configured as branch-specific items in wmill.yaml:
```yaml
gitBranches:
staging:
specificItems:
folders:
- "f/env_*"
- "f/config"
```
Branch-specific folder format: f/folder/folder.branchName.meta.yaml
(consistent with other item types where branch goes before the type suffix)
Example:
- Base: f/env_staging/folder.meta.yaml
- Branch-specific: f/env_staging/folder.main.meta.yaml
Changes:
- Add `folders?: string[]` to SpecificItemsConfig
- Add folder handling in toBranchSpecificPath()
- Add folder handling in fromBranchSpecificPath()
- Add folder pattern matching in isSpecificItem()
- Add folder detection in isBranchSpecificFile()
- Add folder detection in isCurrentBranchFile()
- Add 13 new tests for folder functionality
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(cli): add settings as branch-specific item and skip validation with --branch
- Add settings.yaml as a branch-specific item (settings: true in config)
- settings.yaml -> settings.branchName.yaml conversion
- Skip "Create empty branch configuration" prompt when using --branch flag
- User explicitly specifies branch, so skip validation prompts
- Add folders and settings fields to gitBranches type definitions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Avoids unnecessary data copying by using `as any` cast instead of
.slice() to work around TypeScript's ArrayBufferLike vs ArrayBuffer
type incompatibility between Deno and Node.js.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use .slice() on Uint8Array values before passing to File/Blob constructors
to create fresh ArrayBuffer-backed arrays, avoiding type errors from
ArrayBufferLike vs ArrayBuffer differences in TypeScript definitions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): prevent duplicate 'Using non-dotted paths' log message
Add a flag to track whether the message has already been logged,
so it only prints once even if setNonDottedPaths is called multiple times.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(cli): add --branch option to sync pull/push commands
Add a --branch argument that allows overriding the current git branch
for sync operations. This enables:
- Using branch-specific settings even when not in a git repository
- Overriding the detected git branch when needed
The branch override is applied to:
- getEffectiveSettings() for branch-specific config overrides
- getSpecificItemsForCurrentBranch() for branch-specific items
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): correct log message for workspace fork branches
Use rawGitBranch instead of currentBranch in the log message when
showing the origin of a workspace fork branch.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(cli): extend --branch support to specificItems functionality
Update getBranchSpecificPath and isCurrentBranchFile to accept optional
branchOverride parameter. This ensures that branch-specific file handling
(for variables, resources, triggers) works correctly with --branch flag.
Updated functions:
- getBranchSpecificPath(): now accepts branchOverride
- isCurrentBranchFile(): now accepts branchOverride
- elementsToMap(): now accepts branchOverride
- compareDynFSElement(): now accepts branchOverride
- prettyChanges(): now accepts branchOverride
All call sites updated to pass opts.branch through the call chain.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): resolve TypeScript type errors
- Fix Timeout type in dev.ts using ReturnType<typeof setTimeout>
- Add proper type casts for unknown error types
- Cast FlowModule to any to resolve generated type mismatch
- Cast Uint8Array to BlobPart for Blob constructor compatibility
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(cli): add unit tests for branch detection and --branch override
- Add specific_items.test.ts with 35 tests covering:
- toBranchSpecificPath and fromBranchSpecificPath conversions
- isSpecificItem pattern matching
- isBranchSpecificFile detection
- Round-trip path conversions
- branchOverride parameter functionality
- Add conf_branch_override.test.ts with 6 tests covering:
- getEffectiveSettings with branchOverride parameter
- Branch-specific overrides application
- promotionOverrides precedence
- Fallback to top-level settings
- Fix containerized_backend.ts to use dynamic paths instead of
hardcoded user home directories
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore(cli): add conf.ts barrel file for test imports
Re-exports from src/core/conf.ts to support existing test imports.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* all
* fix(cli): pass --branch override to workspace resolution
Previously, the --branch flag was only used for config resolution but
not for workspace resolution. This caused confusing log messages that
showed the git branch (e.g., master) before showing the override branch.
Changes:
- Add branchOverride parameter to tryResolveBranchWorkspace()
- Add branchOverride parameter to resolveWorkspace()
- Pass opts.branch from sync pull/push to resolveWorkspace()
- Log "Using branch override" early in workspace resolution
- Remove duplicate log from getEffectiveSettings()
Now when using --branch foobar, the logs show:
Using branch override: foobar
Applied settings for Git branch: foobar
...
Instead of the confusing previous output that mentioned both master
and foobar.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor(cli): remove redundant branch detection in elementsToMap
isCurrentBranchFile() already validates that a branch exists (via
branchOverride or git detection) before returning true. No need to
pre-compute currentBranch before calling it.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>