Skip to content

Hook-free agent session tracking for shell-pane CLIs#258

Open
DDKinger wants to merge 33 commits into
mainfrom
dev/yuazha/hookless-agent-session-tracking
Open

Hook-free agent session tracking for shell-pane CLIs#258
DDKinger wants to merge 33 commits into
mainfrom
dev/yuazha/hookless-agent-session-tracking

Conversation

@DDKinger

@DDKinger DDKinger commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Replaces the PowerShell-hook mechanism for tracking Class-B agent CLI sessions (Copilot / Claude / Codex / Gemini run directly in shell panes) with a hook-free file + process observer living in wta-master. Session discovery and live activity (Working / Idle / Attention) now come from tailing each CLI's own on-disk session records; pane binding comes from process inspection. The entire PowerShell-hook apparatus (installer, wta hooks subcommand, embedded wt-agent-hooks bundle, env injection, Settings/FRE install UI) is removed.

Design spec: doc/specs/hookless-agent-session-tracking.md.

How it works

  • Watcher (tools/wta/src/session_watcher/): a notify watch over the four CLI session roots; per-CLI classifiers turn each on-disk record into the existing SessionEvents.
  • Binding (tools/wta/src/proc_bind.rs, spec Decision This repo is missing important files #3): Copilot = inuse.<pid>.lock; Codex = Restart Manager owner of the rollout file; Claude = cwd-correlation among live claude.exe; Gemini = unbound (cwd not path-encoded — deferred). pid → pane GUID via WT_SESSION in the process PEB (inline Win32 FFI: PEB read, Restart Manager, Toolhelp32).
  • Master wiring (tools/wta/src/master/mod.rs): watcher → ensure_watched_session_row (creates + binds the row on first sight) → apply_event (status) → broadcast sessions/changed. Renders through master's existing registry/snapshot path; the helper-side ingest is gone.

Removed (hook teardown)

  • Rust: agent_hooks_installer.rs, the wta hooks subcommand, the wt-agent-hooks/** bundle, the WTA_HOOK_LOG_DIR env injection (spawn.rs), the master-startup hooks auto-upgrade, the dormant agent_event ingest, and its dead agent.* wire-format parser.
  • C++: the WTA_HOOK_LOG_DIR injection (ConptyConnection.cpp); the Settings "Install hooks" UI + AgentHooksStatus + its unit test; the FRE hooks-install Save step. The FRE "Session management" toggle UI is kept (it just no longer installs hooks).

Verification

  • Rust: cargo test623 pass, 0 fail; build clean at the pre-existing 44-warning baseline; changed files rustfmt-clean (pinned ms-prod-1.93 toolchain).
  • C++: build CascadiaPackage (F5) — verify the WinRT IDL → .h → .cpp projection + XAML compile. (Not buildable in the authoring environment; validated here only via exhaustive grep + XML-parse of both XAML files.)
  • E2E (no hooks installed): run copilot / claude / codex / gemini in a normal shell pane; confirm it appears in the session-management view with live Working/Idle and that Enter focuses its pane.
  • E2E edge — dedup: confirm an agent-pane Codex/Claude session does not produce a duplicate origin=Unknown row. The watcher de-dupes Class-A vs Class-B by session-key equality; this holds only if the CLI's on-disk key equals the ACP session/new id (plausible for Copilot; Codex/Claude via the zed ACP adapter may mint a different id). If duplicates appear, the fix is a pane-ownership guard in ensure_watched_session_row.

Notes / deferred

  • Permission-gate Attention (y/n prompts) is not surfaced — only ask-user tool notifications (accepted MVP scope).
  • Gemini pane-binding deferred (its cwd is not path-encoded).
  • Antigravity CLI is documented but deferred until WTA ACP supports it (see spec).
  • Orphan hooks.* (Rust) and non-en-US AIAgents_Hooks* (resw) locale keys are intentionally left in place to avoid 89-file churn; the localization pipeline prunes them.

Yuandi Zhang (from Dev Box) and others added 30 commits June 9, 2026 08:32
…server)

Design spec to replace the wt-agent-hooks plugin mechanism with a hook-free,
zero-install subsystem in wta-master: a filesystem watcher over each CLI's
on-disk session files (discovery + activity) plus a process binder
(binding + liveness), both emitting the existing SessionEvents so the
downstream registry / UI / Enter-routing are unchanged.

Settled via three live probes (2026-06-08/09):
- Binding (Spike A): copilot=inuse.<pid>.lock, codex=Restart Manager (both
  exact); claude+gemini=cwd correlation. PEB *_SESSION_ID and CREATE-instant
  Restart Manager were tried and rejected. WT_SESSION lives in every CLI's
  PEB, so pid->pane is trivial; only file-id->pid differs per CLI.
- Activity (Spike B): all CLIs write tool records incrementally (live
  Working/Idle works); Gemini rewrites a \.messages snapshot so its
  classifier must re-parse + diff rather than byte-tail.
- Antigravity (agy.exe), Gemini CLI's 2026-06-18 successor: documented but
  deferred to a later phase gated on WTA ACP support. Initial scope is
  Copilot/Claude/Codex/Gemini.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Three sequential bite-sized TDD plans for the initial scope
(copilot/claude/codex/gemini), grounded in live probes + a three-agent
investigation of the master/helper protocol and hook-removal surface:

- Plan A: proc_bind binding primitives (lock / Restart Manager / PEB env /
  parent pid) via inline validated Win32 FFI, no new deps.
- Plan B: session_watcher + per-CLI classifiers (real probe-verified field
  names) + cwd-correlation binder; adds notify.
- Plan C: master wiring (reuse existing apply_event + sessions/changed
  broadcast reducer) + full hook teardown (Rust installer/subcommand/env/
  bundle + the one C++ WTA_HOOK_LOG_DIR injection + Settings UI).

Antigravity remains the documented, deferred follow-up per the spec.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…dead_code

- Add targeted #[allow(dead_code)] + comment to Candidate, correlate_by_cwd,
  bind_copilot, bind_codex in session_watcher/bind.rs (Plan C wiring pending)
- Add targeted #[allow(dead_code)] + comment to cwd_for_pid in proc_bind.rs
- Fix clippy: remove redundant 'as usize' cast in cwd_for_pid (len_word & 0xFFFF)
- Fix clippy: add blank line before standalone doc paragraph in bind.rs module doc
- cargo fmt applied to all Plan B scope files; out-of-scope files reverted

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ne loss

- Codex: extract full UUID (last 5 hyphen groups) from rollout filename
  instead of just the last dash-group, so Emitted.key matches what
  history_loader reads from session_meta.payload.id.
- Gemini: derive canonical key from the header line's \sessionId\ field;
  the filename only carries the first 8 hex chars of the UUID.  Fall back
  to the path-derived stem when the field is absent.
- Append branch: only advance the byte offset through the last newline;
  a trailing partial line (record still being written) is left for the next
  tick, preventing permanent data loss when the write completes.
- Replace codex_path test with codex_path_uses_full_uuid_key that asserts
  the full UUID, and add process_change_does_not_lose_a_partial_line
  regression test.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Spawns the hookless file watcher inside run_master_loop and wires
emitted events into master's registry via the same reducer pattern
as handle_session_hook.

Two new functions:
- apply_watcher_event: applies one Emitted event and broadcasts
  sessions/changed if state changed, mirroring handle_session_hook
  without the ext-request round-trip.
- ensure_watched_session_row: creates a minimal SessionInfo row
  (CliSource + Idle + Unknown origin) on first sight of a session
  key, so apply_event always has a pre-existing row to mutate.

The watcher runs on a dedicated OS thread (blocking notify loop);
a second bridge thread forwards into a tokio unbounded_channel;
a spawn_local task on the LocalSet drains the channel and calls
apply_watcher_event — no blocking work on the async executor.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…tomatic)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 9, 2026 06:12

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

check-spelling found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR replaces the PowerShell hook/plugin-based mechanism for tracking “Class-B” agent CLI sessions (run directly in shell panes) with a hook-free implementation in wta-master that watches each CLI’s on-disk session records and binds sessions to panes via process inspection. In support of that shift, it removes the wt-agent-hooks bundle and tears out the related Settings/FRE UI and helper wiring.

Changes:

  • Add a new Rust session_watcher/ subsystem (file watcher + per-CLI classifiers + pane-binding helpers) and wire it into wta-master’s registry update/broadcast path.
  • Remove the entire wt-agent-hooks bundle and associated hook log-dir env injection / hook upgrade paths.
  • Remove C++/XAML UI for “Install hooks” (Settings + FRE), delete the C++ hook-status parser and its unit tests, and update localization resources accordingly.

Reviewed changes

Copilot reviewed 51 out of 53 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
tools/wta/wt-agent-hooks/README.md Removes hook bundle documentation (bundle deleted).
tools/wta/wt-agent-hooks/hook-debug/state-logger.ps1 Removes hook debug utility script.
tools/wta/wt-agent-hooks/gemini-extension/README.md Removes Gemini hook extension docs.
tools/wta/wt-agent-hooks/gemini-extension/hooks/send-event.ps1 Removes Gemini hook forwarding script.
tools/wta/wt-agent-hooks/gemini-extension/hooks/hooks.json Removes Gemini hook registration.
tools/wta/wt-agent-hooks/gemini-extension/gemini-extension.json Removes Gemini extension manifest.
tools/wta/wt-agent-hooks/copilot/wt-agent-hooks/hooks/send-event.ps1 Removes Copilot hook forwarding script.
tools/wta/wt-agent-hooks/copilot/wt-agent-hooks/hooks/hooks.json Removes Copilot hook registration.
tools/wta/wt-agent-hooks/copilot/wt-agent-hooks/.claude-plugin/plugin.json Removes Copilot plugin manifest.
tools/wta/wt-agent-hooks/copilot/.claude-plugin/marketplace.json Removes Copilot local marketplace manifest.
tools/wta/wt-agent-hooks/codex/wt-agent-hooks/hooks/send-event.ps1 Removes Codex hook forwarding script.
tools/wta/wt-agent-hooks/codex/wt-agent-hooks/hooks/hooks.json Removes Codex hook registration.
tools/wta/wt-agent-hooks/codex/wt-agent-hooks/.codex-plugin/plugin.json Removes Codex plugin manifest.
tools/wta/wt-agent-hooks/codex/.agents/plugins/marketplace.json Removes Codex local marketplace manifest.
tools/wta/wt-agent-hooks/claude/wt-agent-hooks/hooks/send-event.ps1 Removes Claude hook forwarding script.
tools/wta/wt-agent-hooks/claude/wt-agent-hooks/hooks/hooks.json Removes Claude hook registration.
tools/wta/wt-agent-hooks/claude/wt-agent-hooks/.claude-plugin/plugin.json Removes Claude plugin manifest.
tools/wta/wt-agent-hooks/claude/.claude-plugin/marketplace.json Removes Claude local marketplace manifest.
tools/wta/src/ui/chat.rs Removes rendering support for hook-originated “AgentEvent” chat messages.
tools/wta/src/theme.rs Removes styles that were only used for hook event rendering.
tools/wta/src/session_watcher/mod.rs New: core file-watcher, incremental tailing, and event emission.
tools/wta/src/session_watcher/discover.rs New: map changed paths to (cli, key, cwd) identities.
tools/wta/src/session_watcher/classify_gemini.rs New: classify Gemini snapshot-style logs into SessionEvents.
tools/wta/src/session_watcher/classify_copilot.rs New: classify Copilot events.jsonl into SessionEvents.
tools/wta/src/session_watcher/classify_codex.rs New: classify Codex rollout logs into SessionEvents.
tools/wta/src/session_watcher/classify_claude.rs New: classify Claude logs into SessionEvents.
tools/wta/src/session_watcher/bind.rs New: bind discovered sessions to panes via lock/RM/cwd correlation.
tools/wta/src/protocol/acp/spawn.rs Removes WTA_HOOK_LOG_DIR env injection (hooks removed).
tools/wta/src/master/mod.rs Wires watcher into master loop; adds reducer application + broadcast path.
tools/wta/src/history_loader.rs Exposes a Codex rollout lookup helper for master binding.
tools/wta/src/agent_sessions.rs Removes now-unused CLI source parsing helper + related test.
tools/wta/cgmanifest.json Updates component governance manifest for new Rust deps.
tools/wta/Cargo.toml Adds notify dependency for filesystem watching.
tools/wta/Cargo.lock Locks notify and its transitive dependencies.
src/cascadia/ut_app/TerminalApp.UnitTests.vcxproj Drops removed hook-status unit test compilation unit.
src/cascadia/ut_app/AgentHooksStatusTests.cpp Deletes unit tests for hook-status JSON parsing (feature removed).
src/cascadia/TerminalSettingsEditor/Resources/en-US/Resources.resw Removes hook-install UI strings from Settings resources.
src/cascadia/TerminalSettingsEditor/AIAgentsViewModel.idl Removes hook-install ViewModel surface area.
src/cascadia/TerminalSettingsEditor/AIAgentsViewModel.h Removes hook-install state/methods and header dependency.
src/cascadia/TerminalSettingsEditor/AIAgentsViewModel.cpp Removes hook-install status polling and action handlers.
src/cascadia/TerminalSettingsEditor/AIAgents.xaml Removes “Agent session tracking (hooks)” UI section.
src/cascadia/TerminalConnection/ConptyConnection.cpp Removes WTA_HOOK_LOG_DIR env injection (hooks removed).
src/cascadia/TerminalApp/Resources/en-US/Resources.resw Removes FRE hook-install failure string.
src/cascadia/TerminalApp/FreOverlay.h Removes FRE problem kind / hook install API surface.
src/cascadia/TerminalApp/FreOverlay.cpp Removes FRE hook install step and failure handling.
src/cascadia/inc/IntelligentTerminalPaths.h Updates comments after removing hook log-dir coupling.
src/cascadia/inc/AgentHooksStatus.h Deletes the hook-status JSON parser/formatter header.
NOTICE.md Updates third-party notices for new Rust deps (e.g., notify, filetime).

Comment thread tools/wta/src/master/mod.rs Outdated
Comment on lines +2180 to +2185
let mut info = crate::session_registry::SessionInfo::new(sid, cwd);
info.cli_source = Some(emitted.cli.clone());
info.status = Some(crate::agent_sessions::AgentStatus::Idle);
info.origin = Some(crate::agent_sessions::SessionOrigin::Unknown);
info.pane_session_id = pane;
state.registry.upsert(info).await;
Comment on lines +159 to +171
for root in watched_roots() {
// A missing root is fine (the user may not have that CLI) — log + skip.
if root.exists() {
if let Err(err) = watcher.watch(&root, RecursiveMode::Recursive) {
tracing::warn!(
target: "session_watcher",
root = %root.display(),
error = %err,
"watch failed"
);
}
}
}
Comment on lines +1541 to +1548
std::thread::Builder::new()
.name("wta-session-watch".into())
.spawn(move || {
if let Err(err) = crate::session_watcher::watch(sync_tx) {
tracing::warn!(target: "session_watcher", error = %err, "watcher exited");
}
})
.ok();
Comment on lines +1552 to +1561
std::thread::Builder::new()
.name("wta-session-watch-bridge".into())
.spawn(move || {
for emitted in sync_rx {
if async_tx.send(emitted).is_err() {
break;
}
}
})
.ok();
…for Copilot

Copilot live activity was tool-granular: WORKING only flickered during the
brief tool.execution_start->complete windows, so a session showed IDLE while
the agent was thinking / streaming text during a multi-minute turn.

Drive status from the assistant *turn* instead: assistant.turn_start -> WORKING
for the whole turn, assistant.turn_end -> IDLE. tool.execution_complete is no
longer mapped (IDLE is owned by turn_end, so a tool finishing mid-turn no longer
prematurely idles the row). Consecutive turns share a turn_end/turn_start
timestamp and batch together, so there is no IDLE flicker between them.

Also surface Copilot's permission.requested record (the approve/deny command
gate) as ATTENTION; it clears on the approved tool's start (WORKING) or the
turn's end (IDLE).

Copilot-only: reuses the existing ToolStarting/ToolCompleted/Notification
events (current_tool / attention_reason are not rendered), so the shared
reducer, wire conversions, and the other CLIs are untouched. Claude/Codex/Gemini
keep their tool-granular model pending per-CLI turn-marker verification.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

…ility

Post-PR live-testing fixes for the file/process watcher that replaced the
PowerShell hooks. All within wta-master's watcher path; the shared reducer's
terminal-state guard stays untouched so Class-A agent-pane rows are unaffected.

Codex activity model (classify_codex):
- Turn-based status: event_msg/task_started -> Working, task_complete -> Idle;
  function_call_output dropped (Idle is owned by task_complete, so a tool
  finishing mid-turn no longer flips the row to Idle while the agent works).
- require_escalated sandbox permission -> Attention, surfacing the call's
  justification as the reason (parsed from the nested arguments JSON).

Class-B (shell-pane) session lifecycle:
- Revive a resumed Historical/Ended row in ensure_watched_session_row (watcher
  path only) so `codex resume` reappears as Idle and rebinds its pane.
- 5s pid-liveness reaper: shell-pane CLIs write no "session ended" record and
  WT panes only track the conpty root shell, so a Ctrl+C left the row stuck.
  Poll each bound pid (OpenProcess + GetExitCodeProcess) and end any whose
  process exited. Adds proc_bind::pid_alive, SessionInfo.bound_pid, and threads
  the owner pid out of the bind_* resolvers.
- Codex cwd from session_meta (codex_cwd_from_rollout) so the row has a cwd for
  the session-view title fallback before the first user message exists.

Watcher reliability (session_watcher):
- Seed per-file offsets to EOF at startup (seed_existing_progress_in) so a
  spurious notify event on a pre-existing historical file can no longer replay
  it from offset 0 -> revive every historical session -> flood master with
  thousands of sessions/changed broadcasts.
- Periodic catch-up sweep for dropped notify events. ReadDirectoryChangesW is an
  edge signal that coalesces writes and gives no guarantee an event arrives
  after the final write is durable, so a turn's last record (task_complete /
  turn_end -> Idle) could be stranded, leaving the row stuck on Working. The
  sweep re-runs the incremental process_change, but only over a "hot" set of
  files whose session is currently Working/Attention, so its cost scales with
  active sessions rather than the (mostly historical) tracked-file count.

title fix (app): session_info_to_agent_session filled a None title with the
literal "-", which is non-empty and so bypassed display_title's cwd-basename
fallback. Use an empty string so the fallback applies.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 10, 2026 05:04
@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 52 out of 54 changed files in this pull request and generated 3 comments.

Comment on lines +701 to +704
/// `None` for agent-pane sessions and any session we couldn't bind to a
/// pid. Master-internal — skipped on the wire.
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bound_pid: Option<u32>,
Comment on lines +6 to +8
//! * Claude/Gemini → cwd correlation: among live CLI processes, pick the
//! one whose working directory matches the session's cwd; ties (same cwd)
//! are left unresolved (returns None) to avoid a wrong bind.
None
}

#[cfg(test)]
Codex's multi_agent_v1/spawn_agent tool forks a child thread that gets its own
rollout-*.jsonl with `source.subagent` in its session_meta. The fork inherits
the parent's full history (so its first user message — and thus its title — is
identical), which the file watcher surfaced as a second, duplicate-looking
session row.

Skip these internal worker threads in both surfaces, keyed on the
`session_meta.payload.source.subagent` discriminator (top-level sessions carry
`source:"cli"`/`"user"`):

- history loader (`load_codex`): `read_codex_session_meta` now reports
  `is_subagent`; subagent rollouts are skipped during the startup scan.
- live watcher (`process_change`): on first read, a `session_meta` with
  `source.subagent` flags the file (`Progress.ignored`) and drops it wholesale;
  later reads short-circuit.

Shared `codex_record_is_subagent_meta` / `codex_payload_is_subagent` helpers
(pub(crate)) back both paths.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown

@check-spelling-bot Report

⚠️ Dictionary not found

Problems were encountered retrieving check dictionaries (cspell:rust/dict/rust.txt cspell:cpp/src/stdlib-c.txt cspell:monkeyc/src/monkeyc_keywords.txt cspell:r/src/r.txt cspell:ada/dict/ada.txt cspell:shell/dict/shell-all-words.txt cspell:software-terms/dict/webServices.txt cspell:php/dict/php.txt cspell:latex/dict/latex.txt cspell:ruby/dict/ruby.txt cspell:cpp/src/compiler-gcc.txt cspell:redis/dict/redis.txt cspell:cpp/src/lang-keywords.txt cspell:sql/src/tsql.txt cspell:cpp/src/stdlib-cmath.txt cspell:node/dict/node.txt cspell:npm/dict/npm.txt cspell:software-terms/dict/softwareTerms.txt cspell:cpp/src/compiler-clang-attributes.txt cspell:sql/src/sql.txt cspell:html/dict/html.txt cspell:clojure/src/clojure.txt cspell:lua/dict/lua.txt cspell:fullstack/dict/fullstack.txt cspell:haskell/dict/haskell.txt cspell:cpp/src/stdlib-cerrno.txt cspell:public-licenses/src/additional-licenses.txt cspell:python/src/common/extra.txt cspell:cpp/src/ecosystem.txt cspell:scala/dict/scala.txt cspell:svelte/dict/svelte.txt cspell:docker/src/docker-words.txt cspell:cpp/src/lang-jargon.txt cspell:python/src/python/python.txt cspell:cpp/src/compiler-msvc.txt cspell:python/src/additional_words.txt cspell:cpp/src/stdlib-cpp.txt cspell:golang/dict/go.txt cspell:powershell/dict/powershell.txt cspell:elixir/dict/elixir.txt cspell:k8s/dict/k8s.txt cspell:public-licenses/src/generated/public-licenses.txt cspell:dart/src/dart.txt cspell:css/dict/css.txt cspell:python/src/python/python-lib.txt cspell:gaming-terms/dict/gaming-terms.txt cspell:cpp/src/people.txt cspell:cpp/src/template-strings.txt cspell:typescript/dict/typescript.txt cspell:java/src/java.txt cspell:java/src/java-terms.txt cspell:swift/src/swift.txt cspell:dotnet/dict/dotnet.txt cspell:django/dict/django.txt).

⚠️ For more information, see check-dictionary-not-found.

🔴 Please review

See the 📂 files view, the 📜action log, 👼 SARIF report, or 📝 job summary for details.

Unrecognized words (14)
bitness
cands
nopid
notanumber
ollout
pbi
rstrtmgr
RUPP
SNAPPROCESS
Toolhelp
unmark
unqueryable
WMI
yuazha
These words are not needed and should be removed Backgrounder CANTCALLOUT Ccc cplusplus ctl Debian dotnet drv endptr EOFs evt Fullwidth gitlab hdr idl IME inbox ININPUTSYNCCALL intelligentterminal Ioctl KVM lbl lld lsb NODEFAULT NONINFRINGEMENT notif oss outdir Podcast pri prioritization rcv segfault SND sourced SWP Tbl testname transitioning Uninstalls unk unparseable unregisters Virt VMs webpage websites WINVER xsi

To accept these unrecognized words as correct and remove the previously acknowledged and now absent words, you could run the following commands

... in a clone of the git@github.com:microsoft/intelligent-terminal.git repository
on the dev/yuazha/hookless-agent-session-tracking branch (ℹ️ how do I use this?):

curl -s -S -L 'https://raw.githubusercontent.com/check-spelling/check-spelling/cfb6f7e75bbfc89c71eaa30366d0c166f1bd9c8c/apply.pl' |
perl - 'https://github.com/microsoft/intelligent-terminal/actions/runs/27264401941/attempts/1' &&
git commit -m 'Update check-spelling metadata'
Available 📚 dictionaries could cover words (expected and unrecognized) not in the 📘 dictionary

This includes both expected items (2064) from .github/actions/spelling/expect/alphabet.txt .github/actions/spelling/expect/expect.txt .github/actions/spelling/expect/web.txt and unrecognized words (14)

Dictionary Entries Covers Uniquely
cspell:csharp/csharp.txt 32 2 2
cspell:aws/aws.txt 232 2 2
cspell:fonts/fonts.txt 536 1 1

Consider adding to the extra_dictionaries array (in the .github/actions/spelling/config.json file):

    "cspell:csharp/csharp.txt",
    "cspell:aws/aws.txt",
    "cspell:fonts/fonts.txt",

To stop checking additional dictionaries, put (in the .github/actions/spelling/config.json file):

"check_extra_dictionaries": []

Forbidden patterns 🙅 (1)

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

Should be preexisting
[Pp]re[- ]existing
Errors and Warnings ❌ (2)

See the 📂 files view, the 📜action log, 👼 SARIF report, or 📝 job summary for details.

❌ Errors and Warnings Count
⚠️ check-dictionary-not-found 54
❌ forbidden-pattern 2

See ❌ Event descriptions for more information.

✏️ Contributor please read this

By default the command suggestion will generate a file named based on your commit. That's generally ok as long as you add the file to your commit. Someone can reorganize it later.

If the listed items are:

  • ... misspelled, then please correct them instead of using the command.
  • ... names, please add them to .github/actions/spelling/allow/names.txt.
  • ... APIs, you can add them to a file in .github/actions/spelling/allow/.
  • ... just things you're using, please add them to an appropriate file in .github/actions/spelling/expect/.
  • ... tokens you only need in one place and shouldn't generally be used, you can add an item in an appropriate file in .github/actions/spelling/patterns/.

See the README.md in each directory for more information.

🔬 You can test your commits without appending to a PR by creating a new branch with that extra change and pushing it to your fork. The check-spelling action will run in response to your push -- it doesn't require an open pull request. By using such a branch, you can limit the number of typos your peers see you make. 😉

If the flagged items are 🤯 false positives

If items relate to a ...

  • binary file (or some other file you wouldn't want to check at all).

    Please add a file path to the excludes.txt file matching the containing file.

    File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

    ^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

  • well-formed pattern.

    If you can write a pattern that would match it,
    try adding it to the patterns.txt file.

    Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

    Note that patterns can't match multiline strings.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants