AI-powered coding assistant for the Clarion IDE
Embeds Claude Code directly into your Clarion development workflow
An independent community project — not a SoftVelocity product.
History, stats & contributors
Clarion Assistant is an IDE addin that brings AI-powered code intelligence to Clarion developers. It runs as a docked terminal pane inside the Clarion IDE, giving you a conversational coding assistant that understands your entire codebase.
Ask it to write Clarion code, explain procedures, refactor classes, build COM controls, convert Clarion apps to C#, or navigate your solution — all without leaving the IDE.
- Write and edit Clarion code directly in the IDE editor
- Multi-tab terminal — multiple Claude Code sessions with independent workspaces
- Language Server (LSP) — real-time code intelligence with go-to-definition, find references, hover info, diagnostics, and rename support
- CodeGraph — solution-wide code intelligence via SQL queries over every symbol, relationship, and call chain
- DocGraph — instant search across 14,000+ indexed documentation chunks (Clarion core, CapeSoft, Icetips, and more)
- SchemaGraph — database schema intelligence from Clarion dictionaries, SQL Server, SQLite, and PostgreSQL
- Source Control — GitHub and Bitbucket integration with per-solution repo linking
- Build tools — build solutions, individual apps, or C# COM controls without leaving the chat
- Class intelligence — parse CLASS definitions, sync .inc/.clw, generate method stubs
- Application tree — open .app files, list procedures, navigate the embeditor
- Monaco source editor — the default editor for Clarion
.clw/.incsource: syntax highlighting, folding, F12/Ctrl+Click go-to-definition, inline diagnostics, and completion (toggleable under Options → Clarion Assistant → Editor Surfaces) - Smart Formatter (Ctrl+I) — reformats Clarion code with structure indentation and aligned declarations; configurable
- CA Embeditor — use Clarion's own Embeditor Source (right-click a procedure, or the Views toolbar button) and a fast Monaco/WebView2 editor overlays the native embeditor automatically; edits save straight back with Clarion-native Save & Exit
- Embed navigation (Ctrl+J / Ctrl+B) — jump to the next/previous filled embed, the same keys the native Clarion embeditor uses (#185); the toolbar arrows and an unfiltered walk over every embed are there too, and all of it is rebindable
- Code Snippets (Ctrl+Shift+J) — classic Clarion template-picker parity: insert reusable code with tab-stops and a
${SELECTED}placeholder, managed from Settings → Snippets - CA Explorer — docked pad showing the active CA Embeditor tab's Local, Module & Global Data, Declared Tables, Other Files, and their Keys, Columns, and Relations; drag a field to the editor or Window designer, copy/paste variables native-style, and a Cheat Sheet tab of editor shortcuts
- Evaluate Code — interactive code review for entire apps, procedures, open files, or selected code
- CA Find & Replace — dockable Find pad or classic in-editor overlay (your pick), Find-All with results in their own editor tab, and one shared history across every CA surface
- Document Structure — fly-out outline of the current buffer with symbol icons, Class ▸ Methods regrouping, and filtering; click to navigate
- Diff viewer — Monaco-based side-by-side diffs with syntax highlighting, live-buffer diffing, and a current-line comparison panel
- Knowledge system — persistent cross-session memory for decisions, patterns, and gotchas
- Zoom persistence — Ctrl+mousewheel zoom is saved and restored across sessions
Nothing yet. Work landed since 5.8.1 is documented here as it merges — see the release-docs workflow, and run Check-ReleaseDocs.ps1 before cutting a release.
A patch release that fixes something 5.8 broke. Full notes: docs/releases/v5.8.1.md.
Installing 5.8 could leave accessory\addins\MarkdownEditor holding exactly one file — the .addin manifest — and none of the assemblies it names. Clarion reads that manifest at startup, fails to load the DLL beside it, and stops with two dialogs instead of opening. The editor's files ship as one wildcard entry, and Inno Setup evaluates such an entry's install check once per expanded file; the manifest sorts alphabetically first, so it was written, and every remaining file then re-ran the check, found the manifest just written reporting the version being installed, took the "you already have this" branch and was skipped. The gate destroyed its own precondition. Reinstalling did not help — that lone manifest kept reporting the current version, so the broken state was exactly the state the repair logic refused to repair. The decision is now made once per Clarion version and frozen before the first write, and a manifest with no assembly beside it is treated as damage rather than as an install, which is what repairs already-broken machines in place. A copy of the editor newer than the bundled one is still left alone.
The bundled editor moves to v1.3.0 — auto-refresh, remembered view preferences, and resizable panes.
The Clarion Assistant addin itself is unchanged from 5.8: same binaries, same version stamp. Only the installer's logic and the Markdown editor it carries are different.
- The user who reported this on Discord, with both dialogs captured. The screenshots named the file and the path, which is what separated "the DLL is missing" from "the DLL cannot load" — very different bugs.
5.8 is the CodeGraph release — and one apology. Full notes: docs/releases/v5.8.0.md.
Re-index your solutions and re-import your documentation after updating. This release corrects what gets read, not what is already stored.
Installing no longer wipes your Claude Code settings (#190)
Every install, on every machine, overwrote %USERPROFILE%\.claude\settings.json — Claude Code's own global configuration — leaving only the handful of keys the installer itself writes. hooks, statusLine, model, tui, your plugins and your own permissions.allow entries were gone, and losing hooks is the worst of it because nothing announces it. The installer runs its configuration step under Windows PowerShell 5.1 and the script asked for a JSON option that only exists in PowerShell 6+, so the parse failed every time — and the error handler mistook its own unsupported call for a corrupt user file, backed it up, and rebuilt from empty. If this hit you, your settings are still on disk: look next to the file for settings.json.backup. plus a timestamp. The parse works on both hosts now, a genuine failure leaves your file alone, a guard refuses any write that would drop a top-level key, and the installer build fails if any of its scripts would not load under real 5.1.
A full index of a 27-app production solution fell from 1:12 to 2:42, with the output verified identical row by row. The correctness half matters more: "who calls X" could answer with the wrong X entirely, because every call in every app resolved to one arbitrary copy of a shared procedure name. Resolution is now scoped the way the compiler thinks, genuinely ambiguous picks are marked rather than asserted, and prototypes are told apart from implementations — which also fixes a documented dead-code query that was returning 98.7% false positives.
Three whole categories of code had been invisible. Procedures whose labels contain a colon were never indexed at all — in generated Clarion that is the entire referential-integrity layer, so "what breaks if I delete from this table" returned nothing. Routine bodies were never scanned, because a ROUTINE label switched the scanner off and DO ProcedureReturn prefix-matched the PROCEDURE pattern. And global data — your PROGRAM file's declaration section — was skipped entirely, with references to an imported global landing on the importing app's copy instead of the declaration you navigate to. The test solution went from 478 thousand relationships to 1.1 million.
Starting an index opens a progress window: apps ticked off as they parse, the file being read, a bar weighted by where the time actually goes, and an estimate seeded from your last run. It can be cancelled — a cancelled full index deletes the partial database rather than leaving something that passes for complete. The transcript is always written to %APPDATA%\ClarionAssistant\codegraph-index.log, and the window no longer steals focus from the IDE. Over MCP, index_solution and index_codegraph now stream live progress and return real completion stats instead of an hour of silence.
The assistant's build tools shelled straight out to ClarionCL without entering the IDE's build pipeline, so the hook that saves unsaved CA Editor tabs never ran — the toolbar button saved them, the assistant did not, and you got the stale build. Alongside it: saving no longer throws the caret to line 1 (our own write looked like an external change to the native editor underneath, whose caret reset was then faithfully mirrored into view), and the editor no longer keeps its unsaved-changes dot on a file it has just saved. .tpl and .tpw listed in Editor Surfaces finally open in the editor, and writing an entry as *.tpl no longer produces a pattern that silently matches nothing.
Mark Sarson's Markdown editor now ships in the installer, pinned like the bundled language server, and is left alone if you already have a newer copy. The CA Embeditor attaches in colon-named procedure suites (#196) — on one reporter's application it had never attached once in six weeks. Two Clarion environments started with /ConfigDir= no longer share one application history (#197); CA had been rebuilding the path from the executable's version stamp, and Clarion 11 and 11.1 both report 11.0. Migration-free — a default install resolves to exactly the string it did before.
Documentation search stops mangling accented characters — the ingester read UTF-8 documents as the machine's ANSI codepage, and the wrong encoding was passed explicitly, which is how it survived two previous sweeps. The embedded assistant knows about every tool it has in the copy that actually ships: 5.7 went out with a prompt missing 51 registered tools, because the fix had landed in a file that gets overwritten on every terminal start. A release could ship with no language server and say so in one grey line among thirty green ones. And CA terminals now leave the MultiTerminal roster when they close — three separate defects, the decisive one being that localhost stalled every call to its timeout, which had also left the Agents pad showing stale data.
- @KevinErskine — #190, and the before-and-after copies of his settings file that made the damage measurable rather than inferred.
- @bill-atchison — #196, reported with the root cause and a proposed fix, both of which held up against the source.
- @BoxSoft — #197, and the dual-environment detail that explained why two Clarion versions collided on one identity.
- Mark Sarson — for the Markdown editor this release redistributes.
5.7 is a parity-and-reliability release. Full notes: docs/releases/v5.7.0.md.
The CA Embeditor answers Ctrl+J (next filled embed) and Ctrl+B (previous) like the native one, wrapping at either end and acting on the focused split pane (#185, BoxSoft). The code-snippet picker moves to Ctrl+Shift+J — Ctrl+J is classic Clarion's snippet gesture in the text editor, but the embeditor owes it to embed navigation — and becomes rebindable like every other command, so it can be put back if you prefer. An unfiltered Next/Previous Embed (any) ships unbound.
Clicking a row for one procedure after another row had opened the generated .clw appeared to do nothing. The reveal was always computing the right line — but the embeditor is a view inside the application window rather than a tab of its own, so raising it needed both levels, and opening the .clw closes the native embed underneath, leaving a surface where Save said "nothing to save" and Cancel blanked the buffer. Such a row now goes to Clarion's own navigation, which re-opens the embeditor properly.
An embed save or cancel could hang the IDE for close to a minute — measured at 57.7s — waiting synchronously on an async language-server call from the UI thread. An audit found twelve such sites, not the two reported, so the pattern is fixed rather than one more symptom. Separately, an application global flagged 'X' is not declared in this file while hovering correctly as a global is suppressed pending the upstream fix (Clarion-Extension issue 396).
Go-to-definition stops resolving to an unrelated procedure's local variable (#182) — a guard the hover path already used and the definition path never called. The editor follows Clarion's live font (#183): it had been reading a property the Options dialog no longer writes to, so font changes never reached the editor. Both from @geircodes. Reviewing #183 turned up a way to lose your own font — with following on, any unrelated gear change persisted the IDE's font as your stored preference — fixed before release, along with the same shape in cursor-behind-EOL.
Collapsed folds are restored on reopen (the state saved but always read back empty), and an ambiguous drifted fold is refused rather than collapsing the wrong region. The Windows-1252 encoding sweep is finished — nineteen more reads, two of them read-modify-write — and reads no longer decode every file twice. CA Search opens in your theme instead of always dark (#181). The installer checks that a folder's Clarion version matches the row it was entered in, and a row now accepts several folders for the same version via +, closing the gap 5.5's known issues warned about.
- @geircodes — #182 and #183, with reproducers and live verification against a real IDE.
- Adrián Santarelli — the WebView2 post-after-dispose fix, reporting #179, and the original Ctrl+J snippet requests (#49, #154).
- BoxSoft — #185, the embed-navigation hotkeys.
Documentation search is the headline: PDF text extraction now works on every machine instead of only ones that happened to have a third-party tool installed, the extracted text is more accurate, and it is indexed so that a question is answered by the first result rather than the fifth query. Alongside that, a cycle of fixes across the diagnostics path, completion scoping, and the CA Editor's Monaco overlay — plus a build fix that restores Clarion 10 to the shipped set.
Importing a folder of PDFs reported "No documentation files found", naming pdf as supported in the very message saying nothing was there. The files were found. Text extraction shelled out to an external pdftotext.exe that CA never bundled and nothing it requires installs — not Git for Windows, contrary to what the code's own probe paths assumed. So PDF import worked only on machines where a developer happened to have put one, and silently produced nothing everywhere else.
Extraction is now in-process (PdfPig, Apache-2.0), so it works everywhere with no external dependency.
The bigger surprise was accuracy. Where the old path did run, it misaligned multi-column tables: in the Language Reference's date-picture table it paired @D6 (dd/mm/yyyy) with 10/1959 — which is @D14's value, and cannot be a dd/mm/yyyy rendering of any date — while dropping other cells entirely. Every row now reads correctly. Those tables are exactly what a Clarion developer searches the documentation for, so the old path was not merely unavailable; where it ran, it was indexing wrong answers.
Re-import your own PDFs. Anything already in a personal DocGraph was indexed through the old path and keeps the old text. The bundled documentation shipped with this release is already rebuilt.
Extraction being correct is not the same as the answer being findable. Asking which three categories ASCIIFileClass's non-virtual methods divide into took five queries; it now takes one, and the answer is the first result.
Four things were wrong at once. Nothing identified the owning class — every chunk in the ABC Library Reference was labelled with the book's name, and since every ABC class has an identically-named "Occasional Use" subsection, results from five different classes interleaved with nothing to tell them apart. Table-of-contents pages outranked real content: 28.7% of the index was dot-leader lines, which are almost pure keyword, so searching a class name returned page-number lists ahead of prose. Clarion keywords lifted out of example code became headings — 486 chunks titled ACCEPT, PROGRAM or RETURN, including the one holding the ASCIIFileClass text. And subsection labels were splitting sections apart, so the three categories landed in three different chunks and no single result could answer the question.
Chunks now carry their real class, contents pages rank below prose, headings read ASCIIFileClass > GetLastLineNo, and a section stays whole. Property references in the Language Reference (PROP:NumTabs and the rest) get their own headings too, so the definition outranks a passing mention in an example.
Verified against a fixed set of eight retrieval tests, kept with the code at ClarionAssistant/docs/DocGraph-Chunking-Verification.md, including a guard on the date-picture table above so a future chunking change cannot quietly undo the extraction fix.
Index-noise suppression currently covers documentation whose contents pages put the title and page number on one line — SoftVelocity's and CapeSoft's. BoxSoft's manuals wrap them across two lines and are not yet recognised.
The Documentation Graph panel (Settings → Data → Info) gains a Type column showing each library's source format, and every column header — Library, Type, Vendor, Chunks — is now a sort toggle. Click Type to group the PDFs together, which is the fastest way to see what wants a re-import after this release.
Setup derived each Clarion path fresh on every run, registry first, and discarded whatever you corrected in the wizard. If your Clarion isn't where SoftVelocity's installer registered it — a second copy, or one launched with /Configdir= against its own settings folder — you had to re-enter the path on every release, and forget once.
That failure is quiet: the addin lands in a tree you don't launch, the IDE keeps loading the old one, and the symptoms get reported against a build replaced weeks ago. Paths a run actually installs to are now remembered and offered next time, and validated on read so a tree that has since moved falls back to detection.
Clarion source is saved as Windows-1252/ANSI with no BOM, but four File.ReadAllText calls on the LSP text-sync path read it with no encoding argument — and .NET only auto-detects via BOM. Every single-byte high-bit character (a copyright symbol, say) silently became U+FFFD before the text reached the language server, which then correctly flagged the replacement character it had been handed. The result was waves of "this character will corrupt the file" warnings — dozens per file — on files that are perfectly valid on disk. All four sites now read through EncodingHelper.DetectFileEncoding, the same helper the diff viewer got in #94.
The squiggle overlay could render nothing at all for a file that the diagnostics pill correctly reported an error for moments later. Four defects, one symptom, all rooted in treating "no information yet" as "authoritatively zero": a premature empty LSP republish was trusted as final (the server publishes progressively, and a slower cross-file check can land in a later batch); a timed-out round-trip was folded into an empty marker list, which erased every existing squiggle and its gutter mark rather than merely failing to add one; the client's timeout sat below the host's own worst case, discarding slow-but-successful analyses; and the settle loop parked a thread-pool thread per request. Empty results now get a short settle window before being believed, a timeout leaves the rendered markers alone, the diagnostics call gets its own longer budget while completion and hover keep their short interactive one, and the wait is properly async.
The LSP status bar and the diagnostics popup rendered in the chat pane's theme, which is a separate setting from the CA Editor's own. They now follow the active editor's theme, tracked per Monaco surface rather than read from a process-wide mirror that only ever recorded whichever page spoke last.
Three correctness bugs surfaced in the same code path and are fixed here too. The status bar pill never appeared when the IDE's own ClarionLsp addin was the active client — the visibility check asked the bundled LspClient, which in that configuration is never started, so the pill was hidden on every tick and the window it opens was unreachable. Both the liveness check and the cache read now go through SharedLspBridge, and the target file is resolved from the active editor instead of "the last file any LSP tool touched". The pill also stopped claiming a green OK for files nothing had ever been published about — unknown now renders as its own muted state rather than being flattened into "clean" during exactly the window when results are still arriving, and the status bar asks for diagnostics when it finds none cached instead of reporting "unknown" indefinitely at a cache nothing else was going to fill. And severity colours now survive a live dark⇆light switch instead of keeping the previous theme's palette until the rows next rebuilt.
Rounding it out: owner-drawn column headers and grid lines that actually follow the theme, a selection highlight that no longer overrides each row's severity colour, a dark-mode-aware native title bar, and no more hover flicker.
Follow-up to #159. The CodeGraph backfill in bare-prefix completion matched symbol names across the whole indexed solution with no scope awareness, so a variable declared private to some unrelated procedure in a different file was offered exactly like a genuine global — typing Include at the top of a PROGRAM file could surface an IncludeAddress local from elsewhere entirely. Symbols the indexer already tags as procedure-private are now filtered out of that merge. Locals in the procedure you're actually standing in are unaffected: those come from a live-buffer parse, not the database.
DO takes a ROUTINE label and nothing else, so it is now its own completion context answered from routines alone. Routine names are read from the live buffer, scoped to the enclosing procedure — which is a routine's real visibility in Clarion — so a routine you just typed and haven't saved completes too. Previously DO was answered from the general symbol set: typing DO ref offered methods from an unrelated Reflection class while missing the RefreshWindow routine a few lines up.
Clarion-style Ctrl+X posted the cut text to the host before deleting it from the buffer — and the CA Editor never implemented its half of that contract, so Ctrl+X deleted the line without putting anything on the Windows clipboard. Both stubs left inert since the original overlay spike are now wired: the cut text reaches Clipboard.SetText, and a Data-pad field dropped directly onto the editor surface now returns activation to the editor's own tab instead of leaving focus stranded on the pad.
The LSP status bar — the strip at the bottom of the assistant pane carrying the diagnostics pill — has always had its own ✕, and nothing brought it back: restarting Clarion was the only way. A ◎ button joins the header's title-row actions, beside the theme toggle, and shows or hides it on demand. It repaints from the current state on the way back rather than returning with whatever it was showing when dismissed.
DiffService called a FileService method that doesn't exist on Clarion 10's older SharpDevelop fork, so the C10 build had been failing outright since the CA Compare write-back work landed — while 11, 11.1 and 12 compiled clean. It now reaches the same information through an API present on every fork, from one code path.
If you run Clarion 10, this release is the first to include roughly a week of changes that never made it into a working C10 binary. The installer ships a per-Clarion build (bin\Debug-C10 and siblings), so a broken build for one release meant that release shipping stale or not at all.
The deploy script no longer lets one bad target take the others down with it, either: a build failure for a single Clarion version used to abort the run before the deploy step, so nothing was deployed anywhere while the console showed the other three building successfully. Failures are now collected, every version that built is deployed, and the run ends by naming what didn't ship.
In Create New Class, any model whose declaration put a Clarion keyword and a quoted string on the same line — a standard CLASS,TYPE,MODULE('X.CLW'),LINK('X.CLW') — rendered visibly broken markup instead of coloured code. The keyword pass ran over the HTML the string pass had just produced and matched the literal class and string inside its own attributes. The two passes are now ordered so there is no HTML for the keyword pass to collide with.
Two fixes to Ctrl+I, both reported and diagnosed by @geircodes.
A comment sitting among declarations — inside a GROUP/QUEUE/RECORD/FILE, or directly in a procedure's or routine's DATA section — was indented to the CODE-section column rather than the field column it had been aligned to. It visibly jumped left while every declaration around it formatted correctly, which read as arbitrary rather than as a rule; comments inside IF/CASE/LOOP bodies were never affected, which is what made it look inconsistent. Those comments now line up with the fields they sit among — and a long banner comment does not drag the whole structure's field column to the right with it.
"Indent comments" now means what it says. Switching it off used to delete a comment's indentation and dump it at column 1, including comments hand-aligned deep inside nested control structures. Off now means leave the comment exactly where it is.
- geircodes — the bulk of this cycle again: the LSP source-encoding fix that ended a wave of false "this character will corrupt the file" warnings (#168), the squiggle overlay going blank on slow or premature results (#170), the diagnostics window's theme plus three correctness bugs found alongside it — including the status bar pill that never appeared at all (#169), the completion scope leak that surfaced other procedures' locals solution-wide (#172), the CA Editor clipboard and drop-focus stubs (#173), and the class-model preview highlighting (#171). Also reported, diagnosed and wrote the patch for the Ctrl+I comment-indenting fixes (#161), filing it as an issue with the semantics question open rather than as a PR — which is why "Indent comments OFF" now means something deliberate.
- Bill Atchison — reporting that PDFs would not import (#167). The bug was invisible to anyone whose machine happened to carry a stray
pdftotext.exe, which is every developer machine here; without the report it would have kept shipping. - BoxSoft — the installer path report (#142) that turned out to be the reason a whole diagnostic round was spent chasing symptoms in a build that had already been replaced.
Summaries for v5.5 and earlier — back to v3.0 — are archived in docs/releases/CHANGELOG.md.
Full per-release notes live in docs/releases/.
The installer bundles COM for Clarion, a complete toolkit for creating .NET COM controls that work with Clarion:
- IDE addin — browse, discover, and manage COM controls from inside Clarion
- UltimateCOM template — Clarion template and class for embedding COM controls in your apps
- ClarionCOM tooling — project templates, build scripts, and deployment tools for creating your own C# COM controls
- COM Marketplace — access community-published controls from clarionlive.com
| Requirement | Notes |
|---|---|
| Clarion IDE (v10, v11, or v12) | Auto-detected from Windows registry |
| Claude Code CLI | Download from Anthropic |
| WebView2 Runtime | Pre-installed on Windows 11; download for Windows 10 |
- Download the latest installer (code-signed)
- Close the Clarion IDE
- Run the installer — select which Clarion versions to install for
- Restart the Clarion IDE
One row per Clarion version, and they are not interchangeable. Each row installs the addin built for that version, compiled against that Clarion's own IDE assemblies — so pointing the "Clarion 10 folder" row at a Clarion 12 installation ships the wrong build and it won't load. The installer now checks the version of whatever folder you enter and warns you if it doesn't match the row.
More than one installation of the same version? That's supported — press the + button on that version's row and pick the extra folder. Each extra gets a copy of that row's addin once the install finishes, and the list is remembered for next time. Handy if you keep, say, two Clarion 12 trees side by side.
One trap worth knowing: never leave a spare or backup copy of the addin folder anywhere inside an
accessory\addinstree. Clarion scans subfolders, and a duplicate makes startup fail with "Identity name used by multiple addins." Keep backups outside.
| Component | Location | Description |
|---|---|---|
| Clarion Assistant addin | {Clarion}\accessory\addins\ClarionAssistant\ |
Main addin DLL, WebView2, SQLite, HTML terminal |
| COM for Clarion addin | {Clarion}\accessory\addins\ComForClarion\ |
COM browser addin |
| UltimateCOM template | {Clarion}\accessory\template\win\ |
.tpl, .inc, .clw, and template DLLs |
| Documentation | {Clarion}\accessory\resources\ComForClarionDocumentation\ |
COM for Clarion docs |
| Claude Code plugin | %USERPROFILE%\.claude\plugins\...\clarion-assistant\ |
20+ Clarion-specific skills, hooks, and docs |
| Code quality agents | %USERPROFILE%\.claude\agents\ |
6 agents (won't overwrite existing) |
| ClarionCOM tooling | %APPDATA%\ClarionCOM\ |
Project templates and scripts |
| DocGraph database | %APPDATA%\ClarionAssistant\ |
Pre-loaded Clarion 12 documentation index |
Your existing Claude Code settings are preserved — the installer merges permissions non-destructively.
Clarion Assistant exposes 108 MCP tools that Claude uses to interact with the IDE:
| Tool | Description |
|---|---|
get_active_file |
Get path and content of the open file |
open_file |
Open a file in the editor, optionally at a line |
close_file |
Close the active editor tab |
save_file |
Save the active file |
get_open_files |
List all open editor tabs |
go_to_line |
Navigate to a specific line in the open file |
get_cursor_position |
Get current line, column, and total line count |
get_line_text |
Get text of a specific line from the live buffer |
get_lines_range |
Get a range of lines from the editor |
get_selected_text |
Get the currently selected text |
get_word_under_cursor |
Get the word at the cursor position |
select_range |
Select/highlight a range of text in the editor |
insert_text_at_cursor |
Insert text at the current cursor position |
replace_text |
Find and replace all occurrences in the active editor |
replace_range |
Replace text between specific line/column positions |
delete_range |
Delete text between specific line/column positions |
find_in_file |
Search for text in the active editor buffer |
toggle_comment |
Toggle Clarion line comments on a range of lines |
is_modified |
Check if the active file has unsaved changes |
undo |
Undo the last edit |
redo |
Redo the last undone edit |
show_diff |
Show a side-by-side diff in the Monaco viewer |
get_diff_result |
Get approval/notes from the diff viewer |
| Tool | Description |
|---|---|
get_app_info |
Get info about the currently open app |
list_procedures |
List all procedures in the open app |
get_procedure_details |
Get detailed procedure info (prototype, module, template) |
select_procedure |
Select a procedure in the app tree |
open_procedure_embed |
Open the embeditor for a procedure |
get_embed_info |
Get info about the active embeditor |
list_embeds |
List all embed sections with filled status |
find_embed |
Find and navigate to an embed section by name |
next_embed / prev_embed |
Navigate to the next/previous embed point |
next_filled_embed / prev_filled_embed |
Navigate to the next/previous filled embed |
get_embed_content |
Read code inside a specific embed slot |
get_embeditor_source |
Get full annotated embeditor source with embed markers |
search_embeditor_source |
Regex search over annotated embeditor source |
open_embeditor_source |
Open the embeditor source in the editor |
write_embed_content |
Write code into an embed slot by line number |
save_and_close_embeditor |
Save changes and close the embeditor |
cancel_embeditor |
Discard changes and close the embeditor |
export_txa |
Export app or procedures to TXA format |
import_txa |
Import a TXA file into the app |
| Tool | Description |
|---|---|
get_solution_info |
Get current solution, Clarion version, RED file, and CodeGraph status |
index_codegraph |
Index the solution for CodeGraph queries |
index_solution |
Index all projects in the solution |
list_codegraph_databases |
List available indexed CodeGraph databases |
query_codegraph |
SQL queries over every symbol, relationship, and call chain |
get_project_source_files |
List all source files (.clw, .inc) with absolute paths |
analyze_class |
Parse CLASS definitions from .inc files |
sync_check |
Compare .inc declarations vs .clw implementations |
generate_stubs |
Generate method stubs for missing implementations |
generate_clw |
Generate a complete .clw implementation from a .inc file |
generate_source |
Generate .clw/.inc source from templates |
| Tool | Description |
|---|---|
lsp_start |
Start the Clarion Language Server |
lsp_debug_status |
Check LSP server status |
lsp_definition |
Go to definition of a symbol (cross-file) |
lsp_references |
Find all references to a symbol across the workspace |
lsp_hover |
Get type info, signature, and documentation for a symbol |
lsp_document_symbols |
Get all symbols in a file |
lsp_find_symbol |
Search for symbols across the workspace by name |
lsp_diagnostics |
Get errors and warnings for a source file |
lsp_rename |
Propose a rename of a symbol (returns edit list for approval) |
| Tool | Description |
|---|---|
search_tables |
Search database tables by name |
get_table |
Full table detail with columns, keys, relationships |
search_columns |
Find columns across all tables |
get_relationships |
Show parent/child table relationships |
query_schema |
Run SQL queries against the schema index |
schema_stats |
Get schema database statistics |
ingest_schema |
Index a Clarion dictionary (.dctx) |
ingest_sql_database |
Index schema from SQL Server, SQLite, or PostgreSQL |
export_dctx |
Export dictionary to .dctx format |
import_dctx |
Import a .dctx dictionary |
| Tool | Description |
|---|---|
query_docs |
Full-text search across all indexed documentation |
ingest_docs |
Index docs from a Clarion installation's accessory/Documents folder |
ingest_web_docs |
Ingest documentation from web URLs |
list_doc_libraries |
List all indexed libraries with chunk counts |
discover_docs |
Preview discoverable doc sources without ingesting |
docgraph_stats |
Get DocGraph database statistics |
| Tool | Description |
|---|---|
build_solution |
Build the entire Clarion solution via ClarionCL.exe |
build_app |
Build a single .app file (for multi-DLL solutions) |
build_com_project |
Build a C# COM control via MSBuild |
run_command |
Execute any command-line tool |
execute_command |
Execute a shell command |
| Tool | Description |
|---|---|
read_file |
Read file content from disk with optional line range |
write_file |
Write content to a file |
append_to_file |
Append text to an existing file |
list_directory |
List files in a directory with optional pattern filter |
search_files |
Search for files by name |
search_files_advanced |
Advanced file search with Everything integration (path, extension, size, date filters) |
search_content |
Search file contents by text |
| Tool | Description |
|---|---|
get_ca_project_info |
Get linked GitHub/Bitbucket account and repo for a project |
get_red_search_paths |
Get RED file search paths for the active solution |
resolve_red_path |
Resolve a filename to an absolute path via RED search paths |
inspect_ide |
Inspect Clarion IDE internal state |
| Tool | Description |
|---|---|
add_knowledge |
Save reusable insights (decisions, patterns, gotchas) across sessions |
query_knowledge |
Search past decisions and patterns |
save_session_summary |
Save a session summary for next-session continuity |
query_traces |
Query code generation traces |
trace_stats |
Get trace database statistics |
log_skill_update |
Log a skill update event |
| Tool | Description |
|---|---|
list_instances |
List all running Clarion Assistant instances |
get_instance_messages |
Get messages from other instances |
send_to_instances |
Send a message to other instances |
check_conflicts |
Check for file conflicts across instances |
| Tool | Description |
|---|---|
validate_names |
Validate Clarion naming conventions |
find_duplicates |
Find duplicate symbols in the solution |
The installer includes 22 Clarion-specific skills for Claude Code (installed as a plugin):
| Skill | Description |
|---|---|
clarion |
Clarion language reference — syntax, data types, control structures, Windows API patterns |
clarion-ide-addin |
IDE addin development with SharpDevelop integration |
clarion-analyze |
Analyze Clarion code generation traces for recurring failure patterns |
clarion-benchmark |
Benchmark Clarion code generation quality |
clarion-convert-driver |
Convert Clarion dictionaries between file drivers (e.g., TopSpeed to SQLite) |
evaluate-code |
Evaluate Clarion app code for issues and improvements |
jfiles |
jFiles JSON serialization patterns for Clarion |
lsp-diagnostics |
Run LSP diagnostics across all source files in the open solution with navigate-to-error support |
ClarionCOM |
Interactive COM development assistant |
clarioncom-build |
Build COM projects with MSBuild |
clarioncom-config |
Manage ClarionCOM settings |
clarioncom-control |
Create and validate C# COM controls for Clarion |
clarioncom-create |
Create new C# COM control projects from scratch |
clarioncom-deploy |
Generate deployment artifacts |
clarioncom-get |
Download controls from the marketplace |
clarioncom-github-init |
Initialize GitHub repos for COM projects |
clarioncom-marketplace-submit |
Submit controls to the COM Marketplace |
clarioncom-validate |
Validate RegFree COM compliance |
clarioncom-webview2-build |
Build WebView2 COM control projects |
clarioncom-webview2-create |
Create WebView2-based COM controls with HTML/CSS/JS |
clarioncom-webview2-deploy |
Generate deployment artifacts for WebView2 COM controls |
clarioncom-webview2-validate |
Validate WebView2 COM controls for RegFree compliance |
- Visual Studio 2022 (Community or higher)
- .NET Framework 4.8 SDK
- Clarion IDE (for reference assemblies in
{Clarion}\bin\) - Inno Setup 6 (for building the installer)
The build uses Directory.Build.props at the repo root to locate your Clarion installation. The defaults assume John's machine layout (C:\Clarion12, C:\Clarion11-13372, C:\Clarion10).
If your Clarion is installed elsewhere, create a Directory.Build.props.user file alongside Directory.Build.props (it is gitignored — never commit it):
<Project>
<!-- Replace with your actual Clarion installation path -->
<PropertyGroup>
<ClarionRoot>C:\Clarion\Clarion12</ClarionRoot>
</PropertyGroup>
</Project>The .user file overrides the defaults for all ClarionVersion values, so a single path entry is enough if you only build for one version. You can still pass /p:ClarionVersion=11 on the command line to select the target version.
Alternatively, pass the path directly on the command line without creating a .user file:
msbuild ClarionAssistant.csproj /p:ClarionVersion=11 /p:ClarionRoot="C:\Clarion\Clarion11.1"# Build for a specific version (uses Directory.Build.props.user if present)
cd ClarionAssistant
msbuild ClarionAssistant.csproj /p:Configuration=Debug /p:ClarionVersion=12
# Build the addin for all Clarion versions via deploy script
.\deploy.ps1 -NoBuild:$false -Version allNote: Use MSBuild directly — do not use
dotnet build. WebView2 NuGet resolution fails with the .NET CLI on this .NET Framework 4.8 project.
# Deploy to your local Clarion IDE (builds + copies DLLs)
cd ClarionAssistant
.\deploy.ps1 -Version 12
# Deploy without rebuilding (e.g. HTML-only changes)
.\deploy.ps1 -Version 12 -NoBuild
# Kill the IDE before deploying (when DLLs are locked)
.\deploy.ps1 -Version 12 -Killcd ClarionAssistant
.\tests\Run-Tests.ps1One entry point for both harness families: standalone csc harnesses over IDE-free service code
(tests\), and node harnesses over the Monaco WebView2 pages (Terminal\test\). Neither is wired into
MSBuild — they exist to be run before you deploy, because the bugs they catch (a NUL byte inside a
420 KB HTML file, a settings panel that reads fine in dark mode and is illegible in light) pass a clean
build and fail a human.
Most need nothing installed. One page test needs jsdom, declared as a devDependency:
npm install --prefix Terminal\testWithout it that test reports could not run and fails the overall run rather than reporting green. See
tests/README.md for what each harness guards.
Clarion Assistant is built with the help of these open-source projects and contributors:
| Name | Contribution |
|---|---|
| Mark Sarson | Clarion Language Server Protocol implementation for VS Code, which the LSP integration in Clarion Assistant is based on |
| Library | Description | License |
|---|---|---|
| xterm.js | Terminal emulator (v6.0.0) | MIT |
| Newtonsoft.Json | JSON serialization (v13.0.3) | MIT |
| System.Data.SQLite | SQLite database with FTS5 full-text search | Public Domain |
| Microsoft WebView2 | Embedded browser runtime | MIT |
| Everything SDK | Instant file search by voidtools | Freeware |
| recursive-improve | Recursive improvement pattern for code generation | MIT |
MIT License — © 2025-2026 ClarionLive.
The MIT license covers Clarion Assistant's own source. The installer additionally bundles third-party components that keep their own licenses — PdfPig (Apache-2.0), the Microsoft Edge WebView2 runtime, SQLite, and Node.js with the bundled language server. Clarion IDE assemblies are referenced from your existing Clarion installation and are not redistributed.
