tix-tracker 0.12.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: "analytics_metadata",
            description: "The closed vocabularies, formulas and binding rules this build's analytics surface answers with: the scope kinds (`cycle`/`milestone`), every mode with its formula version, precision and whether it needs a unit, the units the project's **default board** declares a conversion for, the coverage markers, the projection statuses, the export format marker and schema version, and every diagnostic kind with its remedy. No CLI counterpart — `tix analytics` has three verbs and no capability read — so this exists to tell a caller what is possible **before** it folds anything, and every entry is the shared vocabulary's own (`ScopeKind::ALL`, `Mode::ALL`, …), never a list kept here. Read-only; a value the vocabulary does not have is `null`, never a `0`.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {}
            }),
        },
        ToolDescriptor {
            name: "analytics_burndown",
            description: "The daily burndown series for one cycle or milestone, in count or estimate mode (`tix analytics burndown`). The `content` text is that command's stdout byte for byte, and `structuredContent` is the shared chart document it was rendered from: the scope, period, snapshot binding, mode, unit and formula version, the ordered daily points (`scope_total`, `remaining`, `completed`, `scope_added`, `completions`, each `null` where the record cannot answer, with the day's `coverage`), the coverage tally, and every finding. **`null` is not `0`** (C-005): an unobserved day has no additions and an unanswerable level has no value; the coverage marker says which. Refused, in the CLI's own words, when the fold answers no day at all — an unenumerable period, or estimate mode with a unit the project declares no conversion for — and for an unknown scope/mode or a malformed date, before any fold runs. Read-only: no issue, cycle, milestone or snapshot is opened for writing.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "scope": { "type": "string", "enum": ["cycle", "milestone"], "description": "The scope kind the `id` names, from the closed vocabulary. Anything else is refused by name." },
                    "id": { "type": "string", "description": "The scope's planning identity: a cycle name or its stable id, or a milestone name. A generated cycle's name and its stable id select the same scope." },
                    "from": { "type": "string", "description": "The series' inclusive start, `YYYY-MM-DD`. Replaces the scope's own start; a value after `to` is refused with the shared period reason." },
                    "to": { "type": "string", "description": "The series' inclusive end, `YYYY-MM-DD`. Replaces the scope's own planning end." },
                    "mode": { "type": "string", "enum": ["count", "estimate"], "description": "How the series counts. `count` (the default) is issue counts; `estimate` converts each member's estimate through the project's declared unit conversion. Anything else is refused by name." },
                    "unit": { "type": "string", "description": "The unit estimate mode counts in — one the project's default board declares a conversion for. Required in estimate mode (a missing one is `missing_conversion`); count mode is unitless and ignores it, exactly as the CLI does." }
                },
                "required": ["scope", "id"]
            }),
        },
        ToolDescriptor {
            name: "analytics_export",
            description: "The deterministic local chart document for one cycle or milestone (`tix analytics export`), as the pretty JSON document on stdout. The `content` text is that command's stdout bytes exactly, and `structuredContent` is the same document as an object: the format marker and `schema_version`, the scope with its period and snapshot provenance, the mode, unit and precision, the series' ordered daily points with their coverage markers and `null`s, the optional projection, the coverage tally (the unknown/coverage-limited day counts), and the findings — including each configured `gitlab`/`linear` target that cannot carry a chart document. `mode` is **required** here, as the CLI requires `--mode`: the document states the mode it was folded in and a default would be a guess about which arithmetic produced the numbers. Deterministic and read-only: the same repository state produces byte-identical output, and nothing is written (the CLI's own `--output` path is the one writer, and this tool returns the document instead). The remote export namespaces are never consulted.",
            input_schema: json!({
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "scope": { "type": "string", "enum": ["cycle", "milestone"], "description": "The scope kind the `id` names." },
                    "id": { "type": "string", "description": "The scope's planning identity: a cycle name or its stable id, or a milestone name." },
                    "mode": { "type": "string", "enum": ["count", "estimate"], "description": "How the document's series was folded: `count` or `estimate`. Required — the document records it as the arithmetic it was built with." },
                    "unit": { "type": "string", "description": "The unit estimate mode counts in; required in estimate mode, ignored in count mode." },
                    "from": { "type": "string", "description": "The series' inclusive start, `YYYY-MM-DD`." },
                    "to": { "type": "string", "description": "The series' inclusive end (and, with `as_of`, the planning end the forecast is drawn against), `YYYY-MM-DD`." },
                    "as_of": { "type": "string", "description": "Ask the same document for a forecast at this origin, a `YYYY-MM-DD` calendar date. Omit for a document with no projection." }
                },
                "required": ["scope", "id", "mode"]
            }),
        },
    ]
}