diff --git a/veans/.golangci.yml b/veans/.golangci.yml index 2528088aa..c14dab5ab 100644 --- a/veans/.golangci.yml +++ b/veans/.golangci.yml @@ -92,11 +92,11 @@ linters: - gosec path: e2e/ text: 'G(204|306|703):' - # .veans.yml is committed to the repo and intentionally world- - # readable; 0o644 is correct. + # .veans.yml + agent hook config files are committed to the repo + # and intentionally world-readable; 0o644 is correct. - linters: - gosec - path: internal/config/config\.go + path: internal/(config|bootstrap)/.*\.go text: 'G306:' formatters: enable: diff --git a/veans/AGENTS.md b/veans/AGENTS.md index b5ab906c0..3545fa055 100644 --- a/veans/AGENTS.md +++ b/veans/AGENTS.md @@ -60,6 +60,16 @@ what's bitten me; if a new endpoint behaves oddly, suspect one of these: `valid:"required"` upstream; sending it omitted or zero fails validation. Use `client.FarFuture` (year 9999) when you mean "no expiry" — the frontend does the same. +- **Task descriptions and comments are HTML, not markdown.** The + Vikunja web UI uses TipTap, which calls `getHTML()` on save. The + stored field is therefore HTML. The agent prompt template + (`internal/commands/prompt.tmpl`) teaches agents the canonical + TipTap shapes — most importantly `'` +- For surgical edits, prefer `--description-replace-old` / + `--description-replace-new`. To check off a task item, replace + `data-checked="false">

step 1

` with `data-checked="true">

step 1

` + (errors if the old text isn't unique — same semantics as the Edit tool). - Post a comment on significant decisions, discoveries, or course-changes: - `veans update {{ .TaskIDExample }} --comment "Discovered Y; pivoting to Z because …"` + `veans update {{ .TaskIDExample }} --comment '

Discovered Y; pivoting to Z because …

'` - For sub-work that could be assigned separately, create real subtasks - via `--parent`. For incremental check-off lists, use markdown checkboxes + via `--parent`. For incremental check-off lists, use task-list items in the description instead. ## AFTER you finish work - Move to `in-review` and post a summary comment. **Never close tasks yourself** — the human (or the merge hook) closes them. ``` - veans update {{ .TaskIDExample }} -s in-review --comment "## Summary of Changes - - … - - …" + veans update {{ .TaskIDExample }} -s in-review \ + --comment '

Summary of Changes

' ``` - If you abandon work, scrap the task with a reason: `veans update {{ .TaskIDExample }} -s scrapped --reason "obsolete: "` @@ -49,6 +50,83 @@ fix: handle empty project identifiers Refs: {{ .TaskIDExample }} ``` +# Description format + +**Descriptions and comments are HTML, not markdown.** Vikunja's web UI +renders them through the TipTap rich-text editor, which interprets the +stored field as HTML. Plain markdown saves as literal text and shows up +ugly in the UI; write HTML directly. Tokens are cheap, conversion bugs +aren't. + +**Titles are plaintext — not HTML, not markdown.** They show up in +list views, breadcrumbs, and notification subjects; tags would leak +through as `<p>…</p>` everywhere. Write +`fix the bug` not `

fix the bug

` or `**fix** the bug`. + +Canonical TipTap shapes the web UI renders cleanly: + +```html +

Summary

+

Two short paragraphs explaining the task.

+ +

Steps

+ + +

Notes

+ + +

Inline code, bold, italic, +and a link.

+ +
if err != nil { return err }
+ +

A quote, e.g. from a linked issue.

+ +
+``` + +Important details: +- Task-list items use `