Release: cheers:compose, codemap polish, plugins gallery page#248
Merged
Conversation
Field report #3: a module loc pointed at a DIRECTORY (server/src/gateway) — natural for module nodes, but the probe only used the file endpoint, where directories surface as E_IS_DIR or, on some connectors, as not-found. So: - wsLocate treats E_IS_DIR as a hit and, after a file-endpoint miss, confirms candidates with a tree listing before ruling them out; resolution now returns {path, kind} and a directory jump opens the workspace folder view (the dialog's deep-link already lists dirs). - Line anchors only apply to files. - map.yaml header guide gains the strongest lever against invented paths: VERIFY the path exists (ls it) before writing loc, and prefer a representative file + #L<line> over a bare directory. Template seed regenerated byte-identical. - Renderer search also matches loc paths. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pressing Enter to pick a candidate from a Chinese (or Japanese/Korean) IME sent the message instead, committing the raw pinyin. While an IME is composing, the browser still fires keydown for Enter and marks it isComposing — the keystroke belongs to the candidate popup, not to us. Nothing checked that flag, so the composer read "confirm this word" as "send". Add a shared isComposing() helper (nativeEvent.isComposing, plus the legacy keyCode 229 some browsers still emit) and guard on it. In the composer the guard sits at the top of handleKeyDown rather than on the send branch alone: the @// picker also claims Enter/Arrow/Escape, and those keys navigate the IME popup while it is open. Apply the same guard to the other Enter-to-submit text inputs that had the identical bug: new channel/workspace/session dialogs, the workbench file-name input, the kanban task input, and friend lookup. Password fields are left alone — browsers disable IME there. Verified against the in-cluster gateway by driving the real composer with a keydown carrying isComposing: true, A/B'd by stashing the fix. Before: draft cleared (sent). After: draft kept; a normal Enter still sends, and exactly one message was persisted across both dispatches. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ent messages
Renderer plugins can now PREFILL the channel composer (plugin -> host
cheers:compose {text}); nothing is ever sent on the plugin's behalf.
The human's send keystroke is what turns a suggestion into a channel
action — side effects stay human-in-the-loop, audit-visible, and
behind the existing bot approval gates. Enables ChatOps-style boards
(click Deploy -> composer holds '@ops deploy web-1 test' -> review ->
send).
- MessageComposer gains a prefill prop: an empty draft is filled, a
typed draft gets the text appended on a new line (user text is never
lost); @Label tokens matching mentionables are registered as picked
mentions — routing's source of truth — so the suggestion actually
reaches its bot; focus + cursor-to-end.
- SandboxRenderer shape-gates the message (string, <=4000 chars,
control chars stripped) and threads it via ctx.composeMessage to
ChannelView, which owns the composer.
- Protocol docs (EN normative + zh) and the SDK gain the message /
compose(text).
- codemap example: the detail drawer gains '让 bot 讲讲这个模块' —
the mention is derived from the node's loc handle (the bot that
wrote the loc is the bot that knows the code).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fix(frontend): don't send on Enter while an IME is composing
ChatOps server dashboard over an agent-maintained ops/servers.yaml: control-machine model (bot = the machine that SSHes into servers, via routing, unreachable≠down), lean cards (status badges + flags, details in a drawer), lucide-style icons, deploy via cheers:compose prefill. Design artifact for the upcoming ops-board plugin/template pair. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New website/plugins.html — the plugin column: what a workbench plugin is (one sandboxed HTML file), the three-step try/install/preinstalled story, a gallery of the four official plugins (descriptions from their actual manifests) and the docs/arch examples (codemap, paper tracker, code review board, starter kit + SDK), the one-line security model, and links into the dev guide + normative spec. Download links serve from ./downloads/plugins/*, assembled by pages.yml at build time from the sources of truth (server/assets/workbench-plugins + docs/arch/examples) — no duplicate copies in git. The workflow also triggers on changes to those paths so downloads stay fresh. Every page's nav gains a Plugins entry; plugin-dev's self-link now points here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n-7f752f feat(codemap+website): locator/compose polish, plugins gallery page, ops-board design
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
develop → main (see #246) —
🤖 Generated with Claude Code