Skip to content

Release: cheers:compose, codemap polish, plugins gallery page#248

Merged
haowei2000 merged 7 commits into
mainfrom
develop
Jul 17, 2026
Merged

Release: cheers:compose, codemap polish, plugins gallery page#248
haowei2000 merged 7 commits into
mainfrom
develop

Conversation

@haowei2000

Copy link
Copy Markdown
Collaborator

develop → main (see #246) —

  • cheers:compose host verb: plugins prefill the composer, humans send; @mentions register as routable picks; codemap drawer gains "让 bot 讲讲这个模块".
  • codemap polish: directory locators open the folder view (tree-confirmed probing), verify-before-write prompt rule, renderer search matches loc paths.
  • website: new Plugins gallery page with official + example plugin downloads (assembled at build time by pages.yml); Plugins nav entry on every page. Pages deploys on this merge.
  • ops-board v3 design artifact (docs/arch).

🤖 Generated with Claude Code

haowei2000 and others added 7 commits July 17, 2026 11:32
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
@haowei2000
haowei2000 merged commit bd5f666 into main Jul 17, 2026
11 checks passed
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.

1 participant