gabriel / muse public
feat patch remote task/remote-duration-ms-exit-code #1 / 1
AI Agent gabriel · 162 days ago · Apr 17, 2026 · Diff

feat(remote): add duration_ms and exit_code to all JSON responses

All 7 muse remote subcommands (list, add, remove, rename, get-url, set-url, status) now emit duration_ms and exit_code in every JSON response — success and error alike. Agents can measure latency and confirm outcomes without parsing exit codes separately.

TypedDicts updated: _RemoteListJson, _RemoteMutationJson, _RemoteGetUrlJson, _RemoteStatusJson each declare both new fields.

In JSON mode, error paths emit structured JSON to stdout only — the human-readable stderr message is suppressed so r.output remains parseable as a single JSON object.

48/48 tests GREEN across all 7 coverage tiers (Unit, Integration, End-to-end, Stress, Data integrity, Security, Performance).

sha256:3422a09e723e0f647d6942862f7fe26d0c92113c834080d518d9e740ec0177bd sha
+66 ~12 symbols
sha256:448a3a1aa37f3cf0c4bbd2f6ca7cb26eda807dfb86e8c83d46c6d079da1b8ef7 snapshot
+66
symbols added
~12
symbols modified
0
dead code introduced
Semantic Changes 78 symbols
~ tests/test_remote_supercharge.py .py 65 symbols added
+ TestEnvelopeTypes class class TestEnvelopeTypes L285–346
+ test_V1_duration_ms_is_non_negative_int_on_add method method test_V1_duration_ms_is_non_negative_int_on_add L286–292
+ test_V2_duration_ms_is_non_negative_int_on_list method method test_V2_duration_ms_is_non_negative_int_on_list L294–299
+ test_V3_duration_ms_is_non_negative_int_on_error method method test_V3_duration_ms_is_non_negative_int_on_error L301–308
+ test_V4_exit_code_is_int method method test_V4_exit_code_is_int L310–314
+ test_V5_invalid_name_exit_code_matches method method test_V5_invalid_name_exit_code_matches L316–321
+ test_V6_all_success_fields_present_add method method test_V6_all_success_fields_present_add L323–330
+ test_V7_all_success_fields_present_get_url method method test_V7_all_success_fields_present_get_url L332–339
+ test_V8_all_success_fields_present_list method method test_V8_all_success_fields_present_list L341–346
+ TestErrorEnvelope class class TestErrorEnvelope L169–221
+ test_III1_add_duplicate_error_has_envelope method method test_III1_add_duplicate_error_has_envelope L170–176
+ test_III2_add_invalid_name_error_has_envelope method method test_III2_add_invalid_name_error_has_envelope L178–184
+ test_III3_add_bad_scheme_error_has_envelope method method test_III3_add_bad_scheme_error_has_envelope L186–192
+ test_III4_remove_not_found_error_has_envelope method method test_III4_remove_not_found_error_has_envelope L194–199
+ test_III5_rename_not_found_error_has_envelope method method test_III5_rename_not_found_error_has_envelope L201–206
+ test_III6_get_url_not_found_error_has_envelope method method test_III6_get_url_not_found_error_has_envelope L208–213
+ test_III7_set_url_not_found_error_has_envelope method method test_III7_set_url_not_found_error_has_envelope L215–221
+ TestExitCodeAccuracy class class TestExitCodeAccuracy L228–278
+ test_IV1_add_success_exit_code_is_0 method method test_IV1_add_success_exit_code_is_0 L229–234
+ test_IV2_add_error_exit_code_is_1 method method test_IV2_add_error_exit_code_is_1 L236–241
+ test_IV3_remove_success_exit_code_is_0 method method test_IV3_remove_success_exit_code_is_0 L243–247
+ test_IV4_remove_error_exit_code_is_1 method method test_IV4_remove_error_exit_code_is_1 L249–253
+ test_IV5_rename_success_exit_code_is_0 method method test_IV5_rename_success_exit_code_is_0 L255–259
+ test_IV6_get_url_success_exit_code_is_0 method method test_IV6_get_url_success_exit_code_is_0 L261–265
+ test_IV7_set_url_success_exit_code_is_0 method method test_IV7_set_url_success_exit_code_is_0 L267–272
+ test_IV8_list_success_exit_code_is_0 method method test_IV8_list_success_exit_code_is_0 L274–278
+ TestPerformance class class TestPerformance L404–455
+ test_VII1_add_completes_within_limit method method test_VII1_add_completes_within_limit L407–414
+ test_VII2_list_completes_within_limit method method test_VII2_list_completes_within_limit L416–422
+ test_VII3_remove_completes_within_limit method method test_VII3_remove_completes_within_limit L424–430
+ test_VII4_get_url_completes_within_limit method method test_VII4_get_url_completes_within_limit L432–438
+ test_VII5_set_url_completes_within_limit method method test_VII5_set_url_completes_within_limit L440–447
+ test_VII6_rename_completes_within_limit method method test_VII6_rename_completes_within_limit L449–455
+ TestSecurityEnvelope class class TestSecurityEnvelope L353–397
+ test_VI1_ansi_in_name_error_has_envelope method method test_VI1_ansi_in_name_error_has_envelope L354–361
+ test_VI2_file_scheme_error_has_envelope method method test_VI2_file_scheme_error_has_envelope L363–370
+ test_VI3_oversized_name_error_has_envelope method method test_VI3_oversized_name_error_has_envelope L372–379
+ test_VI4_oversized_url_error_has_envelope method method test_VI4_oversized_url_error_has_envelope L381–387
+ test_VI5_rename_new_name_invalid_error_has_envelope method method test_VI5_rename_new_name_invalid_error_has_envelope L389–397
+ TestSuccessEnvelope class class TestSuccessEnvelope L119–162
+ test_II1_list_json_has_envelope method method test_II1_list_json_has_envelope L120–125
+ test_II2_add_json_has_envelope method method test_II2_add_json_has_envelope L127–133
+ test_II3_remove_json_has_envelope method method test_II3_remove_json_has_envelope L135–140
+ test_II4_rename_json_has_envelope method method test_II4_rename_json_has_envelope L142–147
+ test_II5_get_url_json_has_envelope method method test_II5_get_url_json_has_envelope L149–154
+ test_II6_set_url_json_has_envelope method method test_II6_set_url_json_has_envelope L156–162
+ TestTypedDictFields class class TestTypedDictFields L57–112
+ test_I1_remote_list_json_has_duration_ms method method test_I1_remote_list_json_has_duration_ms L58–63
+ test_I2_remote_list_json_has_exit_code method method test_I2_remote_list_json_has_exit_code L65–70
+ test_I3_mutation_json_has_duration_ms method method test_I3_mutation_json_has_duration_ms L72–77
+ test_I4_mutation_json_has_exit_code method method test_I4_mutation_json_has_exit_code L79–84
+ test_I5_get_url_json_has_duration_ms method method test_I5_get_url_json_has_duration_ms L86–91
+ test_I6_get_url_json_has_exit_code method method test_I6_get_url_json_has_exit_code L93–98
+ test_I7_status_json_has_duration_ms method method test_I7_status_json_has_duration_ms L100–105
+ test_I8_status_json_has_exit_code method method test_I8_status_json_has_exit_code L107–112
+ CliRunner import import CliRunner L28–28
+ annotations import import annotations L19–19
+ json import import json L21–21
+ pathlib import import pathlib L23–23
+ pytest import import pytest L26–26
+ threading import import threading L24–24
+ time import import time L22–22
+ repo function function repo L37–43
+ repo_with_origin function function repo_with_origin L47–50
+ runner variable variable runner L30–30
← Older Oldest on task/remote-duration-ms-exit-code
All commits
Newer → Latest on task/remote-duration-ms-exit-code

0 comments

No comments yet. Be the first to start the discussion.

To add a comment, use the Muse CLI: muse hub commit comment sha256:3422a09e723e0f647d6942862f7fe26d0c92113c834080d518d9e740ec0177bd --body "your comment"