feat: issue detail CLI/MCP/REST act panel with syntax highlighting and copy buttons
- Add REST tab to issue detail act panel (curl API examples) - Switch all snippets from br/nbsp HTML to clean <pre><code> blocks - Syntax highlighting via highlight.js (bash + javascript, design-system token overrides) - Per-snippet copy buttons injected by JS, top-right positioned, 2s confirmation - Idempotency guards on close_issue / reopen_issue service functions - Update SSR tests: replace stale 'Act via CLI' assertions with semantic content checks - All 18 issue detail SSR tests passing
sha256:b55224ca9c1d85450182407e56ffebdee04df6b309599af4e5a4a7ac5493e39c
sha
+188
~56
−1
symbols
sha256:e04bee24f25c44aefc2156ae2047c06a3b8e16cd4cdaee1a0a2a4e6ef597c1a5
snapshot
+188
symbols added
~56
symbols modified
−1
symbol removed
0
dead code introduced
Semantic Changes
245 symbols
+
test_anchor_already_in_to_branch_not_matched
function
async_function test_anchor_already_in_to_branch_not_matched L155–178
+
test_anchor_at_depth_2_from_from_branch
function
async_function test_anchor_at_depth_2_from_from_branch L182–206
+
test_anchor_exclusively_on_from_branch_matches
function
async_function test_anchor_exclusively_on_from_branch_matches L127–151
+
test_empty_anchors_returns_empty
function
async_function test_empty_anchors_returns_empty L118–123
+
test_merged_proposal_not_returned
function
async_function test_merged_proposal_not_returned L234–253
+
test_multiple_open_proposals_only_matching_returned
function
async_function test_multiple_open_proposals_only_matching_returned L289–318
+
test_short_anchor_prefix_resolved
function
async_function test_short_anchor_prefix_resolved L210–230
+
test_unresolved_anchor_returns_empty
function
async_function test_unresolved_anchor_returns_empty L257–265
+
test_anchor_unresolved_returns_empty
function
async_function test_anchor_unresolved_returns_empty L279–288
+
test_empty_anchors_returns_empty
function
async_function test_empty_anchors_returns_empty L116–122
+
test_merged_proposal_matched_depth_1
function
async_function test_merged_proposal_matched_depth_1 L126–149
+
test_merged_proposal_matched_depth_2
function
async_function test_merged_proposal_matched_depth_2 L153–178
+
test_no_match_when_anchor_not_in_graph
function
async_function test_no_match_when_anchor_not_in_graph L210–229
+
test_open_proposal_matched_via_branch
function
async_function test_open_proposal_matched_via_branch L182–206
+
test_proposals_from_other_repo_not_returned
function
async_function test_proposals_from_other_repo_not_returned L256–275
+
test_comment_body_at_limit_accepted
function
async_function test_comment_body_at_limit_accepted L232–240
+
test_comment_body_empty_rejected
function
async_function test_comment_body_empty_rejected L256–264
+
test_comment_body_over_limit_rejected
function
async_function test_comment_body_over_limit_rejected L244–252
+
test_issue_body_at_limit_accepted
function
async_function test_issue_body_at_limit_accepted L47–54
+
test_issue_body_over_limit_rejected
function
async_function test_issue_body_over_limit_rejected L58–65
+
test_issue_commit_anchor_item_too_long_rejected
function
async_function test_issue_commit_anchor_item_too_long_rejected L216–223
+
test_issue_commit_anchors_at_limit_accepted
function
async_function test_issue_commit_anchors_at_limit_accepted L190–199
+
test_issue_commit_anchors_too_many_rejected
function
async_function test_issue_commit_anchors_too_many_rejected L203–212
+
test_issue_label_item_at_limit_accepted
function
async_function test_issue_label_item_at_limit_accepted L134–141
+
test_issue_label_item_too_long_rejected
function
async_function test_issue_label_item_too_long_rejected L123–130
+
test_issue_labels_at_limit_accepted
function
async_function test_issue_labels_at_limit_accepted L101–108
+
test_issue_labels_too_many_rejected
function
async_function test_issue_labels_too_many_rejected L112–119
+
test_issue_symbol_anchor_item_too_long_rejected
function
async_function test_issue_symbol_anchor_item_too_long_rejected L174–181
+
test_issue_symbol_anchors_at_limit_accepted
function
async_function test_issue_symbol_anchors_at_limit_accepted L150–158
+
test_issue_symbol_anchors_too_many_rejected
function
async_function test_issue_symbol_anchors_too_many_rejected L162–170
+
test_issue_title_at_limit_accepted
function
async_function test_issue_title_at_limit_accepted L74–81
+
test_issue_title_over_limit_rejected
function
async_function test_issue_title_over_limit_rejected L85–92
+
test_label_assign_item_too_long_rejected
function
async_function test_label_assign_item_too_long_rejected L285–293
+
test_label_assign_too_many_rejected
function
async_function test_label_assign_too_many_rejected L273–281
+
test_update_body_over_limit_rejected
function
async_function test_update_body_over_limit_rejected L302–310
+
test_update_labels_too_many_rejected
function
async_function test_update_labels_too_many_rejected L314–322
+
test_update_symbol_anchors_too_many_rejected
function
async_function test_update_symbol_anchors_too_many_rejected L326–334
+
test_create_proposal_populates_touched_symbols
function
async_function test_create_proposal_populates_touched_symbols L194–221
+
test_merge_proposal_refreshes_touched_symbols
function
async_function test_merge_proposal_refreshes_touched_symbols L225–274
+
test_symbol_overlap_cross_repo_isolation
function
async_function test_symbol_overlap_cross_repo_isolation L354–379
+
test_symbol_overlap_empty_anchors_returns_empty
function
async_function test_symbol_overlap_empty_anchors_returns_empty L341–350
+
test_symbol_overlap_open_proposal_matched
function
async_function test_symbol_overlap_open_proposal_matched L383–409
+
test_symbol_overlap_returns_match
function
async_function test_symbol_overlap_returns_match L283–310
+
test_symbols_from_delta_deduplicates
function
function test_symbols_from_delta_deduplicates L155–161
+
test_symbols_from_delta_extracts_symbol_addresses
function
function test_symbols_from_delta_extracts_symbol_addresses L124–132
+
test_symbols_from_delta_handles_non_dict
function
function test_symbols_from_delta_handles_non_dict L149–152
+
test_symbols_from_delta_skips_file_level_ops
function
function test_symbols_from_delta_skips_file_level_ops L135–146
+
test_touched_symbols_for_branch_extracts_from_commits
function
async_function test_touched_symbols_for_branch_extracts_from_commits L170–190
+
test_blob_page_json_contains_symbol_lines_key
function
async_function test_blob_page_json_contains_symbol_lines_key L213–222
+
test_enrich_adds_lineno_for_known_function
function
function test_enrich_adds_lineno_for_known_function L93–96
+
test_enrich_does_not_overwrite_existing_lineno
function
function test_enrich_does_not_overwrite_existing_lineno L111–114
+
test_enrich_ignores_symbol_not_in_ast
function
function test_enrich_ignores_symbol_not_in_ast L123–126
+
test_issue_detail_multiple_symbol_anchors_all_linked
function
async_function test_issue_detail_multiple_symbol_anchors_all_linked L189–204
+
test_issue_detail_symbol_anchor_link_contains_hash_fragment
function
async_function test_issue_detail_symbol_anchor_link_contains_hash_fragment L165–172
+
test_issue_detail_symbol_anchor_plain_file_no_fragment
function
async_function test_issue_detail_symbol_anchor_plain_file_no_fragment L176–185
+
test_symbol_line_map_excludes_falsy_lineno
function
function test_symbol_line_map_excludes_falsy_lineno L153–156
+
test_symbol_line_map_excludes_symbols_without_lineno
function
function test_symbol_line_map_excludes_symbols_without_lineno L143–150
+
test_symbol_line_map_returns_display_name_to_lineno
function
function test_symbol_line_map_returns_display_name_to_lineno L134–140
+
find_proposals_by_branch_reachability
function
async_function find_proposals_by_branch_reachability L719–853
+
find_proposals_by_symbol_overlap
function
async_function find_proposals_by_symbol_overlap L859–911
~
func
~
select
+
test_close_already_closed_issue_is_idempotent
function
async_function test_close_already_closed_issue_is_idempotent L691–742
+
test_close_returns_current_state_without_db_write_when_already_closed
function
async_function test_close_returns_current_state_without_db_write_when_already_closed L800–850
+
test_reopen_already_open_issue_is_idempotent
function
async_function test_reopen_already_open_issue_is_idempotent L746–796
+
test_reopen_returns_current_state_without_db_write_when_already_open
function
async_function test_reopen_returns_current_state_without_db_write_when_already_open L854–903
0 comments
To add a comment, use the Muse CLI:
muse hub commit comment sha256:b55224ca9c1d85450182407e56ffebdee04df6b309599af4e5a4a7ac5493e39c --body "your comment"
No comments yet. Be the first to start the discussion.