IW-650: issue create --json (id, number, url) #663

Merged
mph merged 18 commits from IW-650 into main 2026-10-01 10:59:02 +00:00
Member

Summary

iw issue create --json prints one JSON object {"id", "number", "url"} for the new issue and nothing else on stdout, so a program can record the issue and read it back with iw issue <id>. Exit codes do not change; without --json the human output stays as it was.

Changes

  • core/model/IssueReference.scala — pure IssueReference(id, number, url) and IssueReference.forTracker(...). Forges: id is PREFIX-n (bare number without a team prefix). Linear/YouTrack: id is the readable key, number is its numeric suffix.
  • core/adapters/LinearClient.scala — the create mutation selects identifier and returns it in place of the internal UUID, so a Linear id can be read back. Human output for Linear now shows #IWLE-123.
  • core/commands/Issue.scala — --json switch, help example, and the exit-1 doc for "created but reference not built" (stderr names the created URL; do not retry).

Testing

  • Unit: IssueReferenceTest, IssueHarnessTest (--json per tracker, failure modes, flag position, help), LinearClientCreateIssueTest, LinearClientMockTest.
  • E2E: test/issue-create.bats.
  • Phase PR #658 passed CI on the full suite.
  • Review packet: project-management/issues/IW-650/review-packet.md.

Follow-ups filed: #661 (live Linear call in a unit test), #662 (rename CreatedIssue.id to key).

Release notes

Příkaz pro založení nového úkolu v systému pro správu úkolů nyní umí vrátit výsledek ve strojově čitelné podobě. Nástroje a automatizace, které úkoly zakládají samy, si tak hned po založení spolehlivě zjistí, jaký úkol vznikl a kde ho najdou, a nemusejí přitom číst text určený lidem.

Stačí k příkazu přidat přepínač pro výstup ve formátu JSON. Příkaz pak po úspěšném založení vypíše jediný záznam se třemi údaji: označením úkolu, jeho číslem a odkazem na něj. Označení má stejnou podobu, jakou používají ostatní příkazy nástroje, například IW-650, takže ho lze rovnou použít k pozdějšímu načtení úkolu a ke sledování, zda je práce hotová. Pokud se úkol založit nepodaří, chyba se vypíše stejně jako dosud a do výsledku se nedostane nic, co by automatizace mohla mylně považovat za úspěch. Ve vzácném případě, kdy úkol vznikne, ale jeho označení se nepodaří sestavit, nástroj ve zprávě uvede odkaz na už založený úkol, aby se úkol nezakládal podruhé.

Pro uživatele systému Linear přináší změna i opravu: po založení úkolu se nyní zobrazí jeho běžné čitelné označení (například IWLE-123) místo interního identifikátoru, se kterým nebylo možné úkol znovu otevřít.

Bez nového přepínače se příkaz chová stejně jako dříve a vypisuje stejné hlášení pro lidi. Návratové kódy příkazu se nemění.

🤖 Generated with Claude Code

Closes #650

