feat: channels + SubAgent finishing + harness-project split#33
Merged
Conversation
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>
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.
Summary
Integration PR bundling several in-flight feature threads on
feat/channels-next:ChannelDispatchertrait,OutboundMessage/ChannelInstance/ChannelBindingvalue types, store traits. Shared vocabulary betweenharness-tools(channel.send),harness-store(persistence), andharness-server(adapter registry).harness-server: DingTalk, Feishu, WeCom (webhook + app), OAuth callback routes, channels_inbound_routes. Companionapps/jarvis/src/channels_cli.rsfor CLI registration.channel.sendtool wired to ChannelDispatcher.extra_args: Vec<String>field onClaudeCodeConfig+ composition-root wire-up forJARVIS_SUBAGENT_CLAUDE_CODE_ARGS;POST /v1/requirements/:id/reviewmanual reviewer trigger reusingauto_mode::spawn_background_run(promoted topub); env-override hint under built-in subagent cards in Settings → Agents; docs alignment indocs/proposals/subagents.zh-CN.mdandCLAUDE.md(JARVIS_REVIEW_MODE→ actualJARVIS_REVIEWER_AUTO_ACCEPT; removed phantom Activity kinds; added manual endpoint reference).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.locklines. 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— cleancargo test --workspace --exclude jarvis-desktop— exit 0claude_code::tests::extra_args_*(3 tests: serde roundtrip, legacy-JSON default, Command args assembly order) — passSettings → 子智能体env-hint footer renders all 5JARVIS_SUBAGENT_*codesPOST /v1/requirements/:id/reviewagainst a Review-status Requirement (needsJARVIS_DB_URL+ seeded data — recommend reviewer runsjarvis-dev-build+ curl 202 / 409 / 404 / 503 paths)Reviewer notes
crates/harness-core/src/{activity,comment,doc,label,project,project_memory,requirement,requirement_run}.rsaregit mv'd tocrates/harness-project/src/— diff should be mostly clean rename.crates/harness-core/src/observability.rsmoved tocrates/harness-observability/src/lib.rs.crates/harness-core/src/channel_{binding,instance}.rsdeleted (moved into newharness-channelcrate).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