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>
* feat: add Pydantic BaseModel and dataclass support for Python type inference
- Add AST-based detection of Pydantic BaseModel inheritance patterns
- Add AST-based detection of @dataclass decorator (all variants)
- Implement recursive field schema extraction with type inference
- Add thread-safe stack-based module storage for nested parsing
- Add RAII cleanup guard to ensure memory safety on all code paths
- Add security limits: 200 fields max, 10 recursion levels max
- Add comprehensive test coverage: 3 new tests for Pydantic/dataclass
- Maintain 100% backward compatibility with existing type system
This enables ML/AI practitioners to use Pydantic models as function
parameters with automatic UI generation from model schemas.
Implementation highlights:
- Zero code execution: Pure AST analysis for safety
- Thread-safe: Stack-based storage prevents race conditions
- Memory-safe: RAII pattern guarantees cleanup
- Security-hardened: Field count and recursion depth limits
- Performance-optimized: Depth-limited recursion, lazy parsing
Test results: All 12 tests passing (9 existing + 3 new)
Closes#4700🤖 Generated with Claude Code (https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix: improve Pydantic/dataclass parser robustness and error handling
This commit addresses critical bugs and improves error handling in the
Python parser for Pydantic BaseModel and dataclass support.
## Critical Fixes
1. **Thread-local storage RAII pattern**: Fixed bug where parse failures
could leave the module stack in an inconsistent state. Now uses proper
functional composition with .ok().map() to ensure cleanup always happens.
2. **Recursion depth warnings**: Added explicit warning messages when the
recursion depth limit (10 levels) is reached during type extraction.
Made the limit a named constant for clarity.
3. **Unsupported type warnings**: Added informative warning messages for
unsupported type annotations (Union types and forward references) to
help users understand why their types aren't being inferred.
## Improvements
- Added 10 comprehensive test cases covering:
- Empty Pydantic models
- List[T] and Optional[T] types
- Dataclass with decorator arguments
- Dict types
- Regular classes (non-model types)
- Invalid syntax handling
- Datetime fields
- Multiple model definitions
- Nested models
- All 21 tests pass successfully
## Testing
Verified that:
- Parser handles malformed code gracefully
- RAII cleanup works correctly with early returns
- Warning messages are clear and actionable
- No memory leaks or panics
Closes#4700
* refactor: Separate Pydantic/dataclass code into dedicated module. Created src/pydantic_parser.rs with thread-local storage, model detection, and type extraction logic. Moved 12 Pydantic tests to tests/pydantic_tests.rs and removed duplicate code from lib.rs. All 21 tests passing.
* opti and publish
---------
Co-authored-by: Devdatta Talele <devtalele0@gmail.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix(schema): preserve user-defined JSON schema for Python list[dict]
Fixes issue where JSON schema properties manually defined in the UI are
lost when saving Python scripts with list[dict] or untyped array parameters.
Changes:
- Preserve all items fields (properties, required, additionalProperties, etc.)
- Preserve items.type instead of hardcoding "object"
- Preserve type for untyped parameters using nullish coalescing
- Add type safety check for items preservation
The Python parser cannot infer object properties from list[dict] annotations.
This fix preserves user-defined schema fields when parser cannot infer structure.
Fixes#7209
* fix(schema): preserve all fields for untyped lists, not just properties
Address bot feedback for consistency. The untyped list branch now preserves
all user-defined fields (required, additionalProperties, enum, etc.) just
like the record[] branch, instead of only preserving properties.
This ensures users who define required fields or enum values for untyped
list parameters don't lose that data on save.
Related to #7209
* nits and publish
---------
Co-authored-by: Devdatta Talele <devtalele0@gmail.com>