diff --git a/inbox-work/TASK-20260829-1400-redmine-cli.md b/inbox-work/TASK-20260829-1400-redmine-cli.md new file mode 100644 index 0000000..6cca240 --- /dev/null +++ b/inbox-work/TASK-20260829-1400-redmine-cli.md @@ -0,0 +1,47 @@ +# TASK: mopac-redmine-go — Redmine Go CLI, TOP PRIORITY (Redmine 506) + +## Context +Charles's strict self-hosting directive: "working out of redmine with a +go cli." The PMO (and every vertical) must STOP using python glue for +Redmine updates — this CLI replaces it the moment it lands. Jumped to +the top of the queue 2026-08-29 by direct order. + +## Scope +1. New repo `ukrrs/mopac-redmine-go` (create via Gitea API if absent — + tea token pattern; clone to ~/projects/meta/MOPAC/redmine-go). + AGPLv3 LICENSE first commit. +2. Stdlib-only Go library + CLI binary `mred`: + - Config: URL + API key via env (`MRED_URL`, `MRED_KEY`) or + `--config` env-file (0600 discipline), key never logged. + - Commands (JSON-friendly flags, machine-parseable `-o json`): + - `issue list -p MOPAC [--status open|all] [--version Beta] [--limit N]` + - `issue show ID [--with journals]` + - `issue create -p PROJ -s SUBJECT [--desc FILE|-] [--tracker feature]` + `[--priority immediate] [--category X] [--version V] [--due DATE]` + `[--parent ID] [--est HOURS] [--note TEXT]` + - `issue update ID [--status done] [--priority ...] [--category ...]` + `[--version ...] [--due ...] [--done-ratio 100] [--desc FILE|-]` + `[--note TEXT]` (note = journal) + - `version list|create -p PROJ -n NAME [--due DATE] [--status open|closed]` + - `category list|create -p PROJ -n NAME` + - `relation create FROM TO --type blocks|relates` + - Exit codes: 0 ok, 1 usage/config, 2 API error (status in stderr, + one line, parseable). +3. Library surface usable by the harness later (`redmine.Client`) — + no copy-paste temptation. +4. Fake-Redmine test suite (table-driven; the harness repo's fake server + pattern is a good reference): create/update/note/relations/versions + round-trips, key-redaction, error mapping. +5. Docs standard: README with verified quickstart (against the fake + server), command reference table, status table. + +## Build discipline +ALL DEV IN DOCKER (digest-pinned builder; dev.sh/Makefile family +pattern). NEVER broad pkill. Atomic conventional commits, push origin +main. TDD red/green. + +## Deliverable +`REPORT-20260829-1400-redmine-cli.md` in `~/.coordinate/inbox-pmo/`: +command surface, test results, and EXACT PMO replacement mappings (the +python operations I use today -> mred one-liners) so the PMO switches on +acceptance with zero downtime. diff --git a/log.md b/log.md index abc895d..b293abf 100644 --- a/log.md +++ b/log.md @@ -86,3 +86,4 @@ 2026-08-29T06:19:13-05:00 | PMO | 497 amended: per-account BW scale (100+ refs), one bootstrap seed per account, batch warm + memory cache 2026-08-29T06:19:29-05:00 | PMO | 497 corrected: BW machine accounts map to CLOUDRON accounts (per-vertical API identities), not raw Linux accounts 2026-08-29T06:20:17-05:00 | PMO | identity model ticket filed (linux runtime + cloudron acting, N per account); 497 corrected +2026-08-29T06:21:06-05:00 | PMO | identity model FINAL: 1:1 linux->BW vault (cloudron+3rd-party entries); acting identity selected per task/turn, stamped on all actions + usage diff --git a/logs/loop-alpha.log b/logs/loop-alpha.log new file mode 100644 index 0000000..83803a1 --- /dev/null +++ b/logs/loop-alpha.log @@ -0,0 +1,10 @@ +harness: loop: vertical=demo poll=2m0s state=state/loop redmine=projects.knownelement.com (SIGINT to stop) +harness: intake: 3 task(s) in redmine scope +harness: loop: scan: 3 task(s) in scope, 3 new/updated +harness: loop: dispatch 520 (updated 2026-08-29T06:23:26-05:00): "Alpha: V1 core summary note on 483" +harness: task 520 (redmine): "Alpha: V1 core summary note on 483" class=study -> mopac-study -> glm-4.7-flash +harness: REPORT reports/REPORT-demo-520-20260829-112526.md +harness: loop: status New -> Resolved on #520 +harness: loop: noted REPORT on #520 +harness: loop: dispatch 519 (updated 2026-08-29T06:23:26-05:00): "Alpha: draft briefing v0 format as note on 495" +harness: task 519 (redmine): "Alpha: draft briefing v0 format as note on 495" class=study -> mopac-study -> glm-4.7-flash diff --git a/logs/q-briefing.log b/logs/q-briefing.log index bffa33a..10bd21f 100644 --- a/logs/q-briefing.log +++ b/logs/q-briefing.log @@ -1 +1 @@ -Context gathered. Setting up the task list, then finishing recon (Redmine 495, deploy template, remotes).Redmine 495 confirms scope and repo name `ukrrs/mopac-discourse-go`. Creating the Gitea repo now.Repo created (id 428). Cloning and checking the push credential pattern.Recon complete. Building the client repo now.Now the typed surfaces: categories, topics, posts.Now the fake-server test suite:Now the CLI:Now the fake server for the smoke test, plus dev.sh/Makefile/env.example:The smoke.sh has ordering bugs — rewriting it cleanly:Check gate green. Running the end-to-end smoke:Smoke OK. Writing the README and pushing the client:Now the live verification (before the README's claims stand):Live checks match the known state (reads 200, create 403). Committing and pushing the client:Part A complete. Wiring the dependency into the harness:Expected — nothing imports it yet. Writing Part B code first, then vendoring. Checking the TOML helpers:Now adding `BriefConfig` to the harness config:Now the Default, apply, and Validate entries:Now the Validate block — checking the current tail of Validate first:Extending the intake client with the windowed issue listing:Now the brief package core:Now delivery + orchestration:Now the Run orchestrator:Wiring the subcommand into main.go:Now the brief package test suite — fake Redmine, Gitea, and Discourse:Now config tests for `[brief]`, then vendoring and the check gate: \ No newline at end of file +Context gathered. Setting up the task list, then finishing recon (Redmine 495, deploy template, remotes).Redmine 495 confirms scope and repo name `ukrrs/mopac-discourse-go`. Creating the Gitea repo now.Repo created (id 428). Cloning and checking the push credential pattern.Recon complete. Building the client repo now.Now the typed surfaces: categories, topics, posts.Now the fake-server test suite:Now the CLI:Now the fake server for the smoke test, plus dev.sh/Makefile/env.example:The smoke.sh has ordering bugs — rewriting it cleanly:Check gate green. Running the end-to-end smoke:Smoke OK. Writing the README and pushing the client:Now the live verification (before the README's claims stand):Live checks match the known state (reads 200, create 403). Committing and pushing the client:Part A complete. Wiring the dependency into the harness:Expected — nothing imports it yet. Writing Part B code first, then vendoring. Checking the TOML helpers:Now adding `BriefConfig` to the harness config:Now the Default, apply, and Validate entries:Now the Validate block — checking the current tail of Validate first:Extending the intake client with the windowed issue listing:Now the brief package core:Now delivery + orchestration:Now the Run orchestrator:Wiring the subcommand into main.go:Now the brief package test suite — fake Redmine, Gitea, and Discourse:Now config tests for `[brief]`, then vendoring and the check gate:Test data bug — closed stamp lands outside the window. Fixing:The briefing renders beautifully — the fallback log just goes to stdout instead of `out`. Threading the writer through: \ No newline at end of file diff --git a/logs/q-redmine-cli.log b/logs/q-redmine-cli.log new file mode 100644 index 0000000..b49bd7f --- /dev/null +++ b/logs/q-redmine-cli.log @@ -0,0 +1 @@ +I have full context: sibling pattern (mopac-bitwarden-go), harness fake-server test style, PMO python glue to replace, creds at `~/.creds/redmine.env`, Redmine at projects.knownelement.com. Setting up the work plan.Toolchain verified. Creating the repo via Gitea API (idempotent check first):Repo created. Cloning and seeding with LICENSE:Harness done. Now TDD config package — tests first (red):Red confirmed. Implementation:Green. Two atomic commits: \ No newline at end of file