Pre-GA — not yet generally available. The Claude Cowork card under
Integration → Connectors stays disabled until a Cowork-specific canary
proves the connector on
main. The npm package is published, so the install
command below works — but latest tracks main, which can sit behind the fixes
already on the integration branch.Prerequisites. A VisIQ account (sign in) with a
harness key from Settings → Harness Keys, and the Claude desktop app. This
harness governs Cowork’s own agent, so no separate model key is needed here.
Hitting an error? See Troubleshooting.
@visiq/claude-cowork-harness brings VisIQ governance to Claude Cowork, the
agent surface in the Claude desktop app.
The two surfaces
A sandboxed session’s configuration lives inside the guest and carries no
settings.json, so no host hook can fire for it. The audit stream VisIQ tails
for those sessions is written after a tool has already run. VisIQ therefore
never reports a block on the sandbox surface, and status says so explicitly.
If an AI coding agent is doing this install
These are its rules — the same guardrail VisIQ prepends to every setup prompt the platform generates. They are here because this page is one an agent gets pasted, and because a step below really can fail:latest tracks main, so it can lag
the fixes already on the integration branch. Improvising around a failed step is
how an agent ends up building a CLI from source and patching the very harness it
was sent to install.
Rules for the AI agent running this setup — read these first:
- Apply ONLY the changes this prompt explicitly shows: its commands, its environment/config values, and its exact code snippet(s), if any. Nothing else may be written, edited, or patched — not code, not packages, not configuration.
- Never improvise a workaround when something fails: no building from source, no packing tarballs, no PATH shims or alternative registries, and no debugging or patching the VisIQ software itself.
- If any command fails, is unavailable, or produces output that differs from what this prompt describes, STOP and report the exact command plus its full output back to your operator. A partial install is a safe no-op by design — leaving it unfinished is always correct; an unauthorized fix never is.
- Do the steps below IN ORDER, and after each one run the
Check:command it shows and confirm the output before moving on. NEVER report the setup complete based on what you intended to do — only on what a check actually showed. If a check does not show what it describes, the step is not done. - Reading is always in scope. Inspect these commands, the URLs they call and the integrity checks they run BEFORE executing anything, and tell your operator what you found. These rules bound what you may CHANGE, never what you may examine — if something here looks wrong, refusing to run it and saying why is the correct outcome, not a failed setup.
Install
1
Install the harness
visiq-claude-cowork status. Its dispatcher: line must end in a real
path — → NOT FOUND on PATH means only one of the two packages landed, and every
tool call will run ungoverned.2
Wire the hooks (host-local enforcement)
~/.claude/settings.json.Check: visiq-claude-cowork status now reads hooks: installed — <your settings.json>. not installed means the write did not happen.3
Set credentials
@visiq/claude-code-harness — mint the key under
Settings → Harness Keys.Check: visiq-claude-cowork status now reads credentials: resolved and shows the
agent id: you passed. While it reads MISSING the hooks are wired but every one
of them silently no-ops.4
Point at your control plane (optional)
--api-key and --agent-id are the two REQUIRED values. The endpoint is
optional and defaults to the VisIQ cloud (https://api.visiqlabs.com). If
you run a sovereign / self-hosted / on-prem VisIQ, set it — otherwise this
harness reports every governed tool call to the VisIQ SaaS control plane rather
than your own:VISIQ_API_KEY /
VISIQ_AGENT_ID / VISIQ_BASE_URL behave exactly as in
the Claude Code quickstart.Check: visiq-claude-cowork status still reads credentials: resolved. If you
skipped this step, skip the check with it — the default is the VisIQ cloud, which
is correct for every VisIQ SaaS account.5
Restart the Claude desktop app
Hooks are read when a session starts.Check: nothing to run here — the two coverage lines in the next step are what say
whether the restart took effect.
6
Confirm what is covered
packages/visiq-claude-cowork-harness/__tests__/readme.e2e.test.ts
builds exactly the state it depicts, runs the built CLI against it, and
requires this page — and the package README — to match what came back. Only the
four absolute-path values are exempt (they differ per machine and per OS); every
label, every count and the version are bound.ENFORCED is claimed only when BOTH are true: a VisIQ hook is wired under
PreToolUse and the dispatcher: line resolved to a real executable. Hooks
present in settings.json with a dispatcher missing from your PATH mean tool
calls run ungoverned, and status says exactly that instead.this process: is the surface the command itself is running on — not a
coverage line. Run from a normal shell it reads unknown (cannot enforce),
because the visiq-claude-cowork process has no claude binary in its own
ancestry to classify; run from inside a sandboxed session it reads
Claude Cowork (VM sandbox) (cannot enforce). Neither says anything about
whether your Cowork sessions are governed — the two coverage lines below it do.Monitoring sandboxed sessions
Enforcement is not available inside the sandbox, but visibility is. Run the monitor to report every sandboxed tool call to VisIQ:mcp__*
tools), the arguments, the model, session and tool-call ids, sub-agent parentage
and the observation timestamp — each stamped with its surface and mode: "monitor".
It also reports the sandbox’s own permission decisions. Cowork asks you to
approve a tool call and writes both halves of that exchange: the request (tool
name and arguments) and your answer — granted, and whether you allowed it
once or always. Denials and standing grants are therefore visible, not
inferred.
An observed call is not a call that ran
Every observation carriescowork.execution so the two are told apart:
Already running the Claude Code harness?
Then your host-local Cowork sessions are already governed. Cowork reads the same~/.claude/settings.json as the Claude Code CLI, so
@visiq/claude-cowork-harness installs the same visiq-claude-code-hook
dispatcher rather than a second one — two dispatchers over one file would
double-evaluate every tool call. Installing this package adds the Cowork surface
labelling and the sandbox monitor.
Fail posture
Agent-side, the harness fails open by default: if VisIQ itself cannot answer — no credentials, endpoint unreachable, no rule bundle — the agent keeps working and the failure is reported loudly. A policydeny always blocks. Opt into
strict fail-closed with VISIQ_FAIL_MODE=closed.
Commands
This table is not hand-maintained.
packages/visiq-claude-cowork-harness/__tests__/usage.test.ts derives every
signature from the CLI’s own flag table and requires this page — and the package
README — to match it, so a flag the CLI accepts and this page omits reds a test
rather than shipping. It had: status --settings, status --command and
uninstall --command are all accepted and acted on, and none was documented.