Комментарии 8
Было бы прикольно, но всё это прекрасно делается в emacs (и в нём же делается вообще всё остальное).
И release notes для него пишут люди, и читать их возможно.
У меня пять каналов, по которым прилетают задачи: YT, почта (MS Exchange + Outlook), созвоны, совещания и PDM. Задолбавшись в какой-то момент переключаться между этим зоопарком, тоже подумывал о такой штуке. Прототип в Excel не взлетел. Пока у тебя пять задач, это нормально. Когда у тебя их 25 и больше - кранты. Поэтому со вздохом расчехлил Obsidian и стал сводить все задачи туда. Ограниченное количество статусов, сроки и другие информационные поля. И - самое главное - удобная стартовая страница с нужными мне выборками по полям с помощью DataView. Плюс Templater для упрощения заведения новых заметок. И наконец смог вздохнуть спокойно... Только вот по независящим от меня причинам поток задач снизился вчетверо, если не больше. Поэтому оценить эффективность системы не могу.
А вы не пробовали собрать в виде webassemly? Ушли бы вопросы с деплоем. Хотя могут повылазить всякие platform-specific штуки.
И да, почему вы состояние храните в json? Можно же тот же SQLite заюзать?
я C++ Qt разработчик и как же я не люблю этот QStringLiteral... С точки зрения захламления исходного кода, тестов и тд
Для сравнения
До
ProviderDescriptor redmine() {
ProviderDescriptor d;
d.id = QStringLiteral("redmine"); // stable: it keys settings and secrets
d.displayName = QStringLiteral("Redmine");
d.uiFields = {plain(QStringLiteral("host"), QStringLiteral("Host"), QStringLiteral("https://redmine.example.com")),
secret(QStringLiteral("token"), QStringLiteral("API key"))};
d.requiredKeys = {QStringLiteral("host"), QStringLiteral("token")};
d.secretKeys = {QStringLiteral("token")}; // keychain, never state.json
d.baseUrlTemplate = QStringLiteral("{host}");
d.auth.kind = AuthKind::CustomHeader;
d.auth.headerName = "X-Redmine-API-Key";
d.listPathTemplate = QStringLiteral("/issues.json?assigned_to_id=me&status_id=open&limit=100");
d.paging.style = PageStyle::Offset;
d.paging.offsetParam = QStringLiteral("offset");
d.paging.pageSize = 100;
d.fields.arrayPointer = QStringLiteral("issues");
d.fields.id = QStringLiteral("id");
d.fields.title = QStringLiteral("subject");
d.fields.status = QStringLiteral("status.name"); // dot-paths into one issue object
d.fields.urlTemplate = QStringLiteral("{baseUrl}/issues/{id}");
d.fields.dueAt = QStringLiteral("due_date");
return d; // pull-only
}После
ProviderDescriptor redmine() {
ProviderDescriptor d;
d.id = "redmine"; // stable: it keys settings and secrets
d.displayName = "Redmine";
d.uiFields = {plain("host", "Host", "https://redmine.example.com"),
secret("token", "API key")};
d.requiredKeys = {"host", "token"};
d.secretKeys = {"token"}; // keychain, never state.json
d.baseUrlTemplate = "{host}";
d.auth.kind = AuthKind::CustomHeader;
d.auth.headerName = "X-Redmine-API-Key";
d.listPathTemplate = "/issues.json?assigned_to_id=me&status_id=open&limit=100";
d.paging.style = PageStyle::Offset;
d.paging.offsetParam = "offset";
d.paging.pageSize = 100;
d.fields.arrayPointer = "issues";
d.fields.id = "id";
d.fields.title = "subject";
d.fields.status = "status.name"; // dot-paths into one issue object
d.fields.urlTemplate = "{baseUrl}/issues/{id}";
d.fields.dueAt = "due_date";
return d; // pull-only
}А не думали взять какой-нибудь Tauri вместо Qt? Или пойти по пути comma ai и переписать весь gui на raylib?

Задачи из Jira и GitHub, встречи и заметки в одном окне: полгода соло‑разработки на Qt 6 / C++20