Skip to content

feat(harness-ops): read claude plugin --json output in plugins sync-run.sh instead of scraping text #6757

Description

@kyle-sexton

Context

sync-run.sh in the harness-ops plugins skill classifies what claude plugin install/update did by scraping human text ("updated from X to Y", "N userConfig option(s) not yet set") and carries its own recheck on output shape. Claude Code 2.1.268 added --json to install, uninstall, update, enable and disable (changelog item 2.1.268-007, range v2.1.265..v2.1.296). The documented envelope has command, outcome, message, plus pluginId, scope and failureCode when they apply; plugin list --json adds errorDetails and noteDetails.

Problem

Text scraping breaks when wording changes. But the docs do not document a version-change field or an unset-userConfig field, so the script cannot drop the scrape yet.

Evidence so far

Docs check on 2026-10-10 (plugins CLI reference, plugin JSON result and plugin list sections): the fields above; no old/new version and no unset-options field. No real --json output has been captured from an update or from an install with unset options (probed on Claude Code 2.1.296, 2026-10-10: not yet probed).

Open questions

  1. Does plugin update --json expose old and new versions anywhere (message only, or a field)?
  2. Does an install with unset userConfig options surface them in --json?
  3. If only message carries it, is scraping message any better than scraping text?

Acceptance criteria

  • Real --json output captured from an update that changes a version and from an install with unset options, recorded in the issue or a test fixture.
  • sync-run.sh classifies from --json fields where they exist, with the remaining scrape (if any) named and justified.
  • Existing sync tests pass against the new parsing.

References

🤖 Generated with Claude Code

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 10, 2026
  2. github-actions commented on Oct 10, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Small
    Complexity: Medium
    Uncertainty: Knowable
    Flags: none
    Blocked by: none

    Understood: you want sync-run.sh in the harness-ops plugins skill to classify install and update results from claude plugin ... --json fields instead of scraping text. The docs show no old/new version field and no unset-userConfig field, so the scrape may have to stay in part.

    The three open questions can be settled by capturing real --json output from an update that changes a version and from an install with unset options. Until that output exists, the scope of the parser change is not fixed. No likely duplicates found. #6713, #6309, #5941, #6054 and #6055 are already listed as related.

    Automated triage, applied by the lanes App.

  3. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 10, 2026
  4. removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 12, 2026
  5. kyle-sexton commented on Oct 13, 2026

    @kyle-sexton
    MemberAuthor

    Owner batch-ratified this admission in an attended session on 2026-10-12: work-class: scoped. The basis is the evidence pre-pass's agent route, with no owner input needed and no trust surface touched.

  6. added
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    priority: lowNice-to-have, cosmetic, or speculative; opportunistic.
    and removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 13, 2026
  7. github-actions commented on Oct 25, 2026

    @github-actions
    Contributor

    The triage sweep dispatched intake triage for this issue (attempt 1 of 2).

  8. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    and removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 25, 2026
  9. melodic-automation-lanes commented on Oct 25, 2026

    @melodic-automation-lanes
    Contributor

    The work-resolve-issue lane did not start this issue: it needs a person to make it clearer first.

    Why, in the run's own words:

    This issue needs real claude plugin --json output before anyone can build it, and that output cannot be captured in this lane. The first acceptance criterion asks for real --json output from (a) a claude plugin update that changes a version and (b) a claude plugin install that leaves userConfig options unset. Open questions 1 and 2 can only be answered from that output. The plugins CLI reference, re-read on 2026-10-25, still names only command, outcome and message for these results, plus pluginId, scope and failureCode when they apply. It names no old/new version field and no unset-userConfig field for install or update. This CI lane cannot run the claude CLI, so it cannot capture that output. Writing a parser against fields nobody has seen would be a guess. A person needs to do one of these: (1) run claude plugin update <id> --json on a plugin with a newer version, and claude plugin install <id> --json on a plugin whose manifest declares userConfig options you have not set (Claude Code 2.1.268 or later), then paste the last stdout line of each into the issue or a fixture; or (2) settle open question 3 with a recorded decision. For example: classify only outcome/failureCode from --json; keep the version-pair scrape, now on message; and take unset options from claude plugin configure <id> --json (unconfigured) instead of scraping the install text.

    What the run says it did not do:

    • Capturing real claude plugin update --json and claude plugin install --json output (acceptance criterion 1). This lane cannot run the claude CLI.
    • Changing how sync-run.sh classifies results, and the matching sync-run.test.sh updates. Blocked on the captured output or a recorded decision.

    Run: https://github.com/melodic-software/claude-code-plugins/actions/runs/40208763546

    To retry, answer the question here, remove needs-human and add agent-ready again.

  10. kyle-sexton commented on Oct 26, 2026

    @kyle-sexton
    MemberAuthor

    This was generated by AI.

    Routed to the host runner, not the owner. Acceptance needs real claude plugin update --json and claude plugin install --json output, which the issue lane cannot capture (https://github.com/melodic-software/claude-code-plugins/actions/runs/40208763546).

    Under the owner's 2026-10-26 stop rule, a person is needed only for a change in intent or vision, an implementation finding that changes the intent or primary design, or a high or critical security issue; host, attended and eval runs are agent work. So needs-human comes off. It moves to the host-run label, and the host runner takes it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.priority: lowNice-to-have, cosmetic, or speculative; opportunistic.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Fields

    No fields configured for Feature.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions