JPEG full range (0-255) was tagged as pc/full in H.264 output, but most
players (VLC, etc.) expect limited range (16-235). Convert JPEG→limited
with scale filter and tag as tv. Also switch preset ultrafast→fast for
5-6x smaller files on static screen content.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the function panel is open over a form, highlight() was finding
buttons from the hidden form instead of visible commands on the panel.
Move command search (cmd_XXX_txt) to step 1 — before form-scoped
search — so visible panel commands always take priority. Form elements
searched at step 2 only if no command matched.
Highlight search order is now:
0. Open submenu/popup (elementFromPoint overlay)
1. Commands on function panel (visible cmd_ elements)
2. Form elements (buttons, fields, grid rows)
3. Sections (sidebar navigation)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The button/link search in findClickTargetScript jumped from exact
to includes matching, causing "Поступление" to match "Поступление
билетов" instead of "Поступление (акты, накладные, УПД)" when the
shorter name appeared first in DOM order. Add startsWith step for
both name and label between exact and includes matching.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add submenu/popup as priority 0 in highlight() — checks open
popups before form search, preventing false matches on grid rows
behind the popup overlay
- Use elementFromPoint + direct overlay for submenu items instead
of getElementById (1C duplicates IDs in cloud popups — hidden
copy in form + visible copy in cloud)
- Add startsWith step between exact and includes for section and
command matching — fixes "Поступление" matching "Поступление
билетов" instead of "Поступление (акты, накладные, УПД)"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move unhighlight() before the fill action in fillFields — prevents
our overlay staying visible while platform focus moves to next field
on Tab/Enter. Consistent with clickElement/selectValue pattern:
highlight → wait → unhighlight → action.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reorder highlight() search: form elements first, sections/commands as
fallback. Fixes false match where "ОК" matched section "Покупки" via
substring .includes() ("пок" contains "ок")
- Unhighlight before action in clickElement/selectValue (was only in
finally block, causing overlay to cover modals opened by the click)
- Add auto-highlight support to navigateSection and openCommand
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
JPEG frames from CDP screencast use full range (0-255) but H.264
defaults to limited range (16-235). Add -color_range pc to preserve
full range in output MP4, fixing washed-out/bright appearance.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show caption before action with wait() pause, not after.
Viewer reads what will happen, then sees it happen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Full-screen overlay with gradient background, centered title text,
optional subtitle. Useful for intro/outro frames in video recordings.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Three improvements to browser automation reliability:
1. ё→е normalization: fuzzy matching now treats ё and е as equivalent
across all comparison points in both dom.mjs (norm() functions,
target variables) and browser.mjs (popup, radio, EDD, grid, confirmation
dialog, advanced search, filter badges). Prevents silent failures when
script uses ё but 1C displays е or vice versa.
2. DLB intercept handling in selectValue(): added force click + Escape
fallback when funcPanel overlay blocks the dropdown button click,
matching the pattern already used in clickElement().
3. Error handling: all exported functions now throw Error instead of
returning { error } objects. Error messages include function name,
what was searched, and available alternatives. Scenarios fail fast
at the broken step; interactive callers can use try/catch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CDP screencast sends frames only on screen changes, causing ffmpeg
to compress pauses and produce sped-up video. Now duplicates the
previous frame to fill timing gaps, maintaining real-time speed.
Also add *.mp4 to .gitignore alongside *.png.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use direct gyan.dev URL instead of generic ffmpeg.org. Rewrite recording.md
prerequisites as clear alternatives (project / global / config).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New functions: startRecording, stopRecording, isRecording, showCaption, hideCaption.
Recording guide in recording.md with setup, API, examples, troubleshooting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Single script to copy skills between AI platforms (Cursor, Codex,
Copilot, Gemini CLI, OpenCode) with path rewriting and optional
runtime switching. Includes interactive mode for newcomers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
User-facing examples and use cases at the top (navigation, search,
documents, reports, extensions, debugging), followed by modes explanation,
autonomous scenario example, then API reference tables.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Detailed description of autonomous vs interactive modes with examples
- Full API reference with signatures, return shapes, and code samples
- Complex autonomous scenario: compare stock reports across two warehouses
- Troubleshooting table for common errors
- Keyboard shortcuts reference
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New docs/web-test-guide.md with usage scenarios, API overview, DCS filters
- README: add web-test row to skills table, directory structure, Node.js requirement
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevent models from endlessly retrying the same failed search.
Rules: max 2 attempts per approach, try alternatives not repeats,
report partial results instead of silent retry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fillFields({ 'Склад': 'value' }) now auto-resolves via DCS pair label
and auto-enables the checkbox. getFormState() returns reportSettings
array with readable names instead of raw КомпоновщикНастроек... fields.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reports and DataProcessors need e1cib/app/ prefix (opens app form),
while lists/registers/catalogs use e1cib/list/ (opens list form).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Two fixes:
- Scope iframe scanning to current form container (prevents reading
stale data from other open report tabs)
- Improved header detection: use LAST row before data as detail header,
previous row as group header with fill-forward for merged cells.
Fixes two-level headers like "Начальный остаток / Долг клиента"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Parse SpreadsheetDocument into { title, meta, headers, data, totals }:
- Auto-detect header row (most non-empty before first numeric row)
- Group header prefix for duplicate column names (Сейчас/Доступно)
- Data rows as objects {column: value}, only non-empty cells
- Separate totals row (Итого/Всего)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reads 1C SpreadsheetDocument (report output) rendered in iframes.
Collects cells from div[x]/div[y] elements across all frames,
returns { rows: string[][], total }.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Auto-prepend e1cib/list/ when missing
- Translate English type names to Russian (AccumulationRegister → РегистрНакопления, etc.)
- Accepts: full e1cib/..., short Тип.Имя, or English Type.Имя
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- navigateLink(url): opens form via Shift+F11 dialog with clipboard paste
- Grant clipboard-read/write permissions on browser context creation
- Register navigateLink in ACTION_FNS for auto-error detection
- Document in SKILL.md with examples (e1cib/list/...)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- getFormState: clarify returns table meta (columns + rowCount), not row data
- readTable: document return shape, add hint to use for grid contents
- closeForm: document {save} parameter and auto-confirm behavior
- Update closing forms patterns with save:true/false/omit variants
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
closeForm now accepts { save: true/false } option:
- save: false → clicks "Нет" on "Save changes?" dialog
- save: true → clicks "Да" to save and close
- undefined → returns confirmation as hint (previous behavior)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Action functions now call dismissPendingErrors() at start, so a leftover
error modal from a previous operation doesn't block subsequent actions.
Diagnostic functions (getFormState, screenshot) are unchanged — they
show current state as-is.
Key fixes:
- Target OK button within modal's form container (#formN_container)
to avoid clicking wrong pressDefault on the page
- Use force:true click to bypass #modalSurface pointer intercept
- Replace local dismissErrors() in fillReferenceField with shared fn
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1C platform shows some modal dialogs (e.g. "Не удалось записать") via
ps*win floating windows WITHOUT setting #modalSurface visible. Removed
the modalSurface gate from checkErrorsScript — now scans all small forms
for button patterns regardless of overlay state. The elCount > 100
threshold already filters content forms reliably.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Two problems solved:
1. Server-side exceptions (ВызватьИсключение in ПередЗаписью) produce modal dialogs
AFTER the DOM stabilizes. clickElement now uses waitForSelector with MutationObserver
(doesn't block JS event loop) to detect #modalSurface or .balloon appearance.
2. checkErrorsScript used button IDs to determine form ownership, but 1C modal dialog
buttons often have empty IDs. Now uses closest('[id$="_container"]') ancestry to
group pressButtons by form, correctly separating modal buttons from background form
buttons (e.g. "Зачет оплаты" in ERP order form).
Tested with ТестОшибки CFE extension on ERP — error detected in 7.7s.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Action functions (clickElement, fillFields, selectValue, etc.) are now
wrapped to check for 1C errors (modal dialogs, validation balloons)
after each call. When detected, execution stops immediately with full
diagnostic context:
- error: human-readable 1C error message
- step: which API function triggered the error
- stepArgs: arguments passed to that function
- onecErrors: raw balloon/messages/modal data from DOM
- formState: complete form state at the moment of error
- screenshot: auto-captured error-shot.png
This enables autonomous scripts (run mode) to fail fast with enough
information for the caller (agent or human) to diagnose and decide on
corrective action.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
`node run.mjs run <url> <script>` — connect, execute, disconnect in one
call. No HTTP server, no session management. Process exits when done.
Useful for CI, subagents, and standalone test scenarios where the full
start/exec/stop lifecycle is unnecessary overhead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Selection forms without a search field (e.g. ERP Соглашения) have only
filter fields like ТипСоглашения. The old code fell back to inputs[0],
typing the search text into the filter field and breaking the form.
Now pickFromSelectionForm only uses inputs whose ID matches known search
field patterns (поиск/search/строкапоиска/SearchString/find). When no
search input is found, it skips text entry and matches rows directly in
the grid — which works because the target value is visible among the rows.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
selectValue: try DLB button first, fallback to CB (Choose Button).
ERP uses _CB suffix instead of _DLB for some reference fields
(Соглашение, Склад).
fillTableRow: handle non-INPUT focus between grid cells. ERP's
div-based grid puts DIV.gridBody focus between editable cells on Tab.
Also treat TEXTAREA cells (e.g. Содержание) as editable grid cells.
Added wrap-around detection to exit when Tab loops back to first cell.
Tested: Заказ клиента in ERP — all fields fill correctly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Smart wait polling showed no measurable speedup in benchmarks
(31.8s vs 32.0s baseline). 1C backend response time (~1.5-2s per
autocomplete) is the real bottleneck, not client-side delay calibration.
Reverted all 5 replacements to original fixed delays to reduce complexity.
Kept waitForCondition() utility for potential future use.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add waitForCondition() utility — polls JS expression every 100ms with
timeout fallback. Replace key fixed delays:
- fillReferenceField paste: 2000ms → poll for EDD/cloud (max 2s)
- fillTableRow add: 1000ms → poll for grid INPUT focus (max 2s)
- fillTableRow cell paste: 1500ms → poll for EDD/value (max 1.5s)
- fillTableRow Tab skip/commit: 300-1000ms → poll for focus change
Benchmark: 31.8s vs 32.0s baseline — no measurable speedup because
1C backend response time (~1.5-2s for autocomplete) is the real
bottleneck, not our delay calibration. Code is correct and will
benefit from faster backends.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>