← clide.tools
macOS configuration profile Windows ADMX template Windows ADML (en-US) Linux policy.json

Monitoring CLIDE

CLIDE gives command-line scripts a form, runs them, writes new ones with an AI agent, installs ready-made ones from its Tool Marketplace, and updates itself. This folder is for whoever looks after the computers it runs on: what CLIDE can record, where it goes, and how to set it for every computer at once.

The format is beta, like CLIDE. Fields may still change until CLIDE 1.0. When a field is renamed or removed, or its meaning changes, schema_version goes up. Adding a field or an event doesn't change it. Ignore fields you don't know.

What it is, and what it isn't

Monitoring shows what CLIDE did. It doesn't stop anyone doing anything. A person can delete the local log, quit CLIDE, or run a tool's script in a terminal, where CLIDE never sees it.

What CLIDE can't see:

clide run in a terminal is recorded, as clide.source: "cli", with the same settings and policy as CLIDE.

The log file

OSWhere
macOS~/Library/Logs/CLIDE/monitor.jsonl (Console.app shows it under Log Reports)
Windows%LOCALAPPDATA%\CLIDE\Logs\monitor.jsonl
Linux$XDG_STATE_HOME/clide/logs/monitor.jsonl, by default ~/.local/state/clide/logs/monitor.jsonl

The folder can be changed in Settings or by policy (logFolder).

The OpenTelemetry endpoint

CLIDE sends to <endpoint>/v1/logs and <endpoint>/v1/traces (OTLP over HTTP, JSON). An address that already ends in one of those paths is used as it is for that signal.

Fields on every event

