tix-tracker 0.11.0

A terminal issue tracker: markdown + YAML frontmatter issues with a kanban TUI and CLI
Documentation
#[allow(clippy::wildcard_imports)]
use super::*;

#[allow(clippy::too_many_lines)]
pub(super) fn descriptors() -> Vec<ToolDescriptor> {
    vec![
        ToolDescriptor {
            name: "list_recurring_series",
            description: "List the recurring series stored in the issue tree (`tix recurring list`), one row per series in stable-ID order: the immutable `id`, the display `name`, the lifecycle `state`, the `next_cursor`, how many dates it skipped, and the rule in words. Read-only. This is the index the CLI, the board's due warning and the Schedule page all build, so a series missing here is missing everywhere.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {}
            }),
        },
        ToolDescriptor {
            name: "get_recurring_series",
            description: "Return one series' full state (`tix recurring show`): identity and metadata, the rule and its anchor, the cursor, the skipped dates, the dates already generated, and every inconsistency the index found. `series` is the stable ID (from `list_recurring_series`), or a display name that names exactly one series — an ambiguous name is refused rather than guessed. Read-only.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "series": { "type": "string", "description": "Stable series ID, or a display name that names exactly one series." }
                },
                "required": ["series"]
            }),
        },
        ToolDescriptor {
            name: "detect_recurring_due",
            description: "Report which occurrences are due (`tix recurring detect`): every due warning with its stable `occurrence_key`, due date, series and rule in words, plus a note naming why a series that was examined is *not* due (paused, ended, cursor already taken). Read-only, and non-mutating by contract: detection creates no issue, appends no History and changes no series — the board's start/refresh warning and this call are the same detector's answer. `date` is the explicit date context; omitted, the boundary resolves today.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "date": { "type": "string", "description": "The date context, `YYYY-MM-DD`. Omitted: today, resolved at the boundary. Pass it for a reproducible answer." },
                    "timezone": { "type": "string", "description": "The timezone the date context carries, e.g. `+01:00` or `UTC`. It is carried on the context, exactly as `tix recurring detect --timezone` carries it; a *series rule* that stores a named IANA zone is a different case and is refused by the shared validator, because a daylight-saving transition makes a local date ambiguous." }
                }
            }),
        },
        ToolDescriptor {
            name: "generate_recurring_occurrence",
            description: "Create the occurrence a series is due for (`tix recurring generate`). Requires `confirm: true`; without it nothing is written and the refusal names the missing confirmation. `date` is the explicit occurrence date — the key is `<series-id>@<date>`. Idempotent: a key that already has an occurrence, or that the series recorded as skipped, returns `status: \"no-op\"` and writes nothing. On success the occurrence, its link to the series and the series' cursor are one transaction, and one History entry records the generation.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "series": { "type": "string", "description": "Stable series ID, or a display name that names exactly one series." },
                    "date": { "type": "string", "description": "The occurrence date, `YYYY-MM-DD`." },
                    "confirm": { "type": "boolean", "description": "Must be true. Without it nothing is generated and the refusal names the missing confirmation." },
                    "actor": { "type": "string", "description": "Who is acting, for the History entry. Default: the boundary's actor (the git identity)." }
                },
                "required": ["series", "date", "confirm"]
            }),
        },
        ToolDescriptor {
            name: "pause_recurring_series",
            description: "Suspend generation for a series (`tix recurring pause`): its state becomes `paused` and one History entry records the decision. Requires `confirm: true`. Idempotent: an already-paused series returns `status: \"no-op\"` and appends nothing, and no refresh, timer or detection ever applies this — only a confirmed call does.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "series": { "type": "string", "description": "Stable series ID, or a display name that names exactly one series." },
                    "confirm": { "type": "boolean", "description": "Must be true. Without it nothing changes and the refusal names the missing confirmation." },
                    "actor": { "type": "string", "description": "Who is acting, for the History entry. Default: the boundary's actor (the git identity)." },
                    "reason": { "type": "string", "description": "Why, recorded verbatim in the History entry." }
                },
                "required": ["series", "confirm"]
            }),
        },
        ToolDescriptor {
            name: "resume_recurring_series",
            description: "Resume a paused series (`tix recurring resume`): its state becomes `active` and one History entry records the decision. Never inferred from a refresh, and never automatic. Requires `confirm: true`. Idempotent: an already-active series returns `status: \"no-op\"` and appends nothing.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "series": { "type": "string", "description": "Stable series ID, or a display name that names exactly one series." },
                    "confirm": { "type": "boolean", "description": "Must be true. Without it nothing changes and the refusal names the missing confirmation." },
                    "actor": { "type": "string", "description": "Who is acting, for the History entry. Default: the boundary's actor (the git identity)." },
                    "reason": { "type": "string", "description": "Why, recorded verbatim in the History entry." }
                },
                "required": ["series", "confirm"]
            }),
        },
        ToolDescriptor {
            name: "end_recurring_series",
            description: "End a series (`tix recurring end`): `ended` is terminal for generation, and every action but `end` itself is refused on an ended series. Requires `confirm: true`. Idempotent: an already-ended series returns `status: \"no-op\"` and appends nothing. The issue that is the series is not deleted — ending is a lifecycle decision, not a removal.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "series": { "type": "string", "description": "Stable series ID, or a display name that names exactly one series." },
                    "confirm": { "type": "boolean", "description": "Must be true. Without it nothing changes and the refusal names the missing confirmation." },
                    "actor": { "type": "string", "description": "Who is acting, for the History entry. Default: the boundary's actor (the git identity)." },
                    "reason": { "type": "string", "description": "Why, recorded verbatim in the History entry." }
                },
                "required": ["series", "confirm"]
            }),
        },
        ToolDescriptor {
            name: "skip_recurring_occurrence",
            description: "Record one occurrence date as skipped (`tix recurring skip`), so it is never generated: the date joins the series' `skipped` set and the cursor moves past it. `date` is the occurrence date, required — skip is about one date, and an occurrence that already exists cannot be skipped. Requires `confirm: true`. Idempotent: an already-skipped date returns `status: \"no-op\"` and appends nothing. `ignore` has the same schedule effect; the two differ in the decision the History entry records.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "series": { "type": "string", "description": "Stable series ID, or a display name that names exactly one series." },
                    "date": { "type": "string", "description": "The occurrence date to skip, `YYYY-MM-DD`." },
                    "confirm": { "type": "boolean", "description": "Must be true. Without it nothing changes and the refusal names the missing confirmation." },
                    "actor": { "type": "string", "description": "Who is acting, for the History entry. Default: the boundary's actor (the git identity)." },
                    "reason": { "type": "string", "description": "Why, recorded verbatim in the History entry." }
                },
                "required": ["series", "date", "confirm"]
            }),
        },
        ToolDescriptor {
            name: "defer_recurring_occurrence",
            description: "Move the series' cursor past one occurrence date without creating it (`tix recurring defer`): the occurrence is not generated and the date is **not** recorded as skipped, so the rule may produce it again on a later cursor. `date` is required. Requires `confirm: true`. Idempotent: a cursor already past that date returns `status: \"no-op\"` and appends nothing.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "series": { "type": "string", "description": "Stable series ID, or a display name that names exactly one series." },
                    "date": { "type": "string", "description": "The occurrence date to defer, `YYYY-MM-DD`." },
                    "confirm": { "type": "boolean", "description": "Must be true. Without it nothing changes and the refusal names the missing confirmation." },
                    "actor": { "type": "string", "description": "Who is acting, for the History entry. Default: the boundary's actor (the git identity)." },
                    "reason": { "type": "string", "description": "Why, recorded verbatim in the History entry." }
                },
                "required": ["series", "date", "confirm"]
            }),
        },
        ToolDescriptor {
            name: "ignore_recurring_occurrence",
            description: "Stop offering one occurrence date (`tix recurring ignore`): recorded like `skip`, as a decision, so the date joins the series' `skipped` set. `date` is required and an occurrence that already exists cannot be ignored. Requires `confirm: true`. Idempotent: an already-recorded date returns `status: \"no-op\"` and appends nothing. `skip` has the same schedule effect; the two differ in the decision the History entry records.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "series": { "type": "string", "description": "Stable series ID, or a display name that names exactly one series." },
                    "date": { "type": "string", "description": "The occurrence date to ignore, `YYYY-MM-DD`." },
                    "confirm": { "type": "boolean", "description": "Must be true. Without it nothing changes and the refusal names the missing confirmation." },
                    "actor": { "type": "string", "description": "Who is acting, for the History entry. Default: the boundary's actor (the git identity)." },
                    "reason": { "type": "string", "description": "Why, recorded verbatim in the History entry." }
                },
                "required": ["series", "date", "confirm"]
            }),
        },
    ]
}