Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
{
"name": "darrow-tickets",
"source": "./plugins/capability/darrow-tickets",
"description": "Ticket skills with a bundled GitHub Issues adapter: create-ticket, read-ticket, update-ticket, list-tickets"
"description": "Ticket operations and reusable GitHub issue templates with a bundled GitHub Issues adapter"
},
{
"name": "darrow-readiness-gate",
Expand Down
32 changes: 32 additions & 0 deletions .github/ISSUE_TEMPLATE/bug-fix-regression.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
name: Bug fix with regression coverage
about: Fix a reproduced bug and retain evidence that it stays fixed
---

## Observed

<!-- Record the incident evidence and the behavior that fails. -->

## Expected

<!-- State the expected behavior from the request or an authoritative source. -->

## Reproduction

<!-- Give the known steps, input, command, or failing test. If insufficient, say what is missing. -->

## Done criteria

- [ ] Demonstrate the original failure with the supplied reproducer or a regression test.
- [ ] Make a bounded fix for that failure.
- [ ] Run the same reproducer or regression test after the fix.
- [ ] Retain durable regression coverage and before/after evidence.
- [ ] Report insufficient reproduction evidence as a blocker to verified repair.

## Before and after evidence

<!-- Record the failing result and the passing result for the same behavior. -->

## Open questions

<!-- Record missing incident, expected-behavior, or reproduction facts. -->
23 changes: 23 additions & 0 deletions .github/ISSUE_TEMPLATE/dependency-upgrade.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
name: Dependency upgrade
about: Upgrade a dependency with evidence that affected behavior remains compatible
---

## Outcome

<!-- Identify the dependency, its current version, and the intended target version. -->

## Done criteria

- [ ] Inspect the relevant changelog or release notes for the requested update.
- [ ] Identify repository-relevant breaking changes and migration requirements.
- [ ] Update the dependency and affected code or configuration.
- [ ] Verify behavior affected by the upgrade and record compatibility evidence.

## Compatibility evidence

<!-- Name the affected behavior, its expected result, and the check that will demonstrate it. -->

## Open questions

<!-- Record any unknown dependency, version, release-note source, or affected usage. -->
23 changes: 23 additions & 0 deletions .github/ISSUE_TEMPLATE/retirement.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
name: Retirement
about: Retire a named behavior or dependency without leaving hidden obligations
---

## Outcome

<!-- Identify the feature, dependency, flag, or compatibility layer and its authorized removal scope. -->

## Done criteria

- [ ] Remove the authorized implementation and configuration paths.
- [ ] Update or remove affected tests and documentation.
- [ ] Address migration obligations for users or callers.
- [ ] Show that removal is complete and retained behavior still functions.

## Remaining obligations or blockers

<!-- Record any work that cannot be completed within the authorized scope. -->

## Open questions

<!-- Record any unknown target, scope, or migration obligation. -->
1 change: 1 addition & 0 deletions docs/choosing-plugins.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ alone; its README owns its prerequisites, behavior, and safety rules.
| Verify implementation acceptance through independent assessment | [Verification](../plugins/capability/darrow-verification/README.md) |
| Create a branch, commit, or pull request | [Git](../plugins/capability/darrow-git/README.md) |
| Read, list, create, or update GitHub issues | [Tickets](../plugins/capability/darrow-tickets/README.md) |
| Install reusable GitHub issue templates | [Tickets](../plugins/capability/darrow-tickets/README.md#install-ticket-templates) |
| Understand technical structure in a compact visual | [Explanation](../plugins/capability/darrow-explanation/README.md) |
| Export Codex turn telemetry to Langfuse | [Langfuse observability](../plugins/capability/darrow-observability-langfuse/README.md) |
| Organize repository agent guidance | [Information architecture](../plugins/foundation/darrow-information-architecture/README.md) |
Expand Down
60 changes: 57 additions & 3 deletions docs/specs/ticket-management.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ creating and updating tickets is consistent, traceable, and backend-neutral
regardless of which agent runtime executes them and which tracker backs them.

Plugin: `darrow-tickets`. Skills: `create-ticket`, `read-ticket`,
`update-ticket`, `list-tickets`. The bundled GitHub Issues provider is the
only shipped tracker adapter. Other trackers may be added inside this plugin.
`update-ticket`, `list-tickets`, and `install-ticket-templates`. The bundled
GitHub Issues provider is the only shipped tracker adapter. Other trackers may
be added inside this plugin.

Scope: mechanics only. These skills record and mutate tickets; they do not
refine requirements, plan or break down work, or review solutions. Those
Expand Down Expand Up @@ -47,7 +48,7 @@ stable intent ("create a ticket for X") while the backend stays swappable.
remain static and nonmutating, perform no repository or tracker inspection,
preserve provider boundaries, and leave workflow and authority in the skill.

- **TM-P1 — One self-contained ticket plugin.** The four skills and all tracker
- **TM-P1 — One self-contained ticket plugin.** The five skills and all tracker
adapters live in `darrow-tickets`. The shipped adapter is GitHub Issues via
`gh`. Future trackers extend this contained Python package; no sibling plugin,
shared runtime, or external provider registry is required. Only the selected
Expand Down Expand Up @@ -76,6 +77,50 @@ stable intent ("create a ticket for X") while the backend stays swappable.
bound to the resolved origin host and repository independently of ambient
`GH_HOST` or `GH_REPO` configuration.

## GitHub issue templates

The plugin bundles three GitHub Markdown issue templates. Installation is a
separate, explicitly requested local repository operation; it does not create a
ticket or authorize delivery. The templates use the ordinary `create-ticket`
body headings so both human-authored and agent-created issues can carry the
same task requirements.

- **TM-T1 — Task-specific requirements.** The dependency-upgrade template asks
for the dependency and target version, relevant changelog or release notes,
repository-relevant breaking changes and migration work, and compatibility
evidence for affected behavior. The retirement template asks for the exact
removal target and authorized scope, covers implementation, configuration,
tests, documentation and migration obligations, and calls for evidence that
removal is complete and retained behavior works. The bug-fix template asks
for incident evidence, observed and expected behavior, a reproducer, a
bounded fix, durable regression coverage and before/after evidence. Missing
reproduction evidence remains an explicit blocker to a verified repair.
- **TM-T2 — Additive installation.** `install-ticket-templates` installs the
bundled templates into the named repository's `.github/ISSUE_TEMPLATE/`.
It creates absent files, leaves identical files unchanged, and preserves
differing files, symlinks, directories, and unrelated templates without
overwriting them. It reports absolute paths and each created, unchanged or
preserved result. An unreadable or unusable target, including a case-variant
filename that conflicts with a bundled path, refuses the operation.
Installing templates changes local files only; it does not create issues,
commit, push, or start `ticket-to-pr`.
- **TM-T3 — Installed template is authoritative.** `create-ticket` discovers
the current repository's GitHub Markdown templates and YAML issue forms,
including files supplied or customized by its users. It inspects an explicitly
named template, or selects one whose stated purpose matches the requested
issue; ambiguous matches require a caller choice. The created ticket retains
the selected template's applicable criteria and evidence requests. It never
substitutes the bundled copy for a missing or unreadable installed template.
Without a matching installed template, the existing type-based drafting rules
apply. Factual inputs come only from the request, conversation or repository;
missing versions, removal scope, reproduction details and other facts remain
explicit rather than invented. Template inspection does not create a ticket
or start delivery.
- **TM-T4 — Same-path adoption.** Darrow installs the bundled templates with
the same public installation operation offered to other repositories. The
resulting checked-in templates are ordinary repository files, not a plugin
runtime dependency or a separate ticket store.

## Relations contract

Tickets relate in two ways: `depends-on` (this ticket is blocked by
Expand Down Expand Up @@ -174,6 +219,15 @@ decompose a broad request into tickets on its own.
created tickets remain visible, and no automatic rollback or second creation
attempt occurs. A skipped item does not prevent independent items from
proceeding. Never substitute a missing batch relation target.
- **TM-C11 — Installed template use.** After duplicate checking and before
drafting each GitHub issue, inspect available repository templates and any
requested or matching template. Retain its applicable criteria, evidence
requests, and local customizations in the created body while satisfying the
chosen ticket type's required headings. A missing template uses TM-C3; an
unreadable or unsafe installed template stops that item before creation.
Ordinary bug reports without a requested fix need not select the bundled
regression-fix template. Unknown factual inputs remain open questions,
never guessed values or claimed evidence.

### Non-goals

Expand Down
4 changes: 2 additions & 2 deletions plugins/capability/darrow-tickets/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "darrow-tickets",
"description": "Ticket skills with a bundled GitHub Issues adapter: create-ticket, read-ticket, update-ticket, list-tickets",
"version": "0.6.4",
"description": "Ticket operations and reusable GitHub issue templates with a bundled GitHub Issues adapter",
"version": "0.7.0",
"hooks": "./.claude-plugin/hooks.json",
"license": "BUSL-1.1",
"author": {
Expand Down
11 changes: 6 additions & 5 deletions plugins/capability/darrow-tickets/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
{
"name": "darrow-tickets",
"version": "0.6.4",
"description": "Ticket skills with a bundled GitHub Issues adapter: create-ticket, read-ticket, update-ticket, list-tickets",
"version": "0.7.0",
"description": "Ticket operations and reusable GitHub issue templates with a bundled GitHub Issues adapter",
"author": {
"name": "Björn Rochel"
},
"skills": "./skills/",
"interface": {
"displayName": "Darrow -> Tickets",
"shortDescription": "Create, read, find, and update tickets",
"longDescription": "Create one well-formed ticket or an explicit finite batch, retrieve one exact ticket, find relevant open work, and apply one verified update through the bundled GitHub Issues adapter.",
"shortDescription": "Manage tickets and install issue templates",
"longDescription": "Create, read, find, and update GitHub tickets, and install reusable issue templates for dependency upgrades, retirement, and regression fixes.",
"developerName": "Björn Rochel",
"category": "Productivity",
"capabilities": ["Interactive", "Read", "Write"],
"defaultPrompt": [
"Create a ticket for this problem.",
"Read ticket #42.",
"List the open bugs for this project.",
"Close the ticket for this completed work."
"Close the ticket for this completed work.",
"Install Darrow's GitHub issue templates in this repository."
]
}
}
42 changes: 37 additions & 5 deletions plugins/capability/darrow-tickets/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# Darrow Tickets

This independently installable plugin provides everyday ticket operations. Four
skills decide what the user means and how to present evidence; one contained
Python package selects a tracker adapter and performs the requested operation.
This independently installable plugin provides everyday ticket operations and
reusable GitHub issue templates. Five skills decide what the user means and how
to present evidence; one contained Python package supplies the tracker adapter
and local template operations.
GitHub Issues through `gh` is the only bundled adapter in this release.

The operation skills and CLI shape remain stable as adapters are added inside
Expand Down Expand Up @@ -31,9 +32,21 @@ distinct tickets. It checks each item for a plausible duplicate, selects its
type, uses the tracker's existing label taxonomy, structures its body,
preserves unknowns as open questions, and records only caller-named relations.
It verifies requested relations after creation and reports every batch outcome.
For a matching issue, it reads an installed Markdown template or YAML issue
form, including user-defined templates and local customizations, and retains
its acceptance and evidence requirements.

Example: _“File a bug for the failing CSV import.”_

### `install-ticket-templates`

Adds three GitHub Markdown templates to a target repository's
`.github/ISSUE_TEMPLATE/`: dependency upgrade, retirement, and bug fix with
regression coverage. It preserves existing files and customizations, reports
each resulting path, and does not create an issue or start delivery.

Example: _“Install Darrow's issue templates in this repository.”_

### `list-tickets`

Runs one read-only query using only the state, type, label, milestone, topic,
Expand Down Expand Up @@ -61,7 +74,7 @@ Example: _“Comment on #42 with the failing command.”_

### `darrow-ticket`

A contained Python facade used by all four skills. Its public argument parser
A contained Python facade used by the four ticket-operation skills. Its public argument parser
preserves provider-owned identifiers, selects one bundled adapter, and then
dispatches one operation. Shared validation covers ticket body structure and
attribution. The GitHub adapter owns numeric IDs, repository resolution, `gh`
Expand Down Expand Up @@ -95,6 +108,22 @@ Exit codes: 2 input/filesystem error, 3 unusable backend, 4 provider failure,
5 invalid title, 6 attribution, 7 body structure, 8 label error, 9 state refusal,
64 unknown or missing command.

### `darrow-ticket-templates`

The same contained package exposes local template commands, without tracker
access:

```text
uv run --quiet --no-project "<plugin-root>/backend/scripts/run_locked.py" darrow-ticket-templates install --repo <absolute-repository-root>
uv run --quiet --no-project "<plugin-root>/backend/scripts/run_locked.py" darrow-ticket-templates list --repo <absolute-repository-root>
uv run --quiet --no-project "<plugin-root>/backend/scripts/run_locked.py" darrow-ticket-templates show --repo <absolute-repository-root> --file <installed-filename>
```

`install` creates absent bundled files and leaves identical, modified, and
unrelated files alone. `list` and `show` read the repository's installed
Markdown templates and YAML forms, including user-defined ones. `create-ticket`
does not silently use a bundled default when a repository has not adopted it.

## Design boundaries

- `create-ticket` may create an explicitly requested finite batch of distinct
Expand All @@ -105,6 +134,8 @@ Exit codes: 2 input/filesystem error, 3 unusable backend, 4 provider failure,
milestone, or assignee.
- Ticket content contains repository or user evidence, never invented versions,
reproduction steps, acceptance criteria, or AI attribution.
- Matching installed templates supply task-specific acceptance criteria, not
factual values or permission to start the work in a ticket.
- `read-ticket` and `list-tickets` are strictly read-only, and `update-ticket`
applies only the single mutation requested.
- A selected adapter is the only tracker contacted. Adding another adapter must
Expand Down Expand Up @@ -167,7 +198,8 @@ or use `/darrow-tickets:read-ticket` in Claude Code, followed by your request.
## Expected result

Read and list return tracker evidence without changes. Create reports each
requested ticket outcome; update performs one requested mutation.
requested ticket outcome; update performs one requested mutation. Template
installation reports local file changes without contacting GitHub.

## Troubleshooting

Expand Down
1 change: 1 addition & 0 deletions plugins/capability/darrow-tickets/backend/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ dependencies = []

[project.scripts]
darrow-ticket = "darrow_tickets.cli:entrypoint"
darrow-ticket-templates = "darrow_tickets.templates:entrypoint"
darrow-tickets-claude-context = "darrow_tickets.claude_context:main"

[dependency-groups]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
The installed Darrow ticket skills own requests to create, list, read, or update
tickets through a bundled tracker adapter. GitHub Issues is currently the only
tickets through a bundled tracker adapter. The install-ticket-templates skill
owns requests to add the bundled GitHub issue templates to a repository.
GitHub Issues is currently the only
bundled tracker. When it is selected or no tracker is established, invoke the
matching installed skill before repository inspection, tracker access,
clarification, or your final response. Select from the installed descriptions;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
name: Bug fix with regression coverage
about: Fix a reproduced bug and retain evidence that it stays fixed
---

## Observed

<!-- Record the incident evidence and the behavior that fails. -->

## Expected

<!-- State the expected behavior from the request or an authoritative source. -->

## Reproduction

<!-- Give the known steps, input, command, or failing test. If insufficient, say what is missing. -->

## Done criteria

- [ ] Demonstrate the original failure with the supplied reproducer or a regression test.
- [ ] Make a bounded fix for that failure.
- [ ] Run the same reproducer or regression test after the fix.
- [ ] Retain durable regression coverage and before/after evidence.
- [ ] Report insufficient reproduction evidence as a blocker to verified repair.

## Before and after evidence

<!-- Record the failing result and the passing result for the same behavior. -->

## Open questions

<!-- Record missing incident, expected-behavior, or reproduction facts. -->
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
name: Dependency upgrade
about: Upgrade a dependency with evidence that affected behavior remains compatible
---

## Outcome

<!-- Identify the dependency, its current version, and the intended target version. -->

## Done criteria

- [ ] Inspect the relevant changelog or release notes for the requested update.
- [ ] Identify repository-relevant breaking changes and migration requirements.
- [ ] Update the dependency and affected code or configuration.
- [ ] Verify behavior affected by the upgrade and record compatibility evidence.

## Compatibility evidence

<!-- Name the affected behavior, its expected result, and the check that will demonstrate it. -->

## Open questions

<!-- Record any unknown dependency, version, release-note source, or affected usage. -->
Loading
Loading