Field
schema_version1
timeWhen it happened: ISO 8601, UTC, milliseconds (2026-10-22T14:03:07.412Z)
event.nameThe event, below
user.nameThe account CLIDE runs as
host.nameThe computer's name
os.typedarwin, windows or linux
os.versionmacOS's version (15.6); the kernel's on Linux; Windows' build (10.0.22631)
service.versionCLIDE's version
clide.sourceapp (CLIDE's window) or cli (clide run in a terminal)

Values: what's hidden unless recorded

Record values is off unless the person or the policy (recordValues) turns it on. While it's off:

With it on, those fields also carry the values themselves: process.command_args as the run had them, process.working_directory, clide.files.read.paths, clide.files.written.paths, url.full, clide.references.names and clide.batch.record.

Never recorded, either way: environment variables, anything a run prints, the contents of what tools make, what a person asks an AI agent and what it answers, the contents of reference files, and a header's value.

Tool and pipeline paths are always recorded: they say which tool ran.

Events

What ran

run.started: a tool's run, or a pipeline's tool step, as its program starts.

Field
clide.run.idThe run's id, as CLIDE's History has it; the same on its end
clide.tool.name, clide.tool.pathThe tool
clide.tool.hashSHA-256 over all the tool's files: see A tool's hash
clide.tool.filesEach file: { "path": "report.sh", "sha256": "…" }, its path relative to the tool's folder
clide.pipeline.path, clide.pipeline.hash, clide.pipeline.run.id, clide.step, clide.step.attemptA pipeline's step only
clide.triggermanual (Run in the window), preset, batch, pipeline (a step of a pipeline run in CLIDE), cli (a step of clide run)
clide.preset, clide.batchThe preset or batch preset it came from, by name
process.executable.nameThe program: bash, python3, bun; process.executable.path too when the tool gives a path
process.command_argsIts arguments, values hidden unless recorded
clide.args.countHow many arguments

run.completed: the run ended, however it ended. The tool's fields as on its start, and:

Field
clide.statusdone, failed, cancelled or timed-out
process.exit.codeIts exit code; null when it was stopped
clide.duration_msHow long it ran
clide.messageWhat CLIDE said about it, when it said something
clide.files.read, clide.files.writtenHow many of the person's files it read and wrote
clide.files.kindsThose files by kind: { "document": 2, "image": 1 }

run.failed: the program couldn't be started at all (no such program, no permission), after run.started. The tool's fields, the program, error.type: "start_failed" and error.message.

run.new_code: the first run, on this computer, of a tool whose files are as they are now: a new tool, or one whose files changed. After its run.started. The tool's fields. This is the event to alert on.

Where code came from

tool.added: a tool CLIDE hadn't seen: made by an agent, installed from the Marketplace, or found new in a tool folder it looks at. clide.tool.path, clide.tool.hash, clide.tool.files, and who (below).

tool.changed: a tool's files changed. clide.tool.path, clide.tool.hash.before, clide.tool.hash, clide.tool.files.changed (which files, by relative path), clide.tool.files, and who.

tool.removed: a tool gone from a tool folder CLIDE looks at. clide.tool.path, clide.tool.hash.before, and who.

Who, on all three:

clide.byAnd
agentclide.agent.name, clide.agent.model: an AI agent wrote or edited it
marketplaceclide.marketplace.id, clide.marketplace.version: installed or updated from the Tool Marketplace
clideclide.change: changed in CLIDE by the person (the Code tab, a restored version, a rename, presets, tags)
outsideclide.detected: true: changed outside CLIDE, and noticed later: right before the tool's next run (and before its run.started), when the tool is opened, or when its tool folder is looked at again (as CLIDE starts, and when it comes back to the front, at most once a minute)

The first time CLIDE sees a tool it only remembers it. A tool folder's first look says nothing; tools new to it after that are tool.added.

tool.opened_from_os: a .clide file double-clicked, opened with CLIDE, or dropped on its icon. clide.tool.path.

AI agents

agent.started: one turn of the person's AI agent.

Field
clide.agent.nameThe agent: claude, codex, gemini, or a custom agent's id
clide.agent.modelThe model, by its full name when the agent said; null for its default
clide.agent.purposecreate (a new tool or pipeline), edit (changing one, fixing a failed run included), batch_draft (drafting a batch preset)
clide.tool.pathThe tool it works on; for create, the folder the new tool goes in
clide.references.countHow many files the person gave it to read

agent.completed: the turn ended. The same fields, and clide.status (done, failed, cancelled), process.exit.code, clide.duration_ms.

agent.failed: the agent's program couldn't be started. error.type: "start_failed", error.message.

What runs touched

The files a run read and wrote are on its run.completed, above.

fetch: a web address CLIDE fetched itself. url.domain, url.full ([REDACTED] unless values are recorded), clide.fetch.for (batch_source: a batch preset's records; marketplace: the Marketplace's index and tools), clide.fetch.ok. Screenshots in the Marketplace aren't recorded. What a tool's own script fetches is that script's business, and isn't seen.

CLIDE itself

EventFields
app.startedhost.arch; clide.monitoring.log, clide.monitoring.endpoint, clide.monitoring.record_values (what's on); clide.monitoring.policy (the keys your policy sets)
app.quitWritten to the log as CLIDE quits. It reaches the endpoint only if it's sent in time: CLIDE waits a second and a half for it at most.
app.updatedclide.version.from, clide.version.to: on the first start after an update
settings.changedclide.settings.section and clide.settings.key; clide.settings.from and clide.settings.to for settings that hold nothing personal. Sections and keys: runs (runsAtOnce, keepDays with values; pipelineRuns, keepDaysFor), appearance (theme), agents (agent with its new value; customAgents), toolFolders (folders), monitoring (recordValues with values; logFolder, endpoint, endpointHeaders)
dependency.missingclide.tool.path, clide.dependency.program: a program a tool needs isn't on this computer (once per tool and program while CLIDE runs)
monitoring.changedclide.output (log or endpoint), clide.enabled, clide.by (person or organization). When an output is turned off, this is its last event.
monitoring.testFrom Settings → Monitoring's Send a test event
monitoring.droppedclide.output, clide.dropped.count: events lost while writing or sending failed
monitoring.policy_problemclide.policy.problem: a key of your policy CLIDE couldn't use, and left out

A tool's hash

A CLIDE tool is a .clide file and the files it runs: report.clide runs ./report.sh. A tool's hash covers all of them:

  1. The files are the .clide and every file its run.command and run.args name inside its folder (./report.sh, {{toolDir}}/lib.py).
  2. Each file's SHA-256 is taken, and a line written for it: its path relative to the tool's folder, a tab, its SHA-256, a newline.
  3. The lines are sorted by path and joined, and clide.tool.hash is the SHA-256 of that text.

So the hash changes when any of the tool's files changes, is added, is removed or is renamed, and clide.tool.files says which. A pipeline's step runs this run's copy of the tool's .clide with its scripts where the tool is, and its hash is taken that way.

Outside the hash: files a script loads by itself (a library it imports, a file it sources) unless the tool names them, and the programs it calls from the PATH, which process.executable.name names.

Setting it for every computer

Each key your policy sets wins over the person's choice and is locked in Settings; a key it leaves out stays the person's. A policy CLIDE can't read, or a key with a bad value, is left out key by key, said in Settings, and recorded as monitoring.policy_problem. CLIDE reads the policy as it starts and whenever Settings opens.

KeyType
logEnabledtrue / falseWrite the log
logFoldertextThe log's folder: a full path
endpointtextThe OpenTelemetry endpoint: an http or https address, with no key in it
endpointHeadersnames and valuesHeaders sent to the endpoint
recordValuestrue / falseRecord values

macOS: a configuration profile

clide-monitoring.mobileconfig sets them for the preference domain tools.clide. Change its values, remove the keys you leave to people, and deploy it from your MDM (Jamf, Kandji, Intune…) as a device profile. CLIDE reads /Library/Managed Preferences/tools.clide.plist, then the signed-in person's /Library/Managed Preferences/<user>/tools.clide.plist for keys the first doesn't set.

Windows: Group Policy or Intune

windows/clide.admx and windows/en-US/clide.adml: copy them to PolicyDefinitions (and PolicyDefinitions\en-US), or import them into Intune. The policies are under CLIDE → Monitoring, for the computer or the user. They write HKLM\SOFTWARE\Policies\CLIDE or HKCU\SOFTWARE\Policies\CLIDE: logEnabled and recordValues as DWORD 1 or 0, logFolder and endpoint as strings, and the headers as string values under the endpointHeaders key. The computer's keys win over the user's.

Linux: a file

policy.json, at /etc/clide/policy.json, put there with whatever configures your machines (Ansible, Puppet, Chef):

{
  "logEnabled": true,
  "recordValues": false,
  "endpoint": "https://otel-collector.example.com:4318",
  "endpointHeaders": { "x-api-key": "replace-with-your-key" }
}

Collecting the log

The paths below are macOS's; Windows' is C:\Users\*\AppData\Local\CLIDE\Logs\monitor.jsonl, Linux's /home/*/.local/state/clide/logs/monitor.jsonl. Read the current file only: rotated ones were read before they were renamed.

Fluent Bit (with the json parser from its parsers.conf):

[INPUT]
    Name    tail
    Path    /Users/*/Library/Logs/CLIDE/monitor.jsonl
    Parser  json
    Tag     clide

Vector:

sources:
  clide:
    type: file
    include: ["/Users/*/Library/Logs/CLIDE/monitor.jsonl"]
transforms:
  clide_events:
    type: remap
    inputs: [clide]
    source: ". = parse_json!(.message)"

Splunk Universal Forwarder (inputs.conf):

[monitor:///Users/*/Library/Logs/CLIDE/monitor.jsonl]
sourcetype = _json

Elastic Agent or Filebeat:

filebeat.inputs:
  - type: filestream
    id: clide
    paths: ["/Users/*/Library/Logs/CLIDE/monitor.jsonl"]
    parsers:
      - ndjson:
          target: ""

Or skip the file: set the endpoint to your OpenTelemetry Collector.

An example line

{"schema_version":1,"time":"2026-10-22T14:03:07.412Z","event.name":"run.completed","user.name":"pat","host.name":"pat-laptop","os.type":"darwin","os.version":"15.6","service.version":"0.5.0","clide.source":"app","clide.run.id":"run-1761141787000-1","clide.tool.name":"Make a report","clide.tool.path":"/Users/pat/Tools/report/report.clide","clide.tool.hash":"9f2c…","clide.tool.files":[{"path":"report.clide","sha256":"41ab…"},{"path":"report.sh","sha256":"c07e…"}],"clide.status":"done","process.exit.code":0,"clide.duration_ms":1840,"clide.files.read":1,"clide.files.written":1,"clide.files.kinds":{"document":2}}