Claude Code Skill
Install the HARi skill in Claude Code and manage your entire CRM through conversation. Create contacts, build pipelines, send emails, configure automations — Claude knows the full API.
Download
Section titled “Download”Size: 55 KB · Released: 2 June 2026
What’s in the skill
Section titled “What’s in the skill”9 reference files covering every part of the HARi API. Claude loads only what’s needed per conversation.
| File | Covers |
|---|---|
SKILL.md | Main entry point — auth, routing, safety gates, core rules |
records.md | CRUD operations, filtering, search, restore, purge, audit log |
schema.md | Entities, fields (25 types), relations, solutions |
workflows.md | Automation, pipelines, views, process templates, scoring |
communications.md | Email, inbox, mailboxes, templates, snippets, embed forms |
dashboards.md | Charts, goals, activity feed, data hygiene, notifications |
ai.md | AI enrichment, AI search, chat, next actions, recap |
admin.md | Users, API keys, webhooks, integrations, GDPR, billing |
advisory.md | Guided setup, gap analysis, UI navigation, user-level detection |
Installation
Section titled “Installation”Step 1 — Download
Section titled “Step 1 — Download”Click the download button above, or use the terminal:
curl -L https://haricrm.com/downloads/hari-claude-skill.zip -o hari-skill.zipStep 2 — Extract to your project
Section titled “Step 2 — Extract to your project”Unzip into the .claude/skills/hari/ folder at the root of your project. Claude Code discovers skills in this directory automatically.
# Navigate to your project rootcd ~/my-project
# Create the skills directory and extractmkdir -p .claude/skills/hariunzip hari-skill.zip -d .claude/skills/hari/Your project should look like this:
my-project/ ├── .claude/ │ └── skills/ │ └── hari/ ← skill lives here │ ├── SKILL.md │ ├── records.md │ ├── schema.md │ ├── advisory.md │ └── ... (9 files total) ├── src/ └── ...Step 3 — Use it
Section titled “Step 3 — Use it”Open Claude Code in your project and type /hari to invoke the skill directly, or just ask Claude anything about your CRM data — it will activate automatically.
$ claude
> List my top 10 contacts by deal value
Reading .claude/skills/hari/SKILL.md...Reading .claude/skills/hari/records.md...
Here are your top 10 contacts:1. Sarah Chen — HK$450,000 (3 opportunities)2. James Wong — HK$380,000 (2 opportunities)3. ...What you can ask Claude
Section titled “What you can ask Claude”| Category | Example prompts |
|---|---|
| Manage records | ”Create a contact for Alice at Acme Corp”, “Show me all open deals above HK$100k” |
| Build your data model | ”I need to track projects with tasks”, “Add a money field for budget” |
| Set up automations | ”When a deal reaches Proposal stage, notify the manager” |
| Email & templates | ”Send a follow-up to all contacts I met last week”, “Create a PDF quote template” |
| Dashboards | ”Show me pipeline value by stage”, “How many new contacts this month?” |
| AI enrichment | ”Enrich this company with AI”, “Fill in missing data for all new contacts” |
Prerequisites
Section titled “Prerequisites”- Claude Code — Available as CLI, desktop app, or IDE extension. Get Claude Code
- A HARi CRM account — The skill needs your credentials or API key. Start free trial
Changelog
Section titled “Changelog”v1.26.0 — 2 June 2026
Section titled “v1.26.0 — 2 June 2026”- New formula functions:
SWITCH,TRIM,DISPLAY—schema.mddocuments three functions Claude can now use when building computed (type: formula) fields.SWITCH(input, case1, val1, …, [default])is a multi-arm conditional that replaces deeply-nested ternaries;TRIM(s)is a null-safe whitespace strip (handy aroundCONCAT-ed names);DISPLAY(relation)resolves a belongs_to relation to its target’s display name without hard-coding a field. The skill’s function catalog table gains rows (with exact semantics) anddatediffis now documented as a signed day count. - “Why your formula registration may be rejected” contract — a new section explains that the platform validates every formula expression before saving and returns a structured HTTP 422 on failure (
{ error, kind, offending, allowed, suggestion, position, message }). It documents how to react to each field — pick a real function fromallowed, apply the edit-distancesuggestion, locate the problem atposition— and a table of thekindvalues that actually fire (unknown_function,unknown_variable,unloaded_relation,parse_error,expression_too_long,runtime_type_error). This stops AI tools from blindly retrying with another hallucinated function name. - “Relations in formulas” section — clarifies the belongs_to vs has_many split: read a single related record with
company.name/company["name"]/DISPLAY(company), aggregate a collection withsum(pluck(...))/count(...)/where(...), and always declare the relation inoptions.formula_contextor hit theunloaded_relationdiagnosis. - Doc + capability-surfacing only; no API or contract change (the functions and the 422 contract already shipped server-side).
v1.25.3 — 26 May 2026
Section titled “v1.25.3 — 26 May 2026”- PDF workflow recipe in
communications.md— the existing Templates & Documents section documented the API surface (endpoints,page_settings,header/footer,attachment()Twig function,save_to_field, type integer mapping) but did not show the assistant how to actually author a usable PDF template from a user request. The new section walks through the full flow in 7 steps: pick the righttype(decision table mapping user phrases to the integer), create withentityfor record-context resolution, author body with dompdf-safe HTML/CSS (no flex/grid, table-based layout, font + image sizing rules, page-break control), embed images correctly with the three field shapes (branding.logo_data_uripre-resolved, bare UUID viaattachment(), signed URL via raw<img src>— both work becausePdfImageEmbeddercatches the path substring), add Header/Footer in the dedicated top-level fields with<span class="page-number">/<span class="page-count">counters that only resolve inside header/footer, configurepage_settingswith four named presets (invoice / contract / photo report / compact label), test with/renderbefore downloading, and ship via direct stream orsave_to_field. Closes with a 12-row pitfalls table mapping symptom → root cause → fix (broken images, layout collapse, header/footer not repeating, page-counter empty, page-break mid-row, CJK fonts,save_to_field422/403, etc.). Doc clarification only; no API or capability change.
v1.25.2 — 26 May 2026
Section titled “v1.25.2 — 26 May 2026”- Count questions are answered directly, never refused —
records.mdgains an “Answering count questions” section that tells the assistant exactly how to handle “How many contacts do I have?”, “How many open deals?”, and similar. Every list response (GET /api/records/{entity}) already returns atotalfield counting all matching records across all pages, so the assistant callsGET /api/records/{entity}?size=1(tiny payload, just the count), readstotal, and reports it — optionally with the same filters used for a scoped question. The section explicitly forbids the old failure mode where the assistant replied “I don’t have access to your live data” to a trivial count, which was wrong because the count is available on every list call. Doc clarification only; no API surface, capability, or contract change.
v1.25.1 — 18 May 2026
Section titled “v1.25.1 — 18 May 2026”- Email-troubleshooting preflight rule —
communications.mdnow opens the Email Settings section with an explicit PREFLIGHT block: any time a user reports “an email/alert/notification did not send,” the first call isGET /api/email/settings. Ifconfigured: true, the transport is working and the skill MUST NOT propose “Connect Plunk”, “Configure SMTP”, “switch provider”, or “set up email.” Instead it pivots to the actual failure modes: the workflow action shape, the recipient (empty placeholder, unsubscribed, blocked), the template id, the workflow run log, and the email send log.workflows.mdadds a parallel 6-step diagnostic order under thesend_emailaction. Closes the gap where the assistant defaulted to transport-configuration suggestions on tenants that already had SMTP / Plunk working — wasted user attention and undermined trust (“the AI did not even check”). Behaviour change only; no API surface or contract change.
v1.25.0 — 18 May 2026
Section titled “v1.25.0 — 18 May 2026”- PDF templates ship with first-class page setup —
communications.mdnow documents the three new optional fields on_templatefortype=2(PDF) templates:header(Twig fragment),footer(Twig fragment), andpage_settings(JSONB withpaper,orientation,margin_top/right/bottom/left). Paper is allow-listed againstA3 | A4 | A5 | letter | legal | tabloid | executive; orientation againstportrait | landscape; margins are regex-validated (<number><cm|mm|in|px|pt>). The header/footer are placed in fixed-position blocks that repeat on every page, with two pre-styled counter helpers —<span class="page-number"></span>and<span class="page-count"></span>— using dompdf’scounter(page)/counter(pages). Defaults (A4 portrait, top/bottom = 2cm or 3cm/2.5cm when header/footer are set, left/right = 1.5cm) apply when keys are omitted. Legacy templates whose body already contains a<!DOCTYPE html>wrapper and have no header/footer/custom settings pass through unchanged. attachment(uuid)Twig function — the right way to embed record images in templates —communications.mddocuments the new server-side Twig function available in body, subject, header, and footer renders. It validates the UUID, verifies the attachment lives under the calling tenant’suploads/{slug}/prefix (tenant ownership guard), fetches bytes from storage, and returns adata:image/...;base64,...URI ready for<img src="…">. Per-request cache prevents duplicate S3 fetches. Template authors should never hard-code/api/attachments/{uuid}URLs — the internal API path is an implementation detail andattachment()shields templates from contract changes. A short note inrecords.md’s attachments section now points at the function. Legacy templates that still use the URL form keep working — the samePdfImageEmbedderthat already ran in/pdfnow also runs in/render, so the editor’s iframe preview matches the PDF byte-for-byte for image content.save_to_fieldparameter onPOST /api/templates/{id}/pdf— passsave_to_field: "<field_name>"alongsideentity+record_idto upload the rendered PDF to tenant storage, track it in_attachment, and link the new attachment UUID into the named field of the source record (single attach forfile, append forfile_list). The new attachment UUID comes back in theX-Attachment-Idresponse header. The server enforces: field exists (400if not), field type isfileorfile_listonly (400forimage/image_list/ text / anything else — PDFs are documents, not images), and the caller has UPDATE permission on the entity (403if not). Use this for one-shot “Generate signed contract and attach to the deal” flows.- Template
typeinteger mapping documented —0 = generic,1 = email,2 = pdf,3 = notification(SMALLINT column). The previous skill prose saidtype: "email|pdf|docx"which never matched the wire format. Same edit corrects the body field name: API write payloads usebody(plain string), notbody_html— that’s the snapshot column name on the internal_template_versionhistory table and was never an API surface.
v1.24.0 — 17 May 2026
Section titled “v1.24.0 — 17 May 2026”- WhatsApp send-from-CRM documented —
communications.mdgains a new section covering the personal-WhatsApp pairing flow (POST /api/whatsapp/pair/start→ poll/pair/qr+/pair/status), 1-on-1 text send (POST /api/whatsapp/send), the inbox-side reply path (POST /api/inbox/{messageId}/replywithchannel: "whatsapp"), the chat-list + chat-filter endpoints (GET /api/whatsapp/chats,GET /api/whatsapp/chat-filter,PUT /api/whatsapp/chat-filter), and the disconnect flow. Explicitly out of scope and called out as such: group sends, attachments (images, documents, voice notes), workflow triggers on inbound WhatsApp, and quick-reply templates. The skill safety gate covers WhatsApp dispatches the same way it covers email sends — single confirmation per batch, withyes-whatsappsession-level bypass.
v1.23.1 — 13 May 2026
Section titled “v1.23.1 — 13 May 2026”- Formula fields support
concat(...)andCONCAT(...)— variadic string-join helpers registered on the server-sideFormulaEvaluator. Lets users write display formulas in the SQL-familiar form:CONCAT(last_name, " ", first_name)for a Full Name column, orconcat("INV-", invoice_number)for prefixed identifiers. Null values inside the argument list become empty strings, numbers cast to their PHP string form, and both single- and double-quoted string literals work. Previously the only string-concatenation option was Symfony ExpressionLanguage’s~operator (last_name ~ " " ~ first_name), which most users coming from spreadsheets or SQL didn’t discover — formulas would silently evaluate tonulland the column would render blank.schema.mdnow documents both forms side-by-side and listsconcat / CONCATin the helper table.
v1.23.0 — 5 May 2026
Section titled “v1.23.0 — 5 May 2026”- Inline campaign filter source (
type: 'inline_filter') — campaigns can now reference a filter directly on the campaign instead of requiring a saved view round-trip. The skill documents the new shape, the one-hop relation filter syntax (<relation_name>.<column>where<relation_name>comes from_meta_relation.name— NOT the related entity name and NOT the FK column), theemail_fieldsarray for multi-email-field expansion (one candidate per row × email field), and the first-source-wins attribution rule. Cross-source / cross-entity dedup is automatic via the existing_campaign_send_log UNIQUE(campaign_id, lower(email))constraint — same email shared between a contact and a company source ships exactly once.
v1.22.0 — 30 April 2026
Section titled “v1.22.0 — 30 April 2026”- Campaign recipient inspection (
GET /api/email/campaigns/{id}/recipients) —communications.mdnow documents the new paginated send-log endpoint. Returns_campaign_send_logrows with fullpagination {page, limit, total, pages}and astatus_countsblock (sent / pending / sending / failed / cancelled / bounced / opened / clicked / unsubscribed) computed across the whole campaign — not just the visible page — so the campaign UI can render tab badges in a single round-trip. Optional?status=filter narrows the rows on the page only; counts stay stable. AI-readable, so Claude can answer questions like “who actually got the THINKDROP 39 send?” without guessing from the top-levelrecipient_countaggregate. - Campaign reopen (
POST /api/email/campaigns/{id}/reopen) — admin-only revive endpoint for campaigns that ended up in a terminalcancelledorfailedstate. Flips the campaign back todraftAND wipes its_campaign_send_logrows so the recipient list re-resolves on the next send (Layer-1 gates — blocklist, unsubscribe, dedup — fire on fresh data, not stale snapshots from the failed run). Returns 200{reopened, status}, 409 if the campaign is not in a terminal state, 404 if not found. The skill marks it AI-cannot-call — users trigger it from the campaign UI’s “Reopen as draft” button.
v1.21.0 — 29 April 2026
Section titled “v1.21.0 — 29 April 2026”- Campaign abort endpoint documented —
communications.mdnow documents the new admin-onlyPOST /api/email/campaigns/{id}/abortfor stopping a campaign that’s currently insendingstatus. Closes the gap where neitherDELETE(drafts only) norcancel-schedule(scheduled only) could halt an in-flight send. The skill marks the endpoint as AI-cannot-call — admins trigger it from the Campaigns UI (“Abort campaign” button on rows insendingstatus). Returns200 {aborted, status, cancelled_recipients, preserved_sent}on success,409if not insending,404if not found.
v1.20.0 — 29 April 2026
Section titled “v1.20.0 — 29 April 2026”- Tool denial protocol — when the platform’s AI gates (capability allowlist, rate limit, recipient visibility check, loop detector, AI freeze) reject a tool call, the skill now instructs the AI Assistant to surface the structured denial message + remediation directly to the user instead of retrying. Defense-in-depth alongside the C-07 + C-22 + C-23 + C-26 server gates: code remains the primary boundary, but the skill makes friendly cooperation the default. The denial bubble in the in-app AI chat now deep-links to the relevant
/settings/ai-permissions#capability-{name}anchor so admins can fix the underlying permission with one click. - Email send caution — the new “Email send caution” section in
communications.mdcodifies the per-user rate limits (2/hour, 5/day, 10/week) and reinforces the existing rule against loopingcomposeover recipient lists (use the campaign pipeline instead). Documents the structured429 rate_limitedand403 capability_deniedresponses so the AI knows exactly what to say to the user when blocked.
v1.19.0 — 28 April 2026
Section titled “v1.19.0 — 28 April 2026”- Lead entity retired in favour of
contact.lifecycle_stage— DECIDE-05 ruled that the historical split between Lead and Contact creates more friction than value for SMEs. Theleadentity is no longer in fresh-install schemas; existing tenants migrate viabin/migrate-lead-to-contact.php(per-tenant CLI, opt-in during a maintenance window). Prospects now live oncontactwith the newlifecycle_stageselect field — valueslead,qualified,customer,lost. The skill’srecords.mdopens with a v1.19.0 banner explaining the change so Claude doesn’t try to query aleadentity that no longer exists. Common queries that used to filterentity=leadshould now filterentity=contactwith?filter=lifecycle_stage,eq,lead(or?filter=lifecycle_stage,in,lead,qualifiedfor the broader sales-pipeline view). The “Active Leads” view that ships with fresh CRM installs isentity=contactwith that filter pre-applied.
v1.18.0 — 25 April 2026
Section titled “v1.18.0 — 25 April 2026”- Compose vs campaign — decision tree added to the skill —
communications.mdnow opens with a mandatory decision tree distinguishing 1-to-1 transactional sends (POST /api/email/compose) from bulk/marketing sends (campaign pipeline:POST /api/email/campaignsthen/{id}/send). Looping compose over a list is now explicitly called out as forbidden — it bypassed opt-out enforcement, deduplication, and campaign counters, and on one customer tenant this produced 432 untracked sends with the campaign UI showing 0/432. The skill now points Claude at the right endpoint before the send happens. - Campaign pipeline endpoints documented for the first time — previous versions of the skill only mentioned compose. The new section covers draft creation, recipient preview, async send, progress polling, statistics, exclusions, test sends, spam-check, and the associated subscription-list / blocklist / sending-domain admin endpoints.
- Server-side enforcement (landing with this release) — compose now rejects sends to blocklisted or globally-unsubscribed recipients, throttles bulk bursts with
429 compose_burst, and honors theIdempotency-Keyheader (24 h window). The skill documents these so Claude knows how to recover from a throttle without retrying against the brick wall.
v1.17.0 — 22 April 2026
Section titled “v1.17.0 — 22 April 2026”send_emailworkflow action — server-side template rendering — supplying atemplate_idnow renders the saved template body on the server side (fixes a silent empty-body bug wheretemplate_idalone produced emails with no content). Three valid shapes are now documented: inline HTML, template render (with optionalvariables), and template override (body_htmlwins).workflows.mdcorrected — the misleading{ "type": "send_email", "template_id": "<uuid>" }example has been fixed to include the requiredtofield, and a new contract block documents all three valid shapes explicitly.- Silent version-check at session start — the skill now fetches
https://haricrm.com/downloads/hari-claude-skill-version.jsonon its first call of a conversation and informs the user once if a newer version is available. Fully silent on network errors; never blocks API work.
v1.16.0 — 20 April 2026
Section titled “v1.16.0 — 20 April 2026”- Entity sort_order and batch reorder API — new
PUT /api/schema/entities/reorderendpoint accepts an ordered array of entity names and setssort_orderon each. Entities are now displayed in sidebar and schema lists bysort_order ASC, name ASC. Individual entities can also be updated viaPUT /api/schema/entities/{name}withsort_orderfield.
v1.15.0 — 18 April 2026
Section titled “v1.15.0 — 18 April 2026”- Comprehensive solution export/import documentation — the Solutions section in schema.md is now a full operational guide: what gets exported (entities, fields, relations, forms, views, BPFs, workflows, charts, templates, seed data), step-by-step cross-tenant migration workflow (export → ZIP → import), what happens during import (new entities created, existing entity/field metadata updated, dependencies auto-detected), version management (semver, upgrade vs downgrade), and troubleshooting table for common errors. Previously the section only listed endpoint names without explaining the workflow or edge cases.
v1.14.0 — 17 April 2026
Section titled “v1.14.0 — 17 April 2026”- New field type
secret— stores TEXT, renders masked in edit (password input + Eye/EyeOff reveal toggle) and display (fixed 9-dot mask + Show/Copy buttons with 2s confirmation). Not encrypted — presentational mask only. For API keys, tokens, passwords that a user types into a record. - Field display style picker (
options.display_style) — Schema Editor UI now writes a per-field style key that the renderer resolves in orderoptions.widget→options.display_style→ default. Options:select→dropdown/cards/pipeline/radio,multiselect→checkboxes/chip_grid/tags,percent→number/progress_bar,boolean→checkbox/toggle. ShipsCardSelectFieldwired to thecardskey; radio and toggle widgets fall through to defaults until the widget pairs are added. - Visible-when condition builder — Form Editor gets an Eye/EyeOff icon on every tab row and section header. Inline builder: field picker → operator → value. 10 operators:
eq,neq,gt,lt,gte,lte,contains,not_contains,is_null,is_not_null. Numeric operators wrap both operands withNumber()and returnfalsewhen either side isNaN— so rules work correctly even when form values arrive as strings.in/ninremain valid in stored JSONB but aren’t yet exposed in the builder UI. - Formula field editing in the Schema Editor —
type: 'formula'fields now show a dedicated formula textarea plus a format picker (currency/percent/integer/text) next to the existing relation-context picker. Stored asoptions.formula+options.formula_format. No more hand-editing the JSON options blob.
v1.11.0 — 16 April 2026
Section titled “v1.11.0 — 16 April 2026”- Two new built-in sidebar components layered on the v1.10.0 sidebar DSL:
ActivityTimeline— condensed 3–5 item vertical timeline of the record’s most recent activity entries (coloured dot + summary + relative timestamp). Clampedlimit1–10.RelatedRecordsList— inline list of records from a child entity filtered by FK, with count badge and “View all” link when truncated. Props:entity_name,relation,limit,display_field.
v1.10.0 — 16 April 2026
Section titled “v1.10.0 — 16 April 2026”- Record page right sidebar — forms can now declare a
layout.sidebarblock with orderedcells[](bare field name,{type:"field"},{type:"heading"},{type:"spacer"},{type:"component"}). Built-in sidebar componentKeyFactsrenders a compact read-only label/value stack reusing the same display components as the main form (colored pills, currency formatting, relation links). Width is clamped 240–360 px (default 280). Desktop-only; mobile falls back to single column.
v1.9.0 — 16 April 2026
Section titled “v1.9.0 — 16 April 2026”- Relation-aware formula fields — formulas can now reach beyond the current record’s scalars. Declare
options.formula_context: ["transactions"]and reference related records directly:sum(pluck(where(transactions, 'deal_stage', 'eq', 'closed'), 'prix_bien')). Works for bothbelongs_torelations (exposed as an associative array —company.name) and reversehas_many(exposed as a list). Naive plural matching acceptstransaction,transactions,transactiones. Backend batches one query per relation per list/get call — never N+1. - Collection helpers in formulas — new read-only functions in Symfony ExpressionLanguage:
count,sum,min,max,avg,first,last,pluck(arr, field),where(arr, field, op, value)with opseq · neq · gt · gte · lt · lte · in · nin · is_null · is_not_null · contains, plustoday_minus_days(n)for date-range comparisons. Safety caps: max expression length 2000 chars, max related rows 5000 per relation, related records filtered to_state = 0. - Rewritten formulas reference —
docs/reference/field-types.md §4now matches the actual engine (Symfony ExpressionLanguage, bare field-name identifiers, no curly braces), documents collection helpers, relation-context syntax, safety limits, and known gaps (no reactive preview, no dependency-ordering between formulas, no writable computed values, no irregular-plural matching).
v1.8.0 — 16 April 2026
Section titled “v1.8.0 — 16 April 2026”- Section title size — sections now accept a
label_sizeproperty (100/125/150/175/200) that scales the section label as a percentage of the default 12px. Configurable visually in the Form Editor alongside colour / icon / collapse / divider. - Comprehensive Form Layouts reference —
schema.mdrewritten with a full section-presentation reference table, brand-aligned colour palette, complete lucide icon list, field-entry formats (subgrids, components, spacers), full-layout PUT pattern for updates, and per-user personalisation flow. Claude sessions can now drive the Form Editor end-to-end from the skill without external context.
v1.7.0 — 16 April 2026
Section titled “v1.7.0 — 16 April 2026”- Section dividers — sections now accept a
dividerproperty ("none","line","thick") that renders a visible separator above the section on the record page. Thick dividers are tinted with the section’s colour when one is set. Configurable visually from the Form Editor.
v1.6.0 — 16 April 2026
Section titled “v1.6.0 — 16 April 2026”- Form layouts — documented the complete endpoint set (
GET/POST /api/schema/entities/{entity}/forms,PUT /api/schema/forms/{id}, per-user personalization) so Claude can create and update detail/create/quick_view forms directly. - Section presentation metadata — sections now accept optional
color(hex left-border accent),icon(lucide name), andcollapsed(absent = not collapsible; present = click-to-toggle). Documented supported icon set and validation rules. header_image_fieldon entities — documented how to pin an image/file field as the hero thumbnail on the record detail page. Validation: referenced field must exist and be of typeimageorfile.- Entity update endpoint — corrected from
PATCHtoPUT /api/schema/entities/{name}and expanded the body spec.
v1.5.0 — 15 April 2026
Section titled “v1.5.0 — 15 April 2026”- Phone field country code selector — phone fields on embed forms now show a dropdown with 19 country codes (flag + dial code). Default auto-detected from browser locale. Configurable per field via
options.default_country_code. - Embed form field-level validation errors — submissions now return per-field error details instead of a generic message. Frontend shows inline errors with red highlighting.
- Embed form field type docs — documented all field type rendering behaviors (phone, select, email, boolean, textarea) and validation error response format.
- Schema field types cleaned up — removed internal DB column types from skill reference, replaced with API-relevant behavior notes.
- Added
versionfield to SKILL.md frontmatter for tracking.
v1.4.0 — 15 April 2026
Section titled “v1.4.0 — 15 April 2026”- Find-or-Create pattern —
for_eachnow supportselse_actionsfor zero-match branching - New
update_triggeraction — write back to the triggering record from insidefor_each create_recordnow returns the new ID, chainable via{{last_created_id}}- New placeholder namespaces:
{{trigger.field}},{{item.field}}insidefor_each - Complete action types reference with JSON schemas and recipes
- Fixed
for_eachplaceholder resolution (sub-actions now resolve against iterated row)
v1.3.0 — 13 April 2026
Section titled “v1.3.0 — 13 April 2026”- Added 25 field types including money/multi-currency support
- Added UI navigation discovery (API-first, never hardcoded)
- Added currency settings and exchange rate endpoints
- Improved advisory with disambiguation for ambiguous terms
v1.2.0 — 10 April 2026
Section titled “v1.2.0 — 10 April 2026”- Added communication safety gate for outbound actions
- Added solution gate for schema changes
- Added embed forms and OAuth endpoints
v1.0.0 — 1 April 2026
Section titled “v1.0.0 — 1 April 2026”- Initial release with full CRUD, schema, workflows, AI, dashboards