Changelog¶
All notable changes to the collectors are recorded here. The sh and
PowerShell collectors share one version, printed by --version and
-Version and recorded in collection.json. Changes to the manifest
(manifest.jsonl fields and status values) and to collection.json are
called out, since analysts and the analyzer depend on them.
The format follows Keep a Changelog.
Unreleased¶
1.21.0 - 2026-10-30¶
Added¶
- Hermes' remaining credential stores are flagged
secret: truein every home and profile (.hermes*/andAppData/Local/hermes*/): the config writers'config.yaml.*copies,bot-desktop/*,webapp/*,feishu_comment_pairing.json,workspace/meetings/node_token.jsonand the OS credential directories.ssh/*,.aws/*,.gnupg/*,.kube/*,.docker/*,.azure/*,.config/gh/*,.config/gcloud/*and.envrc; in a Hermes volume, whose_datais the container user's home, the volume-relativeconfig.yaml.*,bot-desktop/*,webapp/*,feishu_comment_pairing.json,workspace/meetings/node_token.json,.ssh/*,.aws/credentials,.aws/config, the AWS CLI credential cache.aws/cli/cache/*.json,.gnupg/*,.kube/*,.docker/*,.azure/*,.config/gh/*,.config/gcloud/*,.envrcand the quick snapshots'state-snapshots/*/config.yamlandstate-snapshots/*/feishu_comment_pairing.json(#326).
Fixed¶
- The volume-relative secret glob
profiles/*of OpenHands' LLM profiles is narrowed toprofiles/*.json, withprofiles/tmp*.tmpfor the temporary file an interrupted profile save leaves: it applied in every volume, so in a Hermes volume it flagged every file of every named profile,state.dband transcripts included, and--no-secretsskipped them; a Hermes volume profile's credentials are flagged by profile-scoped globs instead, oneprofiles/*/<glob>per Hermes volume secret glob (profiles/*/.env,profiles/*/auth.json,profiles/*/config.yamland the rest, with the AWS SSO and CLI cachesprofiles/*/.aws/sso/cache/*.jsonandprofiles/*/.aws/cli/cache/*.json), which also reach the profile's quick snapshots (#326).
1.20.0 - 2026-10-29¶
Added¶
- Claude Code's
.claude/settings.jsonand.claude/settings.local.json, in the home and in a project, and a project's.mcp.jsonare flaggedsecret: true: they can hold MCP serverenvandheadersvalues,env.ANTHROPIC_API_KEYandapiKeyHelper(#248). - Gemini CLI's
settings.json, whosemcpServersentries takeenvandheadersvalues, is flaggedsecret: truein.gemini,.cache/.geminiand a project's.gemini(glob*.gemini/settings.json) (#317). - Antigravity's shared
.gemini/config/mcp_config.jsonis flaggedsecret: true(#248). - Copilot CLI's
.copilot/settings.json(a sandbox proxy password), the MCP secret store.copilot/mcp-secrets/, the pre-migration.config/.copilot/config.json,mcp-config*andmcp-oauth-config*, and a project's.github/copilot/settings.json,.github/copilot/settings.local.jsonand.github/mcp.jsonare flaggedsecret: true(#248). - A project's
.vscode/mcp.jsonis flaggedsecret: true, like the editor'sUser/mcp.json(#248). - Cline's legacy MCP settings file in the editor's extension storage,
*/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json, is flaggedsecret: true(#248). - Roo Code's MCP settings file (
settings/mcp_settings.jsonand its pre-migration namecline_mcp_settings.json) in the extension's storage and in the CLI's.vscode-mock/global-storage/settings/, and a project's.roo/mcp.json, are flaggedsecret: true(#248). - A project's root
opencode.jsonandopencode.jsoncare flaggedsecret: true, like the.opencode/copies (#248). - Amp's
.config/amp/settings.jsonand itssettings.jsoncfallback, and a project's.amp/settings.jsonand.amp/settings.jsonc, are flaggedsecret: true: theiramp.mcpServersentries takeenvandheadersvalues (#248). - Factory Droid's
.factory/settings.json,.factory/settings.local.jsonand.factory/mcp.json, in the home and in a project, are flaggedsecret: true(#248). - Kiro's agent files
.aws/amazonq/cli-agents/*.jsonand a project's.amazonq/cli-agents/*.json, and a project's legacy.amazonq/mcp.json, are flaggedsecret: true(#248). - OpenHands' per-conversation
acp/codex/auth.jsonis flaggedsecret: trueunder.openhands/and, volume-relative, underconversations/andagent-canvas/of an OpenHands volume (#248). - little-coder's
.little-coder/mcp.jsonof the v0.0.x releases is flaggedsecret: true(#248). - Hermes'
config.yaml, whosemcp_serversentries takeenvandheadersvalues, is flaggedsecret: truein every home and profile (.hermes*/config.yaml,AppData/Local/hermes*/config.yaml) and at a Hermes volume's root (#248). - Langflow's per-user
_mcp_servers_<id>.jsonis flaggedsecret: truein the platformdirs cache directory Langflow uses as its config directory (.cache/langflow,Library/Caches/langflow,AppData/Local/langflow/langflow/Cache) and, as[0-9a-f]*-*-*-*-*/_mcp_servers_*.json, in a Langflow volume (#248). - CLAI's
.config/pydantic-clai2/mcp.jsonand a project's.clai/mcp_servers.jsonare flaggedsecret: true(#248). - Ollama's copies of other agents' settings files,
.ollama/backup/*and.ollama/launch/muse-config/muse/settings.json, are flaggedsecret: true, and so are their volume-relative formsbackup/*andlaunch/muse-config/muse/settings.jsonin an Ollama volume, whereollama launchrun throughdocker execwrites them (#320). - A project's Crush configuration files
crushrc,.crushrc,crush.jsonand.crush.jsonare flaggedsecret: true(#323). - Project discovery reads Crush's Windows project list,
AppData/Local/crush/projects.json, beside.local/share/crush/projects.json; the PowerShell collector maps itsC:\paths into the image, the sh collector uses only the/paths it holds (#323).
Changed¶
- Hermes' Electron caches are excluded in suffixed user-data directories too (
.config/Hermes*/Cacheand theCode CacheandGPUCacheforms, on every OS), and so is the desktop updater's download cacheAppData/Local/hermes-updater, which the suffixed-home line reaches (#324). - Hermes' installer checkout is excluded in suffixed homes and profiles too (
.hermes*/hermes-agent/[!.]*,.hermes*/hermes-agent/.[!e]*and theAppData/Local/hermes*/hermes-agent/forms), keeping the checkout's.env(#324).
Fixed¶
- Hermes homes and desktop user-data directories with a
HERMES_DATA_DIR_SUFFIXare collected: the suffix is appended with no separator (.hermes-channel-build-canary), so the catalog lines are.hermes?*,AppData/Local/hermes?*andHermes?*user-data directories instead of.hermes_*andAppData/Local/hermes_*, and the desktop connection files are flagged in each (#324). windsurf|AppData/Roaming/devinis replaced by the Devin CLI'sAppData/Roaming/devin/mcp_config.jsonandAppData/Roaming/devin/credentials.toml, so on a case-insensitive disk, where that directory is the Devin IDE'sAppData/Roaming/Devin, the whole IDE user-data directory is no longer collected under this line, and on a case-sensitive disk only those two CLI files are (#321).- Factory Droid's environment dumps
.factory/temp/env/*are collected and flaggedsecret: true: the.factory/tempexclusion, which hid them, is narrowed to.factory/temp/[!e]*(#322).
Removed¶
- The exclusions no catalog line reaches: Amp's
.cache/amp/runner-desktop,.cache/amp/desktop,.cache/amp/binand.cache/amp/obelisk-runs, Ollama'sLibrary/Caches/ollamaandLibrary/Caches/com.electron.ollama, and Windsurf'sAppData/Local/devin/bin(#322, #321).
1.19.0 - 2026-10-28¶
Added¶
- The GitHub CLI login store,
.config/gh/hosts.ymlandAppData/Roaming/GitHub CLI/hosts.yml, is collected under thesharedcatalog agent (the cross-agent block) and flagged as a credential (secret: true): it names the GitHub account an agent acted as and holds the token whenghhad no OS credential store (#256). - The git metadata of every discovered or
-pproject is collected asproject:.git/HEAD,.git/config,.git/FETCH_HEAD,.git/packed-refs,.git/refs,.git/logsand.git/worktrees, which name the checked-out branch, the remotes with their fetch and push URLs, the last fetch, the branches and tags, the reflog and the linked worktrees; the object store, index, hooks, LFS objects and submodule repositories are not collected, each linked worktree's staging area andmodules/are excluded (.git/worktrees/*/index,.git/worktrees/*/index.lock,.git/worktrees/*/sharedindex.*,.git/worktrees/*/modules, askipped_excludedrow each), and.git/configis not flaggedsecretalthough a remote URL can carry a token (#253). - Claude Code's Windows temp root,
AppData/Local/Temp/claude, with each session'sscratchpad/and thetasks/<id>.outputfiles of background commands and subagents, is collected asclaude-code(observed with Claude Code 2.1.309 on Windows 11, October 2026) (#256). - A project's
.git/info/exclude, which Claude Code rewrites with patterns for its own files, is collected asproject(#256). - Claude Code's session daemon files
.claude/daemon/control.key,.claude/daemon/pipe.keyand.claude/daemon/roster.json, and the.claude.jsoncopies in.claude/backups/(.claude.json.backup.<epoch>and.claude.json.corrupted.<timestamp>, glob.claude/backups/.claude.json.*), are flaggedsecret: true(#256). - The older home-level
.claude.json.backup*files, which the.claude.json*catalog line collects and which hold the same account and MCP server settings as.claude.json, are flaggedsecret: true, in the home and in a~/.claude-<name>config home (#256). - A
~/.claude-<name>config home's session keys, session daemon files and.claude.jsonbackups are collected and flaggedsecret: truethrough catalog lines of their own,.claude-*/sessions/*.*.key,.claude-*/daemon/control.key,.claude-*/daemon/pipe.key,.claude-*/daemon/roster.jsonand.claude-*/backups/.claude.json.*, since such a home is collected only by its Claude-specific names and a secret glob alone collects nothing (#256). .claude/plugins/plugin-directory-cache*, Claude Code's downloaded copy of the plugin directory, is excluded (#256).- Claude Code's
.local/state/claude, whoselocks/<version>.locknames the process ID, binary path and version of a running session, and.cache/claude, itsstaging/directory, are collected asclaude-code, at the same paths under the home on Linux and Windows (observed with Claude Code 2.1.310 on Ubuntu 26.04, October 2026) (#256). - Claude Code's macOS URL handler,
~/Applications/Claude Code URL Handler.app, which registers theclaude-cli:URL scheme and whose executable is a symbolic link to~/.local/bin/claude(recorded as asymlinkrow), is collected asclaude-code(observed with Claude Code 2.1.310 on macOS 26.6, October 2026) (#256). - Claude Code's
.claude/ide/<port>.lock, the editor connection file that holds anauthTokenwhile an IDE session runs, and.claude/bridge-spawn/<id>/mcp.json, the Remote Control bridge's definition of its remote MCP server with session-bound headers, are flaggedsecret: true; a~/.claude-<name>config home's copies are collected through catalog lines of their own,.claude-*/ide/*.lockand.claude-*/bridge-spawn/*/mcp.json, and flagged too (#256).
Changed¶
- Claude Code's
.claude/paste-cacheis no longer excluded: it holds the text of each long pasted prompt, whichhistory.jsonlnames only by hash (#256). - The comment lines of the catalog tables, which
--listand-Listprint, are shorter: each names what its lines cover and the research document to read, without issue numbers, dates or build histories. No catalog line changed (#277).
1.18.0 - 2026-10-21¶
Added¶
- Catalog lines and secret globs from the 2026-10-19 source review's issues, taken from each agent's source; the real-install rounds that confirm them are still owed.
- A project's
.crewaidirectory (CrewAI'slast_run.json, the record that a run's trace reached AMP, and thecrewai evalstate) is collected ascrewai(#223). - The CLAI 2.0 state directory
.local/state/pydantic-clai2(the web orchestrator conversation, workspace records and logs) is collected aspydantic-clai; its workspaces' clones of remote repositories are excluded, and each workspace'stokenis flaggedsecret: true(#225). - difyctl's
login-pending.yml, a pending OAuth device login, is flaggedsecret: truein.config/difyctl,AppData/Roaming/difyctlandAppData/Local/difyctl(#224). - Sourcegraph Cody's JetBrains plugin files are collected:
options/cody*.xmlin each JetBrains IDE,~/.sourcegraph, and a project's.idea/cody_history.xmland.idea/.sourcegraph; the account listoptions/cody_accounts.xmlis flagged secret, since itscustomRequestHeaderscan carry proxy credentials, and so areoptions/cody.xml,~/.sourcegraph/cody_settings.jsonand a project's.idea/.sourcegraph/cody_settings.json, whosecody.mcpServersentries carry MCP serverheadersandenv(#214). - The Agent Zero WhatsApp bridge's login state
tmp/whatsapp/session/is flagged secret, in home, Desktop and volume forms; the A0 CLI connector's computer-use screen captures inAppData/Local/Temp/_a0_connectorare collected on Windows (#217). - Project discovery reads Agent Zero editor (ACP) chats'
acp_cwdandacp_additional_directories(#217) and archived Codex threads in~/.codex/archived_sessions(#222). - A discovered nanobot workspace's
cron/jobs.json,cron/runs/,triggers/triggers.jsonandtriggers/runs/are collected (#220). - The OpenCode desktop app's data directory is collected, with its
compile cache excluded, and so is the Windows temp root
AppData/Local/Temp/opencode; OpenCode'sservice.jsonandservice-<channel>.jsonare flagged secret (#213). - Kilo Code's
kilo-sandbox-policyandkilo-sandbox-preferencedirectories are collected (#221). - OpenHands Agent Canvas
mars-credentials.json(DigitalOcean connections) is flagged secret on macOS, Linux and Windows (#218). - Qwen Code's running-session registry
~/.qwen/sessions/<pid>.json, which holds the session'sipcToken, is flagged secret (#230). ~/.roo/cli-credentials.json, the Roo Code CLI's cloud token in releases up to 3.53.0, is flagged secret (#159).- The twinny-server forge plugins'
plugins/<id>/repos.json, which holds saved access tokens, is flagged secret (#215). -
The Hermes desktop app's
connection.jsonandconnections.json, which hold a remote gateway's token, are flagged secret (#208). -
An exclusion for Cursor's plugin cache,
.cursor/plugins/cache, recorded asskipped_excludedwith its size. It holds the marketplace copy of each installed plugin (<marketplace>/<plugin>/<sha>/with.cursor-plugin/plugin.json,mcp.json, a README, a licence and assets), which can be downloaded again, as the Claude Code and Codex plugin caches already excluded can. Which plugins were installed stays collected, instate.vscdband in the per-project.cursor/projects/<project>/mcps/plugin-<name>-<server>/manifests (#236). - An exclusion for the copy of Cursor's Windows updater,
*/Cursor/update-supervisor/*/inno_updater.exe(3.4 MB), recorded asskipped_excludedwith its size. Cursor's update to 3.26.16 on Windows (October 2026) wrote it intoupdate-supervisor/win32/<installationId>/besideapp-ready.jsonandstate.json, which stay collected; it is a copied binary that the macOS supervisor exclusion did not cover (#236).
Changed¶
- The Linux catalog line for Cursor's agent sync stores now names where
the Cursor IDE writes them, the XDG state directory
.local/state/cursor/agent-stores(the per-account and per-conversationcursor_agent_stores/<id>/stores and the.control/<id>/pins/of the open conversations), in place of.config/Cursor/AgentStores, which matched nothing. Cursor 3.25.9 from the Ubuntu deb (October 2026) wrote the stores there, so collector 1.17.0 left them out on Linux.--list(-List) prints the new line (#236). - The Windows catalog line for Cursor's agent sync stores now names
AppData/Local/Cursor/AgentStores, where Cursor 3.26.13 (Windows 11, October 2026) writes them, in place ofAppData/Roaming/Cursor/AgentStores, which matched nothing, so collector 1.17.0 left them out on Windows.--list(-List) prints the new line (#236). - The sh collector tests a file against the credential globs with one
compiled pattern instead of one test per glob, so a collection whose
workers run under bash, posh or a BSD sh is faster. The manifest is
unchanged: the same files are flagged
secret: trueorskipped_secret(#242). - Gemini CLI
--worktreecheckouts (.gemini/worktrees) and Qwen Code worktrees (.qwen/worktrees) are excluded, in a home and inside a project (#216). - OpenClaw's Gateway repository clones (
projects/<16 hex>/<name>) are excluded, and the volume-relative forms of the clone,plugin-skillsand agenttmpand.tmpexclusions are added (#219). - OpenHands
~/.openhands/workspaces(Canvas-in-Docker automation runs) is excluded by default, likeagent-canvas/workspaces(#218). - Hermes quick snapshots (
state-snapshots/) are collected instead of excluded; their.env,auth.jsonand pairing copies stay flagged, in volumes too (#123). - Twinny's per-workspace extension storage
(
workspaceStorage/<id>/rjmacarthy.twinny, theagent-changes/records) is attributed totwinnyinstead of the editor (#215). - Project discovery no longer takes a Codex or Open Interpreter thread
worktree (
.codex/worktrees,.openinterpreter/worktrees) for a project (#222).
Fixed¶
- OpenClaw's legacy
exec-approvals.json(the approvals socket token),~/.openclaw-auth-profile-secrets/and a volume-rootexec-approvals.jsonare flaggedsecret: true(#219).
Removed¶
- The secret glob
.config/crush/.crushrc, which matched a file Crush never reads (#231).
1.17.0 - 2026-10-20¶
Added¶
- Catalog lines for two more Cursor directories in the editor's
user-data directory (
Library/Application Support/Cursor,.config/CursorandAppData/Roaming/Cursor), collected ascursor:AgentStores, the sync stores of the agent's files per account and per conversation, with the pins of the open conversations, andupdate-supervisor, one directory per in-app update whoseevents.jsonl,result.jsonandapp-ready.jsonrecord which build ran from when.--list(-List) prints the six lines (#6).
Changed¶
- Four Cursor subtrees are excluded by default and recorded as
skipped_excludedwith their size, where they were collected before: the copy of the Cursor Agent CLI that the IDE's agent worker runs,*/User/globalStorage/anysphere.cursor-agent-worker/agent-cli(608 MB on a macOS install, almost all of that install's collected bytes), the update supervisor binary*/Cursor/update-supervisor/*/cursor-update-supervisor, the canvas type declarations.cursor/projects/*/canvases/node_modulesand the feature-flag cache.cursor/statsig-cache.json.--full(-Full) still collects them (#6).
1.16.0 - 2026-10-19¶
Added¶
- A
codex-cli|Documents/Codexcatalog line: the ChatGPT desktop app's projectless output directories,Documents/Codex/<date>/<slug>withwork/andoutputs/inside, where the bundled Codex runs a thread that has no project, are collected whole and attributed tocodex-cli, so the files the agent wrote there are in the archive; exclusions, the size limit and the secret globs apply as everywhere, and--list(-List) and the inventory evidence print the glob (#149).
Changed¶
- Project discovery drops a Codex rollout
cwdthat is<home>/Documents/Codexor lies under it, so a projectless output directory is no longer listed incollection.jsonprojectsor used as a project base (before 1.16.0 it was, and only its project-catalog files were collected) (#149).
1.15.0 - 2026-10-19¶
Added¶
- A secret glob for Codex's shell snapshots,
.codex/shell_snapshots/*(#160). Codex, and Codex Desktop inside the ChatGPT app, writes a<thread uuid>.<unix ns>.shfile at each resume and turn of a live thread (the two most recent per thread were kept) with the user's exported login-shell environment, so an API key the shell exports is copied into it. The files are now flaggedsecret: trueand skipped with--no-secrets(-NoSecrets), and--list(-List) prints the glob; 1.14.0 collected them unflagged.
1.14.0 - 2026-10-18¶
Added¶
- Secret globs for credential files the session sync research found
collected without the flag (#153); each is flagged
secret: trueand skipped with--no-secrets(-NoSecrets), and--list(-List) prints them: - nanobot's remote WebUI pairing keys,
.nanobot*/webui/remote-pairing/*/identity(an unencrypted OpenSSH private key) and.nanobot*/webui/remote-pairing/*/exchange(an X25519 private key). - Agent Zero's plugin configuration, which holds the Telegram bot token:
agent-zero*/usr/plugins/*/config.json,Desktop/agent-zero*/usr/plugins/*/config.jsonand, in a Docker volume,plugins/*/config.jsonandusr/plugins/*/config.json. - Cline's cached organisation remote config, which holds the prompt
upload bucket's access keys,
*/User/globalStorage/saoudrizwan.claude-dev/cache/remote_config_*.json, and its webhook configuration,Documents/Cline/webhook_config.json. - Gemini CLI's
/bug-memoryheap snapshot of the CLI process,*.gemini/tmp/*/bug-memory-*.heapsnapshot. - little-coder's legacy
.little-coder/config.json, which holds a GitHub token. - Qwen Code's channel credentials,
.qwen/channels/*-credentials.jsonand.qwen/channels/weixin/account.json.
Changed¶
- Qwen Code's secret glob
.qwen/channels/*.jsonis replaced by the two credential globs above. It flagged every file underchannels/, including thesessions.jsonanddaemon/<hash>/routes.jsonrouting tables, which--no-secretsthen left out; those are now collected unflagged in both modes (#153). - Cline's VS Code extension
cache/directory (*/User/globalStorage/saoudrizwan.claude-dev/cache) is no longer excluded. It holds the cached remote config andsync-queue.json, the queue of task files uploaded or waiting to be uploaded to the organisation's storage bucket, and nothing large (#153). - Kilo Code's log directory
.local/share/kilo/logis no longer excluded: its session service lines (creating session,sharing,unsharing,removing share) are the only local record of a deletion whose remote delete failed (#153).
1.13.0 - 2026-10-17¶
Added¶
- Manifest status
skipped_specialfor a special file: neither a regular file, a directory nor a symbolic link, such as the Unix domain sockets Codex CLI 0.162.1 keeps under.codex. The file is never opened or copied; the row keeps its size, times andsecretflag and has an emptyarchive_path,sha256,targetanderror. This is a new status value inmanifest.jsonl(#120). - Manifest
typevalues for askipped_specialrow:socket,fifo,device(block or character) andother. The sh collector names the kind withtest -S,-p,-band-c; the PowerShell collector names it fromUnixModeunder PowerShell 7.1 and later on Linux and macOS, and records a Windows reparse point that is neither a symbolic link nor a junction (an AF_UNIX socket) asother(#120). -
collection.jsoncounts.skipped_special, betweenskipped_secretanderror_copyin both collectors (#120). -
GitHub Copilot Desktop (the Tauri app, dpkg package
github, 1.1.29 on a real Linux install) is a new catalog agent,copilot-desktop. The app runs its sessions through a bundled Copilot CLI that writes them to.copilot/session-statein the CLI's format, so those staycopilot-cli; nested entries inside.copilotclaim the app's own files:data.db*,repo-metadata-cache.db*,chats,repos,run,media-cache,canvas-catalog-probeandlogs/github-app.*.log. The app's data directory (.local/share/com.github.githubapp,Library/Application Support/com.github.githubapp,AppData/Roaming/com.github.githubapp) and Foundry Local's.github-copilot-cliare collected ascopilot-desktoptoo (#147). - Exclusions for Copilot Desktop:
.copilot/repos(the working trees of the repositories the app clones and their worktrees; which ones were added is recorded indata.db), the bundled skills underapp-skills, and on Linux the web view cachesWebKitCacheandCacheStorageof the app's data directory. Each clone's.gitdirectory is its own entry,.copilot/repos/*/.git, collected ascopilot-desktopless its object store and index (.copilot/repos/*/.git/objects,.copilot/repos/*/.git/index), so the checkpoint refs underrefs/copilot/checkpoints,packed-refs,logs,HEAD,configandworktreessurvive a deleted session in the archive (#147). - Secret glob
.copilot/run/*.token: the app's local WebSocket auth tokensws.tokenandws.release.token(#147). - Copilot Desktop on Windows (1.1.30 on a real install): the WebView2 user
data folder
AppData/Local/com.github.githubapp, where the Windows build keeps the web view's Local Storage (the composer draft and tab lists), is collected ascopilot-desktop(#147). - Exclusions for that folder's Chromium caches and downloaded components,
under
AppData/Local/com.github.githubapp/EBWebView/:Default/Cache,Default/Code Cache,Default/GPUCache,Default/DawnGraphiteCache,Default/DawnWebGPUCache,Default/blob_storage,Default/Shared Dictionary,GrShaderCache,ShaderCache,GPUPersistentCache,component_crx_cache,extensions_crx_cache,WidevineCdm,Subresource Filter,hyphen-data,PKIMetadata,CertificateRevocationandBrowserMetrics-spare.pma; at least 71.4 MB of the folder's 72.6 MB on the install (#147). - Secret globs for that folder's
Local State(Chromium's profile key, wrapped with DPAPI),Default/Network/Cookies*andDefault/Login Data*, as for ChatGPT Desktop's Chromium profile (#147). - Exclusion
.copilot/chats/*/node_modules: the dependency tree of a project the agent builds in a Copilot Desktop chat's working directory (3,411 files and 14.7 MB on the Windows install); the files the agent wrote there stay collected (#147). - Exclusions
.cache/copilot/marketplaces,Library/Caches/copilot/marketplacesandAppData/Local/copilot/marketplaces: the Copilot CLI's git clones of plugin marketplaces (263 MB and 4,560 files on the Windows install). Theskipped_excludedrow keeps the size; which marketplaces were cloned is inside and is not collected without--full(#131).
Changed¶
- The stdout
skipped:line ends with the number of special files:skipped: N excluded, N too large, N secret, N special(#120). - The sh walk gives every path that is not a directory to the stage
worker (
find ! -type d), not only regular files and symlinks, so a socket or FIFO under a matched directory gets askipped_specialrow instead of no row at all.--inventorystill counts regular files only (#120). - The PowerShell collector records a Windows reparse point as
symlinkonly when itsLinkTypeisSymbolicLinkorJunction. Up to 1.12.0 every reparse point was asymlink, so an AF_UNIX socket under.codexgot asymlinkrow whosetargetwas its own path and was recreated in the archive as a link to itself (#120). - Project discovery skips a Copilot CLI session
cwd(from.copilot/session-state/*/workspace.yaml) that lies under the same home's.copilotdirectory: Copilot Desktop's per-chat directories under.copilot/chatsand its worktrees under.copilot/reposwere listed as projects (#147). - Project discovery reads a Copilot CLI session's
workspace.yamlcwdonly when the session directory has anevents.jsonl. Copilot Desktop pre-creates pool and probe sessions that are never prompted and have none; on Windows theircwdis the app's install directory,AppData/Local/Programs/GitHub Copilot, which was listed as a project (#147).
1.12.0 - 2026-10-15¶
Added¶
- The Antigravity desktop app's Electron user-data directory is collected
whole as
antigravity:Library/Application Support/Antigravity,.config/AntigravityandAppData/Roaming/Antigravity, which replace the pre-2.0Userandlogslines for the same directories. The 2.x app (2.23.0, macOS, checked on a real install) has neither subdirectory; on Linux and Windows its logs are in thelogs/child, which the whole-directory line still covers (#83). Library/Logs/Antigravity, the desktop app's macOS logs directory (main.log,language_server.log), is collected asantigravity(#83).- Antigravity plugin OAuth credentials,
.gemini/antigravity*/plugin_data/<plugin>/token.json(the Google Docs plugin writes one), are flaggedsecret: true(#84). - The Antigravity CLI's file secret store
plugin-secrets.json, which CLI 1.3.4 uses for plugin credentials when no OS keychain is available, is collected asantigravityand flaggedsecret: true:.config/antigravity/plugin-secrets.json(named in the CLI's own log on Linux),Library/Application Support/antigravity/plugin-secrets.jsonandAppData/Roaming/antigravity/plugin-secrets.json. The secret globs acceptAntigravityas well, since on a case-insensitive filesystem the file shares the desktop app's Electron user-data directory (#90). AppData/Local/antigravityis collected asantigravity: the Windows counterpart of.cache/antigravity, the plugin marketplace staging directory under Go's user cache directory, which the desktop app 2.23.1 created (empty) on a Windows 11 install. The installer'sAppData/Local/antigravity-updaterand the app's program directoryAppData/Local/Programs/antigravityare not matched (#83).- The ChatGPT desktop app's Windows package, renamed
OpenAI.Codexby October 2026 (ChatGPT 26.1007.9446.0 from the Microsoft Store, checked on a real Windows 11 install), is collected aschatgpt-desktop. The app is now a Chromium build, and the collector found none of it, since the catalog named only the oldOpenAI.ChatGPT-Desktop_*package. The new lines, underAppData/Local/Packages/OpenAI.Codex_*, name the browser profileLocalCache/Roaming/Codex/web/Codex/Default(with its storage partitions underDefault/Partitions) and the files beside it (Local State,Last Version,statsig-state.json,.codex-tpp-local-executor-installation-id) rather than the whole user-data directory, so its Chromium component data (about 160 MB on the install) is not walked; and the app's own log directoryLocalCache/Local/Codexand the package'sSettingshive. The old package lines stay for older installs (#113). - The new ChatGPT profile's credential stores are flagged
secret: true:Network/Cookies*andLogin Data*inDefaultand in eachDefault/Partitions/<partition>, and the user-data directory'sLocal State, which holds the DPAPI-wrapped key that decrypts them (#113). .codex/.codex-global-state.jsonand its.bakcopy, which the Codex inside the ChatGPT desktop app writes, are flaggedsecret: true: they hold ChatGPT conversation resume tokens and the user's prompt history (#115).- The ChatGPT desktop app on macOS is collected as
chatgpt-desktop. Since 26.1007 (26.1007.71326, checked on a real macOS 26.6.2 install) it is the same Electron build as on Windows, with the bundle idcom.openai.codex, and none of the earliercom.openai.chatpaths exist, so the collector found none of it. The new lines name the Chromium profileLibrary/Application Support/Codex/Defaultand the files beside it (Local State,Last Version,statsig-state.json,.codex-tpp-local-executor-installation-id,browser-sidebar-page-states.json), the app'sexecutor-plugins(a bundled MCP server) andartifact-sessionsdirectories,Library/Application Support/com.openai.codex.installer(install identifiers), the log directoryLibrary/Logs/com.openai.codex, thecom.openai.codex,com.openai.codex.installerandcom.openai.sky.CUAServicepreferences, theHTTPStoragesstores and binary cookies ofcom.openai.codexandcom.openai.sky.CUAService(the computer-use service), and the computer-use group containerLibrary/Group Containers/2DC432GLL2.com.openai.sky.CUAService. Thecom.openai.chatline stays for the former native app (#121). - The macOS profile's
Cookies*andLogin Data*, inDefaultand in eachDefault/Partitions/<partition>, and the two.binarycookiesfiles are flaggedsecret: true(#121).
Changed¶
- The Antigravity
bin/exclusion covers every.geminidata directory (antigravity,antigravity-cli,antigravity-ide,antigravity-backup), not only the CLI's, so the desktop app's binaries in.gemini/antigravity/binget oneskipped_excludedrow (#83). - Plugin binaries under
.gemini/antigravity*/plugin_data/<plugin>/binand the plugin marketplace cache.gemini/antigravity*/cache/marketplacesare excluded; the rest ofcache/is still collected (#83). - The Chromium caches in the Antigravity Electron user-data directory are
excluded:
Cache(named under each of the three locations, since the PowerShell match ignores case and*/Antigravity/Cachewould also prune.gemini/antigravity/cache),Code Cache,GPUCache,DawnGraphiteCache,DawnWebGPUCache,blob_storage,Shared Dictionary,CachedDataandCrashpad(#83). - The Antigravity Electron user-data directory's
Dictionaries(Chromium's spell-check dictionary, 452 KB on Linux), the sidecar SDK the desktop app installs under.gemini/antigravity*/lib/node_modules, and its copy under.gemini/config/node_modulesare excluded (#83). - Manifest change: files collected from a project directory now carry the
agent that owns them in the manifest
agentfield (claude-codefor a project's.claude/andCLAUDE.md,cursorfor.cursor/,aiderfor.aider.chat.history.md,little-coderfor.pi/approved-plan.mdinside pi's.pi/), taken from thePROJECT_CATALOGtable that--listprints. Files several agents read (AGENTS.md,AGENTS.override.md,AGENT.md,.agents/,.mcp.json,.github/copilot-instructions.md,.github/git-commit-instructions.md,.github/instructions/,SOUL.md,USER.md) keep the agentproject, which until now every project row had (#104). - Both collectors are reorganised for readability: the same twelve
sections in the same order, a reader's guide at the top, a comment on
every function, the long functions split by step, and matching names
for the sh and PowerShell functions that do the same step (listed in
docs/internals.md). Options,
--listoutput, the manifest,collection.json, the log, stdout, the archive and the exit codes are unchanged (#99). - The Chromium caches of the ChatGPT desktop profile are excluded, in
Defaultand in everyDefault/Partitions/<partition>:Cache,Code Cache,GPUCache,DawnGraphiteCache,DawnWebGPUCache,blob_storage,Extensions(a bundled extension's code) andService Worker/CacheStorageandScriptCache(#113). .codex/plugins/.plugin-appserver, where the ChatGPT desktop app copies the Codex binaries (codex.exe, 283 MB, and three helpers of 7 to 70 MB that were collected), and the empty staging directory.codex/plugins/.remote-plugin-install-stagingare excluded (#116).Library/Application Support/com.openai.codexis attributed tochatgpt-desktopinstead ofcodex-cli: the bundle id that owns it is now the ChatGPT app, which bundles Codex (#121).- The Chromium caches of the macOS ChatGPT profile are excluded, in
Defaultand in everyDefault/Partitions/<partition>, as on Windows, and so is the bundled MCP server's scriptexecutor-plugins/<plugin>/server.mjs(949 KB). The computer-use app bundle the app copies into.codex/computer-use/(Codex Computer Use.app, 77 MB) is excluded with.codex/computer-use/*.app; itsconfig.jsonis still collected (#121).
Fixed¶
- Project discovery in the sh collector now matches
file://URIs. From 1.3.0 the pattern required a slash afterfile:///, so no URI ever matched: the Antigravity desktop app's project folders in.gemini/config/projects/*.json(folderUri) were never discovered, nor was afile://URI in the other files read the same way (the Antigravity CLI'ssettings.jsonandcache/projects.json, Kiro'ssession.json, Goose'srecent-dirs.jsonand Twinny's embedding manifests); plain absolute paths in them were unaffected. A Windows URI (file:///C:/x, alsofile:///c%3A/x) now yields the drive-relative/x, which image mode prefixes with the root, as the PowerShell collector already did (#91). - The sh collector's home patterns (
home/*,Users/*,usr/home/*,export/home/*) are expanded under the root only. Since 1.0.0 the shell expanded them against the current directory first, so in image mode, run from a directory with ahomeorUserssubdirectory (/on macOS), the homes found only by those patterns were lost: a Windows image yielded no users, and a Linux image only those in itsetc/passwd(#105). - The sh collector clears its list of claimed paths (
NESTED_CLAIMS, the subtrees that nested catalog entries collect) at startup. The Docker and Podman volume walks read it without setting it, so a value in the environment the collector was started with pruned the paths it named from every matched volume, with no manifest row (#106). - The sh collector tests a catalog match that is a file, not only a
directory, against the exclusions: an excluded file match now gets one
skipped_excludedrow with its size instead of being collected, and--inventoryno longer counts it, as in the PowerShell collector. A file named.local/bin/.muse-update.<suffix>, matched by the Muse Code catalog line.local/bin/.muse-*and by the exclusion.local/bin/.muse-update.*, was collected whole.--fullstill collects it (#107). - The PowerShell collector reports an
-OutputDirthat is a file, or lies under one, asCannot create output dir: <dir>and exits 2, as the sh collector does.New-Itemneither fails nor creates the directory there, so a path under a file went on to print aResolve-Patherror, aProviderPatherror from strict mode and thenOutput dir not writable: <dir>, and a path that is a file printed the last message alone (#108). - The sh collector no longer expands the exclusion globs, or the claimed
paths of nested entries, against its working directory. Run from a
directory holding paths that a wildcard exclusion matches (a home with
.claude/plugins/<name>/node_modules, say), the glob was replaced by those paths and stopped matching the collected homes, so their trees under it were collected instead of getting oneskipped_excludedrow (#109). - The sh collector unsets
CDPATHat startup. WithCDPATHin the environment, a relative-ror-owas looked up in theCDPATHdirectories first, andcdprinted the directory it chose, so the root or output directory could become a same-named directory elsewhere, recorded as a two-line path (#110). - The PowerShell collector records a
collectedrow'ssizeas the number of bytes it copied, the length thesha256covers. It used the file's length from the directory listing, which NTFS updates only when a handle on the file closes, so for a file a running app holds open and writes the manifest could say0or32bytes beside an archived copy of 218,747 or 210,152 (Antigravity'slanguage_server.logand Chromium'sDIPS-wal), andcollected_bytesunderstated the archive. Other statuses keep the listing's length (#111). - The PowerShell collector reads project discovery sources with shared
access and logs
discovery source unreadable: <path>: <message>when one still cannot be read. It usedFile.ReadAllText, which fails on a Codex rollout that a running ChatGPT desktop app holds open, and dropped the error silently, so a live run on Windows found no project although both rollouts named one (#114).
1.11.0 - 2026-10-12¶
Added¶
- Claude Desktop installed as an MSIX package on Windows (Anthropic's
Windows download, not a Microsoft Store app) is collected as
claude-desktop: its data directory underAppData/Local/Packages/Claude_*/LocalCache/Roaming/Claude(and theAnthropicPBC.Claude_*family), where MSIX virtualisation stores what the app reports asAppData/Roaming/Claude(#73). AppData/Local/Claude(the MSIX build's logs) andAppData/Local/Claude-Data(an alternative Windows data directory) are collected asclaude-desktop(#73).- The MSIX build's
config.json(OAuth token cache),Cookies*,host-creds-*.jsonandccd-session-secrets/*are flaggedsecret: trueunder both package families (#73). - Claude Desktop's space-link signing key,
spaces-present/<acct>/<org>/link-keyunder the data directory, is flaggedsecret: true(*/Claude*/spaces-present/*/link-key) (#73). - Claude Code's per-process session key,
.claude/sessions/<pid>.<hash>.key(and the same under a relocated.claude-*home), is flaggedsecret: true; the<pid>.jsonbeside it stays unflagged (#76). - The official Linux
.debof Claude Desktop (2.31226.1) was checked against the catalog on a real install: the data directory and its logs are under.config/Claude, already collected asclaude-desktop, and the CLI the app downloads underclaude-code/<version>/<hash>/is excluded by*/Claude*/claude-code(#73). - Claude Code's CLI cache directory, which holds per-project MCP server
logs (
<project slug>/mcp-logs-<server>/<timestamp>.jsonl), is collected asclaude-codefromLibrary/Caches/claude-cli-nodejs(macOS),.cache/claude-cli-nodejs(Linux) andAppData/Local/claude-cli-nodejs/Cache/*(Windows). The Windows entry names the children ofCache/because the PowerShell collector's case-insensitive exclusion*/Claude*/Cachewould otherwise prune the directory itself (#81). - The macOS standard build of Claude Desktop (2.31226.1) was checked
against the catalog on a real install: the data directory, the logs,
Partitions/,claude-code-vm(the Linux CLI build the Cowork VM runs) andvm_bundlesbehave as documented and nothing new needed collecting; the Touch ID WebAuthn metadata secret inPreferences, collected unflagged, is documented as a key to redact (#73).
Fixed¶
- The PowerShell collector collects paths longer than 260 characters under
Windows PowerShell 5.1 without
LongPathsEnabledon the host: every file system call uses the extended-length form (\\?\), so a deep source file is enumerated and its staged copy is written, where before the copy failed aserror_copyand a source tree past 260 characters was not listed. Manifest paths and the archive layout are unchanged (#77). - In the PowerShell collector, a directory that a wildcard catalog segment
cannot list gets an
error_readrow instead of being skipped silently (#77). tests/smoke.shpasses on a macOS host: it strips the trailing slash from$TMPDIRand resolves the work directory before building the fake image, and hashes the backslash-named file from an extracted copy of the archive, because bsdtar reads a backslash in a member name as an escape (#78).- On macOS and the BSDs, a catalog match directory that cannot be listed or
entered (an agent's state directory with no read permission) left no row
in the manifest, only a
findline in the log; it now gets oneerror_readrow with the OS error, as on Linux (#82).
1.10.3 - 2026-10-07¶
Added¶
- The PowerShell collector has its own tar writer, used when
tar.exeis missing or fails: it writes the same.tar.gzlayout with pax headers for non-ASCII and long names, and keeps the staged symlinks.collection.jsoncapabilities.archiverhas a new value,PowerShell tar writer, for an archive it wrote (#72). CAC_ARCHIVER, a test hook for the PowerShell collector, sets the archivers to try (tar,writer,zip) (#72).
Fixed¶
- On Windows, a collection with a file name outside the ANSI code page
(CJK, Cyrillic) no longer falls back to a zip without saying why:
some
tar.exebuilds crash on such names, and the collector now logs its exit code (tar.exe failed: exit code 0xC0000005), adds anotesentry tocollection.jsonfor each fallback, and writes the.tar.gzwith its own tar writer (#72). - The PowerShell collector's zip, now the last resort, stores entry names
with
/instead of\under Windows PowerShell 5.1, so it extracts into thefs/<original path>layout on Linux and macOS (#72).
1.10.2 - 2026-10-07¶
Changed¶
- The PowerShell collector's per-file work is faster: the exclusion and credential tables are each tested with one regular expression instead of a loop over every glob, the staged copy is hashed through the handle that wrote it with one SHA-256 object for the run (reopening a file just written waited for the antivirus scan on Windows), the owner lookup reads only the owner and translates each SID once, staging directories are remembered, and the source is no longer read a second time for its timestamps. A 5,000-file collection takes about a third of the time under Windows PowerShell 5.1 and about half under PowerShell 7 (#71).
- The PowerShell collector writes manifest rows itself instead of through
ConvertTo-Json. The rows parse to the same values with the same keys, order and types, byte for byte as PowerShell 7 wrote them; under Windows PowerShell 5.1,<,>,&and'are now written as themselves rather than as\uescapes (#71). collection.jsonfrom the PowerShell collector reportscapabilities.hash_toolasSystem.Security.Cryptography.SHA256instead ofGet-FileHash(#71).
1.10.1 - 2026-10-07¶
Changed¶
- The sh collector's per-file work forks far fewer processes: manifest rows
are built without subshells, and files are lstat'ed, copied and hashed in
chunks of up to 256 with one
stat, one hasher call and onecp -pper directory, falling back to per-file calls for a chunk or file the batch cannot handle. The manifest is unchanged, rows in the same order; a 5,000-file collection takes about a tenth of the time it did, and theshasumpath (macOS) about a twentieth (#71). - The sh collector's
find -execworkers run underdashwhen it is onPATHandCOLLECTOR_SHis unset, instead ofsh; on macOS, whoseshis bash, this roughly halves the remaining time (#71). --inventorystats each batch of files with onestatcall (#71).
1.10.0 - 2026-10-06¶
Added¶
- Catalog agent
autogen-studio:~/.autogenstudio, with.envandtemp_env_vars.envflagged as credentials (#64). - Catalog agent
crewai:~/.config/crewai,~/.crewai, thecrewaidata directory, and CrewAI's run databases (latest_kickoff_task_outputs.db*,flow_states.db*) and.crewai_user.jsoninside the data directory named after the project folder (.local/share/*/...,Library/Application Support/*/...), plusAppData/Local/[Cc]rew[Aa][Ii];settings.jsonand thecredentials/token files flagged (#64). - Catalog agent
camel-ai:.camel/gmail_token.json(flagged),.camel/skillsand.config/camel, leaving the rest of~/.camel, which Apache Camel JBang shares, uncollected (#64). - Catalog agent
dify: thedifyctlconfig directories, withtokens.ymlflagged, and the Docker volumes*dify_agent_local_sandbox_homeand*dify_agent_local_sandbox_workspace(#64). - Catalog agent
flowise:~/.flowise, withencryption.keyand*_secret.keyflagged andvectorstoreexcluded (#64). - Catalog agent
langflow: the config directory (.cache/langflow,Library/Caches/langflow,AppData/Local/langflow/langflow/Cache),~/.langflowand the Langflow Desktop directories;secret_key,cache_secret_keyand the Desktopdata/.envflagged; knowledge bases, Desktop virtual environments and caches, andprofile_picturesexcluded; the Docker volume*langflow-data(#64). - Catalog agent
metagpt:~/.metagpt, withconfig2.yamlandconfig2.bakflagged (#64). - Catalog agent
n8n:~/.n8n,~/.n8n-local-gatewayand~/.n8n-gateway;.n8n/configand.n8n/ssh/*flagged; node modules, node definitions and SDK templates excluded; the Docker volumes*n8n_dataand*n8n-data(#64). - Catalog agent
pydantic-clai:~/.pydantic-aiand~/.config/pydantic-clai2(CLAI 2.0), withcredentials-*and the Logfire credentials flagged, and the project entry.clai(#64). open-interpreter: the legacy Python tool's platformdirsopen-interpreterdirectories, the olderOpen Interpreter*directories and.cache/open-interpreter, withprofiles/*andconfig.yamlflagged and the downloadedmodels/excluded (#64).- Volume-relative exclusions
profile_pictures,nodes/node_modules,node-definitionsandn8n-sdk-templates, and secret globssecret_key,cache_secret_key,configandssh/*, at the end ofEXCLUDESandSECRET_GLOBS(#64).
1.9.0 - 2026-10-06¶
Changed¶
- The Ollama exclusion
.ollama/modelsis narrowed to.ollama/models/blobs, so the model manifests under.ollama/models/manifests(an inventory of pulled models, with pull times) and the per-blobmodels/metadatafiles are collected; the weights stayskipped_excluded. The volume-relativemodelsexclusion is unchanged, so a Docker Ollama volume's manifests are still not collected (#44).
Removed¶
- The credential pattern
.claude-*/.device-keys.json, which could never match: no catalog line collects that file from a.claude-<name>config home, and Claude Code keeps it in~/.claudewhateverCLAUDE_CONFIG_DIRsays..claude/.device-keys.jsonis still collected and flagged (#41).
1.8.1 - 2026-10-05¶
Fixed¶
- sh collector: a
tarthat fails inside thetar | gzipfallback is now detected, logged astar | gzip: tar exited N, and the collector falls through to the plain.tar, instead of hashing and reporting a truncated.tar.gzas success (#40).
1.8.0 - 2026-10-05¶
Interface changes: the manifest has a new status value, error_read;
collection.json has new fields options.no_projects, options.projects
and counts.error_read, and the sh collector now writes
capabilities.archiver; the PowerShell collector now sets archive_path
(and, when the link is not in the archive, error) on symlink rows; the
stdout errors: line now reads errors: N (X error_copy, Y error_read).
Added¶
collection.jsonoptions.no_projects(boolean) andoptions.projects(the-p/--projector-Projectvalues, resolved to absolute paths and de-duplicated), and, in the sh collector,capabilities.archiver(tar -z,tar | gziportar) (#31).- Manifest status
error_read: onedirrow, with the reason inerror, for a home, project directory or directory inside a walk that cannot be listed or entered, and for a-p/-Projectvalue that is not a directory.collection.jsoncounts.error_readcounts them (#32, #39).
Fixed¶
- On a case-insensitive filesystem (macOS, Windows), catalog entries that
differ only by case (
.config/gooseand.config/Goose,.config/PearAI/Userand.config/pearai/User,.config/Cursor/Userinside.config/cursor) no longer collect the same files twice: the first catalog line keeps the directory and the later one is logged and skipped, also with--inventory. On Linux both directories are still collected. The sh collector compares device and inode; the PowerShell collector compares on-disk names and records paths in their on-disk spelling (#29). collection.jsonarchiveandcapabilities.archivername the archive and archiver actually used. Both collectors rewrite the summary and its archived copy before each fallback, so they no longer say.tar.gzafter the sh collector's plain.tarfallback or.tar.gzandtar.exeafter the PowerShell collector's.zipfallback (#31).- The PowerShell collector recreates symlinks and other reparse points in
the archive, with the target string as stored, and sets their
archive_path, as the sh collector does (#30). Windows PowerShell 5.1 makes the link withcmd.exe'smklinkand skips a link path or target containing%or", whichcmd.execannot take verbatim; PowerShell 7 uses .NET. Where Windows refuses to create a link (no Administrator or Developer Mode) or the archive is a.zip, which cannot hold links, thesymlinkrow keeps an emptyarchive_path, itserrorfield says why, andcollection.jsonnotescounts them; a late fall back fromtar.exeto zip removes the staged links first and rewrites their manifest rows, so a zip never holds a link target's bytes. Manifest change:erroris now set on suchsymlinkrows, andarchive_pathon recreated ones. - A home or a directory inside a home that the collector could not read
was silent (sh) or only logged; it now has an
error_readrow and aread failed:log line (#32). - The stdout
errors:line countserror_copyanderror_readrows together and shows each in parentheses,errors: 3 (1 error_copy, 2 error_read); it counted onlyerror_copybefore (#32). - The PowerShell collector checks that the output directory is writable
(a probe file created and removed) and exits 2 with
Output dir not writable: <dir>before collecting, as the sh collector does (#38). - A
-p/-Projectdirectory that does not exist was dropped silently; it is now logged and gets anerror_readrow. A relative-pwas ignored by the sh collector; both collectors now resolve it against the current directory, in image mode too (#39).
1.7.0 - 2026-10-04¶
Added¶
- Meta's Muse Code CLI as catalog agent
muse-code, with an evidence document underresearch/:~/.config/museand~/.local/share/muse(the same paths on Windows),~/.muse, the launcher's dot files in~/.local/bin/.muse-*, the Windows install directoryAppData/Local/Programs/museand the per-session shell sandboxAppData/LocalLow/muse-shell-sandbox-*.auth.jsonandsettings.jsonunder.config/museare flagged secret. The bundled plugin and skill copies, marketplace clones, update staging directories, the Windowsmuse-bin-*.exebinary and.muse/worktreesare excluded. Projects are discovered fromtrust.jsonand session logs'workspace_root, and a project's.musedirectory is collected. - Claude Code config homes moved with
CLAUDE_CONFIG_DIRto a~/.claude-<name>directory such as~/.claude-work:projects/,file-history/,history.jsonl,.claude.json*and the credential files inside it are collected asclaude-code, the credential files and.claude.jsonare flagged secret, and its.claude.jsonandhistory.jsonlare project discovery sources. The entries name Claude-only files, so~/.claude-code-router,~/.claude-memand~/.claude-squadare not collected. collection.jsonfieldusers_with_artifacts: the users whose home produced at least one manifest row.usersandhomesstill list every home scanned.
Changed¶
- The stdout
users:line counts only homes that produced at least one manifest row, and theUserprogress line is written only for a home with a catalog match. - The stdout
size:andcollected:lines add the size in binary units after the byte count, such as74779093 (71.3 MiB). - The sh collector's final progress line on stderr is
done; the archive path, size and sha256 stay in the log file'sdone:line and on stdout. The PowerShell collector now prints the samedoneline. - PowerShell collector: the internal logging function is renamed from
Write-LogtoWrite-CollectorLogso it no longer shadows a Windows built-in command name; output and behaviour are unchanged. Found by PSScriptAnalyzer 1.25.0 withcollectors/PSScriptAnalyzerSettings.psd1.
Fixed¶
- sh collector: failed to parse under posh and other pdksh-derived shells,
which stop a
$(...)at the)of a case pattern. The two suchcasestatements use the(pattern)form, and the shared helper and worker programs are read from here-documents without$(cat <<...); the programs are byte-identical. The smoke test now passes under posh.
Removed¶
- Shell history collection: the
shell-historycatalog agent and its ten entries (.bash_history,.zsh_history,.zsh_sessions,.sh_history,.history,.bash_sessions, both fishfish_historypaths and both PSReadLineConsoleHost_history.txtpaths). Shell history is the EDR's job, like process lists and logons. Manifests no longer holdshell-historyrows, and--listand-Listno longer print them. - General-purpose
.envfiles: theshared|.enventry for~/.envand theproject|.enventry for a.envat a discovered project's root. They hold whatever secrets the user or project keeps, not only AI keys, and are left to the EDR. An agent's own.envinside its state directory (~/.codex/.env,~/.gemini/.env,~/.hermes/.env, the Agent Zerousr/.envand the others inSECRET_GLOBS) is still collected and flagged secret.
1.6.0 - 2026-10-04¶
Added¶
- Inventory mode,
--inventory/-Inventory, for fleet audits through an EDR console: the collection walk (catalog, exclusions, nested claims, Docker volumes,-u,-r,--full,--no-docker) withlstatonly. It writes nothing, not even a log;-ois ignored with a stderr note. Exit code0once the walk has run. - Inventory output on stdout, JSON Lines: one
hostline (type,host,collector,mode,at,users_scanned,users_unreadable,docker_volumes). - Then one
agentline per user and agent with at least one file after exclusions and nested claims (type,host,user,agent,files,bytes,first,last,projects,evidence);projectsis the user's discovered project count, repeated on each of the user's lines, and Docker volumes appear as userdocker. - Inventory never opens a credential file: project discovery skips sources
that match
SECRET_GLOBS.
Changed¶
- PowerShell: the
profile not accessible (skipped)log line is written only for profiles selected by-Users.
Removed¶
- The live system snapshot. Both collectors no longer write the
live/directory (system.txt,users.txt,logins.txt,processes.txt,agent-processes.txt,network.txt,services.txt,scheduled-tasks.txt, and the sh collector'slive/environ/<pid>.txtprocess environments). The collectors supplement an EDR, which already records processes, logins, network connections and services. - Manifest: the
liveagent name and thelive/<file>archive paths are gone; no row has an emptypathany more. - The
--no-live/-NoLiveoption. Passing it is now a usage error. collection.json: theoptions.no_livefield. The host name stays inhostname.
1.5.0 - 2026-10-04¶
Added¶
- Docker and Podman named volumes are collected (#28). Both
collectors enumerate
var/lib/docker/volumes,var/lib/containers/storage/volumesandProgramData/Docker/volumesunder the root, and the rootless.local/share/docker/volumesand.local/share/containers/storage/volumesunder each home, from the filesystem only. A volume whose name matches the newDOCKER_VOLUMEStable is collected whole withuserdockerand its_datadirectory ashome; exclusion and secret globs apply relative to_data. - New catalog table
DOCKER_VOLUMES(Agent Zero, Local Deep Research, Ollama from source; Tabby, OpenHands, Letta, Hermes, OpenClaw and nanobot by inferred name), printed last by--listand-Listunder the new heading# docker volumes (agent|volume name glob). Consumers of the--listoutput that do not know the heading should stop reading there. - Volume-relative forms of the Agent Zero, Tabby, Ollama, Local Deep
Research, OpenHands, Hermes, OpenClaw, nanobot and Letta exclusions and
secret globs, at the end of
EXCLUDESandSECRET_GLOBS. --no-docker/-NoDockerskips the enumeration.- Manifest: new status value
skipped_unmatched_volume, onedirrow with its size for each volume that matches noDOCKER_VOLUMESline. collection.json:options.no_docker,counts.skipped_unmatched_volume, adockerobject (volumes_found,volumes_collected,unreadable,docker_desktop) and anoteslist. An unreadable volume directory or a volume that cannot be walked is noted there and in adocker:line of the stdout summary; collection continues and the exit code is unchanged. Docker Desktop data (whose Linux volumes are inside a VM disk) is only noted.
1.4.0 - 2026-10-04¶
Added¶
- Fifteen catalog agents from the October 2026 backlog, each with an
evidence document under
research/:pearai,cody,twinny,tabby,open-interpreter,openhands,pi,little-coder,letta,hermes,openclaw,nanobot,agent-zero,shellgptandlocal-deep-research. Several of them are general-purpose or chat-channel agents rather than coding agents. Sourcegraph Cody and Twinny have nested entries inside every VS Code family editor's globalStorage, like Cline and Continue, and little-coder's prompt history is a nested entry inside pi's~/.pi. - 82 home catalog entries, 33 project catalog entries, 151 exclusions and
150 secret globs, among them Codex CLI's
.codex/.env, which was not flagged before. - Twenty-one more project discovery sources in both collectors: Hermes
checkpoint project records; Letta's session index and local-backend
transcripts; pi session headers (also little-coder's), misplaced
sessions, trusted folders, crash log and experimental session metadata;
Open Interpreter live and archived rollouts; OpenHands workspaces, Agent
Canvas conversation metadata and CLI conversation state; PearAI
sessions; OpenClaw
workspaceandagentDirfrom its JSON5 config, legacyclawdbot.jsonincluded; nanobot workspace markers and instance config; Tabbyfile://repositories; and the common directory of the files in each Twinny embeddings manifest. [!...]negated classes in exclusion and secret globs now work in the PowerShell collector as they do in the sh collector.
Fixed¶
- The PowerShell collector dropped
file:///URIs of POSIX paths found in agent state; they now map to the path.
1.3.0 - 2026-10-03¶
Added¶
- 60 home catalog entries, among them the remote server data directories of
VS Code, Cursor, Windsurf, Devin and Kiro (with their agent extensions
attributed to the extension), Antigravity IDE and
.gemini/config, the Copilot CLI XDG directories and caches, Windsurf transcripts, the Ollama desktop app and Zed under Flatpak. - 33 project catalog entries, 55 exclusions and 80 secret globs, including
the Cursor and Windsurf credential files, now flagged
secret: true. - Ten more project discovery sources in both collectors.
collectors/research/holds one evidence document per catalog agent.
Fixed¶
- Exclusions that hid evidence: Factory Droid's cache exclusion now covers
only its sounds, Kiro's
powersdirectory is collected again, the Kilo Code worktree exclusions match the real paths, and Codex database backups and Goose apps are collected.
1.2.0 - 2026-10-03¶
Changed¶
- A catalog entry nested inside another entry's directory now claims its
subtree: each file is collected once, under the most specific agent.
Manifest rows for Antigravity CLI files under
~/.gemini/antigravity-clinow haveagentantigravityinstead ofgemini-cli.
Added¶
- Nested entries for the Cline, Roo Code, Kilo Code and Continue extensions inside the globalStorage of every VS Code family editor (VS Code, VSCodium, Cursor, Windsurf, Antigravity IDE, Kiro), on all three platforms, so their files are attributed to the extension rather than the editor.
1.1.0 - 2026-10-03¶
Added¶
Collect-AgentArtifacts.ps1, the Windows PowerShell 5.1 collector, with the same catalog, manifest and archive layout as the sh collector. It reads profiles from the registry andC:\Users, copies files held open by running editors, takes a CIM live snapshot, and writes atar.gzthroughtar.exeor a.zipon older hosts.- Manifest rows written by the Windows collector carry two extra fields,
ownerandattributes, and recorduid,gid,ctimeas0andmodeas"". - Catalog agents
roo-code,kilo-code,copilot(the GitHub Copilot editor plugin'sgithub-copilotdirectory) andshared(~/.agents,~/.envandAGENTS.mdshared between agents). - Nine more project discovery sources, and Crush's per-project
.crushsession database. - Exclusions for embedding indexes, shadow git checkpoints, worktrees, daemon binaries and Electron caches.
- Secret flags for the Gemini CLI and Goose credential files that replace the OS keychain when it is unavailable.
Changed¶
- Catalog entries for Cursor, Windsurf, Continue, Amp, Goose, Zed, Kiro, Qwen Code, Cline, Augment, Factory Droid, Crush, OpenCode, ChatGPT Desktop, Claude Desktop, Gemini CLI, Codex CLI and Aider were rebuilt from each tool's source, shipped bundle or official documentation.
- Zed, Goose, OpenCode, Crush, Kilo Code and Amp are looked for under
~/.configand~/.local/shareon macOS and Windows images too.
Fixed¶
- Continue's
index/globalContext.jsonis collected; only the embedding index beside it is excluded.
1.0.0 - 2026-10-03¶
Added¶
collect-agent-artifacts.sh, a single POSIX sh collector with no dependencies beyond the base system, for live macOS, Linux and BSD hosts and for mounted disk images (-r).- Collection of Claude Code, Claude Desktop, Gemini CLI, Antigravity, Codex CLI, Copilot CLI, Cursor, VS Code, Windsurf, Aider, Ollama and other agent state, plus shell histories, for every user, and project files from repositories referenced in agent state.
manifest.jsonlwith one row per path:user,home,agent,path,archive_path,type,size,mtime,atime,ctime,btime,uid,gid,mode,sha256,secret,status,target,error. Status values:collected,symlink,skipped_excluded,skipped_size,skipped_secret,error_copy.collection.jsonrun summary, afs/<original path>archive layout, a live system snapshot, and a SHA-256 of the archive.- Options
-o,-r,-u,-p,--full,--no-secrets,--no-live,--no-projects,--max-file-size,-k,--list,-q,-V,-h. - Default size exclusions for model weights, caches and extension binaries,
overridden by
--full; credential files collected and flaggedsecret: trueby default.