Skip to content

feat: channels + SubAgent finishing + harness-project split#33

Merged
TYRMars merged 2 commits into
mainfrom
feat/channels-next
May 14, 2026
Merged

feat: channels + SubAgent finishing + harness-project split#33
TYRMars merged 2 commits into
mainfrom
feat/channels-next

Conversation

@TYRMars
Copy link
Copy Markdown
Owner

@TYRMars TYRMars commented May 14, 2026

Summary

Integration PR bundling several in-flight feature threads on feat/channels-next:

  • harness-channel crate extracted — ChannelDispatcher trait, OutboundMessage / ChannelInstance / ChannelBinding value types, store traits. Shared vocabulary between harness-tools (channel.send), harness-store (persistence), and harness-server (adapter registry).
  • Channel adapters in harness-server: DingTalk, Feishu, WeCom (webhook + app), OAuth callback routes, channels_inbound_routes. Companion apps/jarvis/src/channels_cli.rs for CLI registration.
  • harness-tools: new channel.send tool wired to ChannelDispatcher.
  • jarvis-web: OAuth result page, channels settings, sidebar/composer refinements, hint UI under built-in subagents in Settings → Agents.
  • harness-project crate split out of harness-core — Project / Requirement / RequirementRun / Activity / Comment / Label / DocProject / ProjectMemory + their 8 store traits. Decouples Work-feature persistence from the agent loop.
  • harness-observability crate split out of harness-core — Eval* (suite runs / verdicts / baselines) + Observed* (run / span / metric / dashboard) value types and persistence traits.
  • SubAgent system finishing (this session): extra_args: Vec<String> field on ClaudeCodeConfig + composition-root wire-up for JARVIS_SUBAGENT_CLAUDE_CODE_ARGS; POST /v1/requirements/:id/review manual reviewer trigger reusing auto_mode::spawn_background_run (promoted to pub); env-override hint under built-in subagent cards in Settings → Agents; docs alignment in docs/proposals/subagents.zh-CN.md and CLAUDE.md (JARVIS_REVIEW_MODE → actual JARVIS_REVIEWER_AUTO_ACCEPT; removed phantom Activity kinds; added manual endpoint reference).
  • Cleanup: remove unused svelte-learn/ playground.

Why bundled

These threads grew together on the same branch and share workspace-level Cargo manifest changes (new crate members, dep edits). Splitting now would mean three PRs whose merge order is fragile against the same Cargo.toml / Cargo.lock lines. The harness-project / harness-observability splits are also load-bearing for the channel work (Project store traits live in harness-project now), so they ride together.

Test plan

  • cargo clippy --workspace --all-targets --exclude jarvis-desktop -- -D warnings — clean
  • cargo test --workspace --exclude jarvis-desktop — exit 0
  • New claude_code::tests::extra_args_* (3 tests: serde roundtrip, legacy-JSON default, Command args assembly order) — pass
  • Web preview verified Settings → 子智能体 env-hint footer renders all 5 JARVIS_SUBAGENT_* codes
  • Manual end-to-end of POST /v1/requirements/:id/review against a Review-status Requirement (needs JARVIS_DB_URL + seeded data — recommend reviewer runs jarvis-dev-build + curl 202 / 409 / 404 / 503 paths)
  • Manual smoke of each channel adapter (DingTalk / Feishu / WeCom / WeCom App / OAuth callback) against staging webhook endpoints

Reviewer notes

  • crates/harness-core/src/{activity,comment,doc,label,project,project_memory,requirement,requirement_run}.rs are git mv'd to crates/harness-project/src/ — diff should be mostly clean rename.
  • crates/harness-core/src/observability.rs moved to crates/harness-observability/src/lib.rs.
  • crates/harness-core/src/channel_{binding,instance}.rs deleted (moved into new harness-channel crate).
  • Composition root (apps/jarvis/src/serve.rs + apps/jarvis/src/subagents.rs) is the only place env vars are read; library crates remain env-free per CLAUDE.md.

🤖 Generated with Claude Code

TYRMars and others added 2 commits May 14, 2026 18:51
Bundles several in-flight feature threads on feat/channels-next into a
single integration PR:

- harness-channel crate extracted (ChannelDispatcher trait, OutboundMessage /
  ChannelInstance / ChannelBinding value types, store traits)
- New channel adapters in harness-server: DingTalk, Feishu, WeCom (webhook +
  app), OAuth callback routes, channels_inbound_routes
- harness-tools: new channel.send tool talking to ChannelDispatcher
- jarvis-web: OAuth result page, channels settings section, sidebar /
  composer refinements
- harness-project crate split out of harness-core (Project / Requirement /
  RequirementRun / Activity / Comment / Label / DocProject / ProjectMemory)
- harness-observability crate split out of harness-core (Eval* + Observed*
  value types and store traits)
- SubAgent finishing: extra_args field on ClaudeCodeConfig +
  JARVIS_SUBAGENT_CLAUDE_CODE_ARGS env wiring, POST /v1/requirements/:id/review
  manual reviewer trigger, AgentsSection env-override hint, docs alignment
  (subagents.zh-CN.md and CLAUDE.md sync to actual env names)
- Remove unused svelte-learn/ playground (cleanup)

Verified with cargo clippy --workspace --all-targets --exclude jarvis-desktop
-- -D warnings (clean) and cargo test --workspace --exclude jarvis-desktop
(exit 0).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ESLint's @typescript-eslint/require-await fails the CI build when an
`async` function body has no `await`. The fetch mock's outer factory
and inner `json` are synchronous; wrap their return values in
Promise.resolve() instead.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@TYRMars TYRMars merged commit 58e122f into main May 14, 2026
1 check 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