## Summary `iw issue create --json` prints one JSON object `{"id", "number", "url"}` for the new issue and nothing else on stdout, so a program can record the issue and read it back with `iw issue <id>`. Exit codes do not change; without `--json` the human output stays as it was. ## Changes - `core/model/IssueReference.scala` — pure `IssueReference(id, number, url)` and `IssueReference.forTracker(...)`. Forges: `id` is `PREFIX-n` (bare number without a team prefix). Linear/YouTrack: `id` is the readable key, `number` is its numeric suffix. - `core/adapters/LinearClient.scala` — the create mutation selects `identifier` and returns it in place of the internal UUID, so a Linear id can be read back. Human output for Linear now shows `#IWLE-123`. - `core/commands/Issue.scala` — `--json` switch, help example, and the exit-1 doc for "created but reference not built" (stderr names the created URL; do not retry). ## Testing - Unit: `IssueReferenceTest`, `IssueHarnessTest` (`--json` per tracker, failure modes, flag position, help), `LinearClientCreateIssueTest`, `LinearClientMockTest`. - E2E: `test/issue-create.bats`. - Phase PR #658 passed CI on the full suite. - Review packet: `project-management/issues/IW-650/review-packet.md`. Follow-ups filed: #661 (live Linear call in a unit test), #662 (rename `CreatedIssue.id` to `key`). ## Release notes Příkaz pro založení nového úkolu v systému pro správu úkolů nyní umí vrátit výsledek ve strojově čitelné podobě. Nástroje a automatizace, které úkoly zakládají samy, si tak hned po založení spolehlivě zjistí, jaký úkol vznikl a kde ho najdou, a nemusejí přitom číst text určený lidem. Stačí k příkazu přidat přepínač pro výstup ve formátu JSON. Příkaz pak po úspěšném založení vypíše jediný záznam se třemi údaji: označením úkolu, jeho číslem a odkazem na něj. Označení má stejnou podobu, jakou používají ostatní příkazy nástroje, například IW-650, takže ho lze rovnou použít k pozdějšímu načtení úkolu a ke sledování, zda je práce hotová. Pokud se úkol založit nepodaří, chyba se vypíše stejně jako dosud a do výsledku se nedostane nic, co by automatizace mohla mylně považovat za úspěch. Ve vzácném případě, kdy úkol vznikne, ale jeho označení se nepodaří sestavit, nástroj ve zprávě uvede odkaz na už založený úkol, aby se úkol nezakládal podruhé. Pro uživatele systému Linear přináší změna i opravu: po založení úkolu se nyní zobrazí jeho běžné čitelné označení (například IWLE-123) místo interního identifikátoru, se kterým nebylo možné úkol znovu otevřít. Bez nového přepínače se příkaz chová stejně jako dříve a vypisuje stejné hlášení pro lidi. Návratové kódy příkazu se nemění. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Closes #650
issue create: machine-readable output (id, url)

Artifacts:
- analysis.md
- issue.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolved:
- analysis.md: E2E happy path for issue create --json → Option A, stub gh on PATH (explicit exception to the no-mocks-in-E2E rule for this test)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
issue create: machine-readable output (id, url)

Artifacts:
- tasks.md
- review-state.json (tasks_ready)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Issue: IW-650
Phase: 1 - Issue reference + `issue create --json`

This commit marks the checkpoint for phase 1 context generation.
Use wf-implement IW-650 to return to this point.

Decision (Michal): the exit-1 help text names the reference-build
failure and tells the caller not to retry when the error names the
URL of a created issue (analysis Risk 4).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Issue reference + `issue create --json`

Artifacts:
- phase-01-tasks.md
- phase-01-context.md: Linear test classes live in package iw.tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Issue reference + issue create --json
All checks were successful
CI / changes (pull_request) Successful in 4s
CI / contract (pull_request) Has been skipped
CI / format (pull_request) Successful in 10s
CI / lint (pull_request) Successful in 12s
CI / compile (pull_request) Successful in 1m38s
CI / dashboard-build (pull_request) Successful in 1m15s
CI / test (pull_request) Successful in 15m40s
7e9a4ef98a
- IssueReference model: {id, number, url} built per tracker from the created issue's key
- Linear create returns the readable identifier instead of the internal UUID
- issue create --json prints one JSON object; a created-but-unreadable reference names the URL and says not to retry
- Harness, unit and BATS tests; false-green missing-url test fixed in review
Reviewed-on: #658
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs(IW-650): add review packet and release notes
Some checks failed
CI / changes (pull_request) Successful in 5s
CI / contract (pull_request) Has been skipped
CI / format (pull_request) Successful in 10s
CI / lint (pull_request) Successful in 12s
CI / test (pull_request) Has been cancelled
CI / dashboard-build (pull_request) Has been cancelled
CI / compile (pull_request) Has been cancelled
e0b0bd5637
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chore(IW-650): update review-state to all_complete
All checks were successful
CI / changes (pull_request) Successful in 4s
CI / contract (pull_request) Has been skipped
CI / format (pull_request) Successful in 9s
CI / lint (pull_request) Successful in 14s
CI / compile (pull_request) Successful in 1m38s
CI / dashboard-build (pull_request) Successful in 1m18s
CI / test (pull_request) Successful in 15m40s
985362150b
mph merged commit 03b3d4e352 into main 2026-10-01 10:59:02 +00:00
Sign in to join this conversation.
No description provided.