name: apple-flow-numbers
description: General Apple Numbers automation with a local CLI for .numbers files. Use when creating workbooks, adding sheets, appending rows with insertion control (after-data, after-headers, at-end), styling ranges, and validating data placement.
Apple Numbers Automation (Local CLI)
Use this skill to reliably create and update Apple Numbers documents with:
python3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_preflightpython3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_createpython3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_create_workbookpython3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_add_sheetpython3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_append_rowspython3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_style_apply
Favor deterministic CLI workflows over ad hoc AppleScript. Use direct AppleScript only for read-back verification and debugging.
Current Capability Snapshot
- Supports wide tables:
numbers_createauto-expands columns to fit all headers.numbers_create_workbookbuilds multi-sheet files from one JSON spec.numbers_add_sheetadds initialized sheets to existing workbooks.numbers_append_rowsauto-expands columns to fit the widest incoming row.
- Supports insertion modes:
after-data,after-headers,at-end
- Supports styling operations:
- colors (
background_color,text_color) - font (
font_name,font_size) - alignment (
left|center|right|justified|natural) - number format (
automatic|currency|percentage|scientific|fraction|text) - wrapping (
text_wrap) - dimensions (
row_height,column_width)
- colors (
Quick Start
- Run preflight and confirm
"ok": true:
python3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_preflight
- Create a Numbers file with headers:
python3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_create \
"/abs/path/tracker.numbers" \
'["Date","Item","Category","Amount","Notes"]' \
--sheet "Sheet 1" \
--table "Table 1" \
--overwrite true
- Append rows (recommended default
after-data):
python3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_append_rows \
"/abs/path/tracker.numbers" \
'[["2026-03-04","Coffee","Food",15,"Morning"],["2026-03-04","Burger","Food",30,"Lunch"]]' \
--sheet "Sheet 1" \
--table "Table 1" \
--position after-data
- Verify insertion response:
- Expect JSON with
"ok": true - Check
start_rowandinsert_after_row
- Apply formatting/style:
python3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_style_apply \
"/abs/path/tracker.numbers" \
'{"scope":"range","start_row":2,"end_row":20,"start_column":1,"end_column":5}' \
'{"background_color":[255,245,230],"font_size":12,"alignment":"center","row_height":28,"column_width":160}'
- Build a full workbook (multiple sheets):
python3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_create_workbook \
"/abs/path/workbook.numbers" \
'{"sheets":[{"sheet_name":"Transactions","table_name":"Tx","headers":["Date","Item","Amount"],"rows":[["2026-03-04","Coffee",15]]},{"sheet_name":"Summary","table_name":"Summary","headers":["Metric","Value"],"rows":[["Total",15]]}]}' \
--overwrite true
- Add one more sheet to an existing workbook:
python3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_add_sheet \
"/abs/path/workbook.numbers" \
'{"sheet_name":"Dashboard","table_name":"DashboardTable","headers":["Metric","Value"],"rows":[["Count",1]]}'
Input Rules
- Always use an absolute path.
- File extension must be
.numbers. numbers_createheaders must be a JSON array of strings.numbers_append_rowspayload must be a JSON array.numbers_create_workbookrequires{"sheets":[...]}with uniquesheet_namevalues.numbers_add_sheetrequires a sheet JSON object withsheet_nameand non-emptyheaders.- Safest append shape: array-of-arrays (for example:
[[...],[...]]). numbers_style_applytarget/style args must be JSON objects.- Style target indices are 1-based.
Position Strategy
after-data:- Best for logs and trackers.
- Inserts right after the last non-empty data row.
- Fills the top data region instead of jumping to visual bottom rows.
after-headers:- Inserts at first data row.
- Shifts existing data down.
at-end:- Always appends to the physical end of the table.
- Use when you explicitly want bottom append behavior.
Wide-Column Imports
If a CSV has more than the default table width, import directly with full headers and rows. The tool will auto-add required columns before writing data.
Standard Workflow
- Define columns first.
- Create or reuse target file.
- Build rows as JSON.
- Append with
--position after-dataunless user asks otherwise. - Verify first and last inserted rows.
Read-Back Verification
Use this AppleScript probe after appending:
APP_TARGET_EXPR="${NUMBERS_APP_TARGET:-application \"Numbers Creator Studio\"}"
osascript <<APPLESCRIPT
set p to POSIX file "/abs/path/tracker.numbers"
tell ${APP_TARGET_EXPR}
set d to open p
set t to first table of first sheet of d
tell t
set firstRow to (value of cell 1 of row 2 as text) & "|" & (value of cell 2 of row 2 as text)
set lastRow to (value of cell 1 of last row as text) & "|" & (value of cell 2 of last row as text)
end tell
close d saving no
return firstRow & "\n" & lastRow
end tell
APPLESCRIPT
Troubleshooting
absolute path required:- Convert to absolute path before local
numbers_tools.pycall.
- Convert to absolute path before local
target document does not exist:- Create with
numbers_createfirst or confirm path typo.
- Create with
Can't get sheetorCan't get table:- Provide exact
--sheetand--tablenames.
- Provide exact
Connection invalid/ AppleScript runtime failures:- Run preflight first:
python3 skill/apple-flow-numbers/scripts/numbers_tools.py numbers_preflight
numbers_tools.pytarget resolution order is:NUMBERS_APP_TARGET(direct AppleScript target override)NUMBERS_APP_BUNDLE_ID(converted toapplication id "...")- Numbers Creator Studio app path/name/bundle-id candidates
- Legacy Apple Numbers fallbacks:
com.apple.Numbers,com.apple.iWork.Numbers,"Numbers"
- If needed, set one explicit target:
export NUMBERS_APP_TARGET='application "Numbers Creator Studio"'export NUMBERS_APP_BUNDLE_ID='your.bundle.id'
- Retry command outside restrictive sandbox context when needed.
- Run preflight first:
- Rows appear too far down:
- Use
--position after-dataand verify table has expected headers/data.
- Use
Done Criteria
- Tool command returns
"ok": true. - Inserted row range is sensible (
start_row,insert_after_row). - Read-back confirms expected top and tail data placement.