* fix: parse Python datetime.datetime and datetime.date type annotations correctly
The Python parser only matched ExprKind::Name for type annotations, so
`datetime.datetime` (an Attribute expression) silently fell through to
Typ::Unknown and no datetime picker was shown in the UI.
- Extend parse_expr to resolve `datetime.*` attribute access (alongside
the existing `wmill.*` handling)
- Add Typ::Date variant for `datetime.date` → JSON schema format "date"
- Update python worker to import and convert `date.fromisoformat()`
- Update argSigToJsonSchemaType, AI types, schema validation, and SQL
datatype wasm for the new Date variant
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* all
* all
* all
* all
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* use skills
* add prompts
* update system prompts
* generate skills on init
* add prompts in cli
* better for raw apps
* nit
* test pipeline draft
* better
* yaml for triggers and schedules
* cleaning
* better
* add descriptions to ai agent fileds
* adjust
* better openapi
* better
* nit
* feat: add typed provider and memory schemas for ai agent in openapi
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: improve zod validation errors with dynamic schema extraction
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* regen
* fix
* cleaning
* refactor: deduplicate skill descriptions in generate_skills_ts_export
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* cleaning
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
* feat: cache lockfile results for scripts with same raw_workspace_dependencies
Extract fetchScriptLock from updateScriptLock to isolate the remote API
call behind a module-level in-memory cache. When multiple scripts share
the same content, language, and raw_workspace_dependencies, only one
remote call is made and subsequent lookups return the cached lock.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: only use lock cache when raw_workspace_dependencies are present
Skip caching entirely when rawWorkspaceDependencies is empty so the
cache is only active for scripts that actually use workspace deps.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: cache key uses only language+deps, not script content
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: use annotation parser for lock cache key instead of full script content
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test: add mixed annotated/non-annotated scripts cache test
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
The elementsToMap function was incorrectly skipping remote base files that
were configured as branch-specific, causing pull to mark them for deletion.
Root cause: PR #7643 added a check to skip base files when configured as
branch-specific, but this was applied to both local AND remote sources.
Remote workspace files only have base paths (e.g., TestVar.variable.yaml),
not branch-specific paths (e.g., TestVar.staging.variable.yaml).
Fix: Add isRemote parameter to elementsToMap to distinguish remote vs local
processing. Only skip base files for local sources where we expect the
branch-specific version to exist.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* dual build for utils-internal
* bump version
* feat(cli): add aiagent module support to inline script extraction/replacement
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* add missing field in openapi
* bump yaml validator version
* cleaning
* cleaning
* cleaning
* nit
* cleaning
* cleaning
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix: prevent sql migration modal from closing when next migration arrives
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* nit
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cli): revert findCodebase relative_path check that broke ../shared codebases
The previous change added a check to ensure script paths start with the
codebase's relative_path. However, this broke cases where relative_path
uses parent directory references (e.g., "../shared") because:
1. path.join normalizes paths, so "/project/../shared/f/script.ts" becomes
"/shared/f/script.ts"
2. FSFSElement strips the cwd prefix, resulting in "f/script.ts"
3. The check "f/script.ts".startsWith("../shared/") failed
The original behavior was correct - relative_path indicates where to find
codebase files, while includes/excludes patterns match against the normalized
paths that get passed during sync.
Fixes regression reported in #7729 comments.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(cli): add preview test for codebase with imports
Tests that codebase bundling correctly includes imported modules,
which is the key functionality needed for ../shared codebases.
The test creates a helper module and a main script that imports
from it, then verifies the bundled script executes correctly.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Enable running the dev command from any directory by specifying the
target .raw_app folder as an argument. Workspace resolution and
authentication still happen from the original cwd to find wmill.yaml.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Fix standalone bundle path lookup in worker to not add redundant file
extension (the path already contains .tar/.esm suffixes from the API)
- Fix CLI preview tar bundle handling to preserve binary data correctly
(was using btoa(blob.text()) which corrupted binary tar data)
- Add integration tests for script/flow preview commands covering:
- Regular scripts (non-codebase)
- Codebase scripts (CJS and ESM formats)
- Codebase scripts with assets (tar bundles)
- Flow preview
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add `wmill script preview <path> [--data <json>]` command to test scripts against remote workspace without deploying
- Add `wmill flow preview <path> [--data <json>]` command to test flows against remote workspace without deploying
- Support codebase scripts with automatic bundling via esbuild
- Add `--silent` flag to suppress logs and only output final result
- Fix `findCodebase` to properly check if path is within codebase relative_path before pattern matching
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Previously, getCurrentGitBranch() was called inside loops for every
file processed during sync pull/push operations. For workspaces with
1900+ files, this spawned thousands of git subprocesses, causing a ~2x
performance regression.
This fix caches the git branch at the start of:
- elementsToMap() for pull operations
- push() for push operations
Expected improvement: ~3.2s -> ~1.6s for large workspaces.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The dnt polyfill's import-meta-ponyfill doesn't resolve symlinks when
comparing process.argv[1] with import.meta.url. When npm creates a
symlink for the `wmill` bin (e.g., /usr/bin/wmill -> .../main.js),
the paths don't match and isMain() incorrectly returns false, causing
the CLI to silently exit without running.
This fix resolves symlinks using fs.realpathSync() before comparison,
ensuring the CLI works correctly when invoked via npm-installed symlinks.
Tested with Node.js 20 and 25.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
These commands were using folder suffix checks without first loading the
nonDottedPaths setting from wmill.yaml, causing them to fail when run
inside folders with non-dotted names (e.g., myapp__raw_app instead of
myapp.raw_app).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>