eSlider
61da2fb88b
Merge pull request 'fix(files): upsert uploads by default + dedupe project root ( #45 )' ( #15 ) from fix/docs-upsert-dedupe into main
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Successful in 5s
Tests / Test (Go stable) (push) Successful in 24s
Tests / Test (Go 1.25) (push) Successful in 31s
2026-08-31 11:33:51 +01:00
eSlider and Cursor
24ca144b22
fix(files): upsert uploads by default and dedupe project root
...
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 4s
Tests / Test (Go stable) (pull_request) Successful in 25s
Tests / Test (Go 1.25) (pull_request) Successful in 27s
OnlyOffice allows duplicate stem|ext in the same folder; agents hit this
via projects files upload and put-md without --folder. Default all upload
paths to replace-by-stem, add no-clobber via --no-replace, and scan
projectFolder in dedupe.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-31 11:18:54 +01:00
eSlider
93828ee19d
Merge pull request 'feat(mailsync): FetchMailFolder — integration-layer mail walk for ETL consumers (2dph)' ( #4 ) from feat/2dph-mail-integration-layer into main
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Successful in 4s
Tests / Test (Go 1.25) (push) Successful in 29s
Tests / Test (Go stable) (push) Successful in 35s
2026-08-31 10:08:19 +01:00
mdx-1 and eSlider
35f0cb8d20
feat(mailsync): FetchMailFolder — integration-layer walk for ETL consumers
...
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 5s
Tests / Test (Go 1.25) (pull_request) Successful in 24s
Tests / Test (Go stable) (pull_request) Successful in 40s
Adds the high-level mail folder walk that sync pipelines need on top of
the raw mail API (list -> get -> download-attachment), so consumers stop
re-implementing it against private client copies.
type MailSyncMessage struct { ID, Folder, Subject, From, Date, IsNew,
HasAttachments, Attachments }
type MailSyncAttachment struct { ID, Name, Size, Body }
func (c *Client) FetchMailFolder(ctx, folderID, MailSyncOptions)
([]MailSyncMessage, error)
Options: Limit / StartIndex for checkpointed walks, FetchBodies to
eagerly download attachment bytes via download.ashx (session-cookie path).
Hydration details:
- list items may omit the attachment array; when hasAttachments is set
the full record is fetched and its attachments merged
- attachment ids accepted from id/fileId/attachmentId variants
- timestamps parsed from RFC3339 (any fractional digits) and
second-precision forms
This is the first step of the 2dph integration layer (#1 ): the brain's
mail-ingest pipeline can now drop its private OOClient copy and consume
this canonical walk directly.
Tests: httptest-backed coverage for pagination, hydration with
full-record fallback, body download incl. auth-cookie requirement,
Limit/StartIndex windows, timestamp parsing.
2026-08-31 10:05:47 +01:00
eSlider
ca5c85a4e2
Merge pull request 'chore(release): v0.16.0 — put-xlsx (excelize) ( #13 )' ( #14 ) from chore/release-v0.16.0#13 into main
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Successful in 4s
Tests / Test (Go stable) (push) Successful in 23s
Tests / Test (Go 1.25) (push) Successful in 24s
v0.16.0
2026-08-30 13:44:47 +01:00
eSlider
220c7e8265
chore(release): v0.16.0 — put-xlsx (excelize) ( #13 )
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 8s
Tests / Test (Go 1.25) (pull_request) Successful in 2m3s
Tests / Test (Go stable) (pull_request) Successful in 2m5s
2026-08-30 13:41:51 +01:00
eSlider
ff4c0481ba
Merge pull request 'feat(docs): put-xlsx с excelize — multi-sheet бюджеты (cutover-portugal)' ( #12 ) from feat/docs-put-xlsx into main
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Successful in 5s
Tests / Test (Go 1.25) (push) Successful in 2m10s
Tests / Test (Go stable) (push) Successful in 2m12s
2026-08-30 13:41:25 +01:00
eSlider and Cursor
68445b0dfd
feat(docs): put-xlsx with excelize cutover workbook
...
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 5s
Tests / Test (Go 1.25) (pull_request) Successful in 1m59s
Tests / Test (Go stable) (pull_request) Successful in 2m5s
Add internal/xlspipe (github.com/xuri/excelize/v2) and oo docs put-xlsx
to generate multi-sheet budgets with named inputs, SUM/AVG/MIN formulas,
cross-sheet links, Russian labels, and cell comments for OnlyOffice.
Template cutover-portugal: sheets Ввод, Вс 6.09, Чт 3.09, Ср гип, Сводка.
Upload via UploadProjectFileReplacing (--replace default).
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-30 13:38:27 +01:00
eSlider
8739d45b1a
Merge pull request 'chore(release): v0.15.0 — files folder-ops + docpipe ( #8 )' ( #9 ) from chore/release-v0.15.0#8 into main
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Test (Go 1.25) (push) Successful in 23s
Tests / Secret scan (gitleaks) (push) Successful in 5s
Tests / Test (Go stable) (push) Successful in 26s
v0.15.0
2026-08-29 16:19:41 +01:00
eSlider
f3150436fd
chore(release): rerun CI после gitleaks fix ( #8 )
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 4s
Tests / Test (Go 1.25) (pull_request) Successful in 23s
Tests / Test (Go stable) (pull_request) Successful in 25s
2026-08-29 16:18:42 +01:00
eSlider
a30ae20f32
Merge pull request 'fix(ci): gitleaks через бинарник (Gitea runner) ( #10 )' ( #11 ) from fix/gitleaks-gitea#10 into main
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 6s
Tests / Test (Go 1.25) (push) Successful in 21s
Tests / Secret scan (gitleaks) (push) Successful in 4s
Tests / Test (Go stable) (push) Successful in 27s
Tests / Test (Go 1.25) (pull_request) Successful in 27s
Tests / Test (Go stable) (pull_request) Successful in 31s
2026-08-29 16:14:51 +01:00
eSlider
5a0b2ab412
fix(ci): gitleaks через бинарник на $GITHUB_WORKSPACE (Gitea runner) ( #10 )
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 5s
Tests / Test (Go stable) (pull_request) Successful in 21s
Tests / Test (Go 1.25) (pull_request) Successful in 30s
2026-08-29 16:14:00 +01:00
eSlider
69844c9122
chore(release): v0.15.0 — files folder-ops + docpipe ( #8 )
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Test (Go 1.25) (pull_request) Successful in 25s
Tests / Test (Go stable) (pull_request) Successful in 34s
Tests / Secret scan (gitleaks) (pull_request) Failing after 3s
2026-08-29 16:06:47 +01:00
eSlider and GitHub
b04d610275
Merge pull request #42 from eSlider/feat/docs-optimize-gs
...
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Failing after 4s
Tests / Test (Go 1.25) (push) Successful in 20s
Tests / Test (Go stable) (push) Successful in 27s
feat(docs): Ghostscript PDF optimize for OO
2026-08-28 10:03:04 +01:00
eSlider and Cursor
6b3f40e1a1
feat(docs): optimize PDF via Ghostscript pdfwrite
...
Add oo docs optimize for native-text PDFs (OO-friendly rewrite without
ocrmypdf overlay). Default ocr --force to false when text layer exists.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-28 10:02:58 +01:00
eSlider and GitHub
ba8148a9e1
Merge pull request #41 from eSlider/fix/put-txt-fixed-width
...
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Failing after 4s
Tests / Test (Go 1.25) (push) Successful in 20s
Tests / Test (Go stable) (push) Successful in 27s
fix(docs): fixed-width txt as monospace code block
2026-08-28 09:59:59 +01:00
eSlider and Cursor
f1739dc9dc
fix(docs): put-txt uses code block for fixed-width extracts
...
INE/pdftotext -layout txt (e.g. loan-ine) opens reliably in OO as
monospace; prose txt still uses hard line breaks.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-28 09:59:34 +01:00
eSlider and GitHub
5b812ce346
Merge pull request #40 from eSlider/feat/put-txt-line-breaks
...
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Failing after 4s
Tests / Test (Go 1.25) (push) Successful in 26s
Tests / Test (Go stable) (push) Successful in 27s
feat(docs): put-txt with preserved line breaks
2026-08-28 09:58:04 +01:00
eSlider and Cursor
309ae44ee4
feat(docs): put-txt preserves line breaks in DOCX
...
TxtToMarkdown uses markdown hard breaks so pandoc keeps each source
line on its own row. Adds oo docs put-txt and projects files alias.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-28 09:57:55 +01:00
eSlider and GitHub
ff2bc539f5
Merge pull request #39 from eSlider/fix/delete-immediately
...
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Failing after 5s
Tests / Test (Go 1.25) (push) Successful in 28s
Tests / Test (Go stable) (push) Successful in 29s
fix(files): permanent delete via DeleteDavItems
2026-08-28 09:56:21 +01:00
eSlider and Cursor
d9a7adcd94
fix(files): DeleteDavItems with Immediately true
...
Soft-delete (Immediately false) failed on some project files with
"You don't have enough permission to create" when moving to Trash.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-28 09:56:10 +01:00
eSlider and GitHub
3713ed6c51
Merge pull request #37 from eSlider/feat/files-dedupe
...
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Failing after 3s
Tests / Test (Go 1.25) (push) Successful in 26s
Tests / Test (Go stable) (push) Successful in 27s
feat(files): dedupe command + stem|ext matching
2026-08-27 23:40:16 +01:00
eSlider and Cursor
ac06d86363
feat(files): dedupe by stem|ext + oo projects files dedupe
...
- FileDedupKey groups true duplicates (same name+extension)
- put-md --replace deletes matching stem|ext only (not other formats)
- oo projects files dedupe PROJECT_ID [--apply] [--cross]
- Cross-folder mode prefers non-_trash folders, keeps newest file
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-27 23:40:07 +01:00
eSlider and GitHub
7d397ac680
Merge pull request #35 from eSlider/release-please--branches--main--components--go-onlyoffice
...
chore(main): release 0.14.0
2026-08-27 23:36:54 +01:00
github-actions[bot] and GitHub
e52cb31bb7
chore(main): release 0.14.0
2026-08-27 22:36:44 +00:00
eSlider and GitHub
a8cb4e9780
Merge pull request #36 from eSlider/fix/delete-files-dav
...
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Failing after 4s
Tests / Test (Go 1.25) (push) Successful in 1m29s
Tests / Test (Go stable) (push) Successful in 1m31s
fix(files): DeleteFiles actually removes files on produktor OO
2026-08-27 23:36:19 +01:00
eSlider and Cursor
622dcdb7bf
fix(files): DeleteFiles via per-file DELETE API
...
fileops/delete returns 200 on produktor.io OO without removing files;
route DeleteFiles through DeleteDavItems so put-md --replace and oo rm work.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-27 23:36:10 +01:00
eSlider and GitHub
2b267d36a8
Merge pull request #34 from eSlider/fix/put-md-upsert
...
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Failing after 4s
Tests / Test (Go stable) (push) Successful in 1m23s
Tests / Test (Go 1.25) (push) Successful in 1m31s
fix(docs): put-md upsert — no duplicate folder files
2026-08-27 23:29:09 +01:00
eSlider and Cursor
50bd47570b
fix(docs): put-md upsert by stem to avoid duplicate folder files
...
UploadToFolderReplacing deletes same-stem files before upload (--replace,
default true). OO may still display title+fileExst as double extension.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-27 23:28:11 +01:00
eSlider and GitHub
096a996726
Merge pull request #33 from eSlider/release-please--branches--main--components--go-onlyoffice
...
chore(main): release 0.13.0
2026-08-27 17:57:02 +01:00
github-actions[bot] and GitHub
625dd0a60a
chore(main): release 0.13.0
2026-08-27 16:40:41 +00:00
eSlider and GitHub
e531de280f
Merge pull request #32 from eSlider/feat/docs-hocr
...
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Failing after 3s
Tests / Test (Go stable) (push) Successful in 1m43s
Tests / Test (Go 1.25) (push) Successful in 1m48s
feat(docs): hOCR → Markdown via go-hocr
2026-08-27 17:40:15 +01:00
eSlider and Cursor
129e3a58cc
chore: tidy go.sum after go-hocr bump
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-27 17:37:39 +01:00
eSlider and Cursor
70e605b4ca
docs(readme): document oo docs hocr
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-27 17:36:37 +01:00
eSlider and Cursor
a264cbd61c
feat(docs): oo docs hocr — tesseract hOCR → go-hocr Markdown/YAML
...
Structured OCR path for agents alongside ocrmypdf searchable PDF.
as-md --hocr selects the same pipeline for OO downloads.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-27 17:36:20 +01:00
eSlider and GitHub
a97a160c44
Merge pull request #29 from eSlider/release-please--branches--main--components--go-onlyoffice
...
chore(main): release 0.12.0
2026-08-27 17:05:08 +01:00
github-actions[bot] and GitHub
df447f2673
chore(main): release 0.12.0
2026-08-27 15:59:02 +00:00
eSlider and GitHub
db9ef12ff4
Merge pull request #31 from eSlider/feat/docs-md-ocr
...
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Failing after 4s
Tests / Test (Go 1.25) (push) Successful in 1m57s
Tests / Test (Go stable) (push) Successful in 2m1s
feat(docs): md↔docx, OCR→PDF, as-md/put-md
2026-08-27 16:58:36 +01:00
eSlider and Cursor
2c0df0d55f
fix(ci): point gitleaks at /github/workspace in docker action
...
The docker:// runner mounts the checkout at /github/workspace; using
${{ github.workspace }} (host path) made gitleaks fail with ENOENT.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-27 16:56:40 +01:00
eSlider and Cursor
239c5ea672
docs(readme): document oo docs md↔docx / OCR agent workflow
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-27 16:49:18 +01:00
eSlider and Cursor
6ea2fbadf7
feat(docs): md↔docx convert, OCR→PDF, as-md/put-md for agents
...
Add oo docs pipeline (pandoc/ocrmypdf) so agents keep Markdown locally while OnlyOffice stores versioned DOCX; OCR weak PDFs/images before returning MD. Also expose ListFolder/CreateFolder/MoveFiles/UploadToFolder.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-27 16:49:06 +01:00
eSlider
50d8974154
Merge pull request 'feat(security): secret-scan в CI + pre-push хуки ( #142 )' ( #5 ) from feat/secret-scan#142 into main
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Secret scan (gitleaks) (push) Successful in 3s
Tests / Test (Go 1.25) (push) Successful in 44s
Tests / Test (Go stable) (push) Successful in 45s
2026-08-23 22:46:45 +01:00
eSlider
3fd3f797dc
Merge pull request 'reconcile(github): sync GitHub-only commits into Gitea main ( #144 )' ( #6 ) from reconcile/github-sync#144 into main
...
Release / GoReleaser (push) Skipped
Release Please / Release Please (push) Skipped
Tests / Test (Go 1.25) (push) Successful in 50s
Tests / Test (Go stable) (push) Successful in 44s
merge(github): sync GitHub-only commits into Gitea main (#144 )
2026-08-23 19:55:48 +01:00
eSlider
0e299d0692
merge(github): bring GitHub-only commits into Gitea main ( #144 )
...
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Test (Go 1.25) (pull_request) Successful in 48s
Tests / Test (Go stable) (pull_request) Successful in 50s
Merges GitHub main content (mail-send SendMail, files ops/WebDAV,
contact-indexes CRM, history whitelist) onto Gitea main so Gitea (source
of truth) contains every commit from both sides.
2026-08-23 19:55:39 +01:00
Andriy Oblivantsev
9ead554f5c
feat(security): secret-scan via gitleaks in CI + pre-push/pre-commit hooks ( #142 )
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 4s
Tests / Test (Go 1.25) (pull_request) Successful in 48s
Tests / Test (Go stable) (pull_request) Successful in 51s
2026-08-23 19:51:06 +01:00
eSlider
77c188c640
Merge origin/main (mail-send PRs, files ops) into local main
Release Please / Release Please (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Release / GoReleaser (push) Skipped
v0.14.0
2026-08-21 22:03:04 +01:00
eSlider
2a59817f51
Merge feat/contact-indexes: crm indexes + history whitelist
2026-08-21 22:02:48 +01:00
eSlider
9c450a0352
feat(crm): contact email & person-opportunity indexes, history entity whitelist
...
- BuildContactEmailIndex: one-pass email→contact id map over all persons
(O(N) instead of per-address FindPersonByEmail O(N×M))
- BuildPersonOpportunityIndex: person→lowest-id opportunity for history notes
(OO has no person-level history; verified live)
- HistoryEntity{Opportunity,Case} whitelist constants
- IsCompany/ContactID/NumericIDLess/SortIDs helpers with unit tests
2026-08-21 22:02:47 +01:00
eSlider and GitHub
ab7dfbd859
Merge pull request #28 from eSlider/feat/mail-send
...
feat(mail): oo mails send — SendMail client + guard empty-by-id
2026-08-21 17:21:18 +01:00
eSlider
dda2bd3ca5
feat(mail): oo mails send — SendMail + guard empty-by-id send
...
- Client.SendMail: PUT /api/2.0/mail/messages/send.json, omits empty cc/bcc
- oo mails send subcommand with --id/--to/--subject/--body/--cc/--bcc
- guard: sending by --id without --body errors (send.json does not copy
subject/body from the draft; prevents empty emails)
- unit test: empty cc/bcc omitted, correct path
2026-08-21 16:43:00 +01:00