Skip to main content

canonic/
lib.rs

1//! # canonic
2//!
3//! Versioned markdown canned-response corpus for Jira support workflows.
4//!
5//! The CLI is a thin front end. Library consumers can call the same engines:
6//!
7//! | Module | Role |
8//! |--------|------|
9//! | [`corpus`] | Walk and load `snell-*.md` responses |
10//! | [`check`] | Quality gate (prefix, sop, closings) |
11//! | [`convert`] | Pandoc markdown ↔ Jira wiki markup |
12//! | [`index`] | Tantivy BM25 search and near-duplicate pairs |
13//! | [`lint`] | Vale CLI + in-process Harper |
14//! | [`doctor`] | Tooling probes |
15//! | [`jira_import`] | Free REST probe, read import, explicit comment POST |
16//! | [`scaffold`] | New `snell-` templates and promote import → responses |
17//! | [`tui`] | Interactive ratatui corpus browser (`canonic tui`) |
18//!
19//! ## Example
20//!
21//! ```no_run
22//! use canonic::{default_corpus_dir, walk_responses, check_responses};
23//!
24//! let dir = default_corpus_dir();
25//! let responses = walk_responses(&dir).expect("read corpus");
26//! let report = check_responses(&responses);
27//! assert!(report.ok() || !report.findings.is_empty());
28//! ```
29//!
30//! Markdown under `corpus/responses/` remains the source of truth. Jira is a
31//! publication surface: convert for paste-in, import only as drafts under
32//! `corpus/imports/`, then [`scaffold::promote_to_corpus`] after review.
33
34#![doc(html_logo_url = "https://raw.githubusercontent.com/HaoZeke/canonic/main/docs/source/_static/mark.svg")]
35#![doc(html_favicon_url = "https://raw.githubusercontent.com/HaoZeke/canonic/main/docs/source/_static/favicon.svg")]
36
37pub mod check;
38pub mod convert;
39pub mod corpus;
40pub mod doctor;
41pub mod index;
42pub mod jira_import;
43pub mod lint;
44pub mod scaffold;
45pub mod tui;
46
47pub use check::{check_corpus, check_responses, format_check_report, CheckReport, REQUIRED_PREFIX};
48pub use convert::{
49    convert_jira_to_markdown, convert_markdown_to_jira, convert_path_to_jira,
50    tool_available as pandoc_available,
51};
52pub use corpus::{default_corpus_dir, load_response, walk_responses, CannedResponse};
53pub use doctor::{collect_statuses, critical_missing, format_doctor, ToolStatus};
54pub use index::{
55    default_index_dir, find_duplicates, find_duplicates_jaccard, jaccard_similarity, reindex,
56    search, self_query_for, tokenize, DedupePair, IndexDoc, SearchHit,
57};
58pub use jira_import::{
59    comment_body_to_text, default_import_dir, format_probe, import_jira, is_cloud_host,
60    plain_text_to_adf, post_comment_from_markdown, post_comment_from_markdown_with_format,
61    post_issue_comment, post_issue_comment_with_format, probe_jira, CommentBodyFormat, JiraAuth,
62    JiraConfig, JiraProbe, PostedComment,
63};
64pub use lint::{
65    format_report, lint_paths, lint_text_harper_inprocess, LintEngine, LintFinding, LintReport,
66};
67pub use scaffold::{
68    check_response_path, promote_to_corpus, resolve_response_id, scaffold_markdown, write_scaffold,
69    ScaffoldOptions, TEAM_SIGN_OFF,
70};
71pub use tui::{run_tui, App as TuiApp};