Commit graph

22 commits

Author SHA1 Message Date
Snider
7eb28df79d feat: migrate collect, forge, gitea commands from CLI
Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-21 19:38:36 +00:00
Snider
5bfafcd6fc feat: restore agentci, git, and jobrunner packages
These packages are still imported by the CLI. Reverting the premature
extraction so forge consumers can resolve them.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-21 19:27:35 +00:00
Snider
8527302df1 chore: resolve forge deps from registry, remove local replaces
Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-21 19:20:07 +00:00
Snider
dc93f7dcf9 refactor: remove git/ package (extracted to core/go-git)
The git/ package was extracted to the standalone core/go-git repo.
No remaining packages import it. Three packages remain: forge/,
gitea/, collect/.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-21 17:26:35 +00:00
Snider
c95aefed94 refactor: extract agentci + jobrunner to core/go-agent
Both packages now live in forge.lthn.ai/core/go-agent as a unified
agent orchestration repo. go-scm retains collect/, forge/, git/, gitea/.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-21 17:13:26 +00:00
Claude
148003e005
fix(dispatch): resolve target branch from repo default
Replace hardcoded "new" target branch with a lookup against the
Forgejo API for the repository's default branch, falling back to
"main" if the API call fails.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 23:58:35 +00:00
Snider
fb02ccad99 docs: add README with quick start and docs links
Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-20 15:11:19 +00:00
Snider
4558504499 docs: graduate TODO/FINDINGS into production documentation
Replace internal task tracking (TODO.md, FINDINGS.md) with structured
documentation in docs/. Trim CLAUDE.md to agent instructions only.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-20 15:02:22 +00:00
Claude
4a2e1298a4
test(forgejo): add supplementary signal source coverage
Extends Phase 3 forgejo source tests with 9 additional scenarios:
multi-epic with multiple children, combined status fetch error
fallback to PENDING, mixed repos with partial failure, Report
comment body format (table-driven), Report posting to correct
epic issue, signal field completeness, all-children-checked
producing zero signals, and NeedsCoding signal field population.

Co-Authored-By: Charon <developers@lethean.io>
2026-02-20 11:52:11 +00:00
Snider
70e06d2226 docs: mark Phase 3 tasks complete in TODO.md
Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-20 05:52:12 +00:00
Snider
0fe2978b9d test: Phase 3 — Forgejo signal source, journal replay, handler integration
Forgejo signal source tests:
- Signal parsing for empty body, mixed content, large issue numbers
- findLinkedPR edge cases (multiple refs, empty body, first match wins)
- Poll with combined status failure/error fallback to PENDING
- Poll with unassigned child (no signal), child fetch failure (skipped)
- Poll with multiple epics, mixed labels (only epics generate signals)
- Report format verification (success/failure, error in code block)

Journal replay tests:
- Write + read-back round-trip with full field preservation
- Filter by action (tick_parent from mixed actions)
- Filter by repo (date-partitioned files in owner/repo directories)
- Filter by time range (entries across multiple days)
- Combined filter (action + repo + time)
- Concurrent write safety (20 goroutines, valid JSONL output)
- Empty journal returns no entries

Handler integration tests:
- TickParent full flow: signal -> execute -> verify epic body updated,
  child closed, progress tracked (checked/unchecked counts)
- EnableAutoMerge: verify squash merge method via mock
- PublishDraft: verify draft=false PATCH sent
- SendFixCommand: conflict vs review message paths
- Completion: success flow (label swap, comment) and failure flow
- Full pipeline: signal -> handler -> journal write -> read-back
- Handler priority: verify correct handler matches each signal state
  (merged, draft, conflicting, open+passing)

Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-20 05:51:48 +00:00
Snider
15566df2b0 docs: mark Phase 2 tasks complete in TODO.md
Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-20 05:42:28 +00:00
Snider
3ba8fbb8fb fix: Phase 2 — error wrapping, context audit, rate limiting review
- Standardise all fmt.Errorf calls to "package.Func: context" pattern
  across jobrunner/journal.go, agentci/config.go, agentci/security.go,
  handlers/dispatch.go, and forge/labels.go (15 bare errors fixed)
- Add SecureSSHCommandContext with context propagation for cancellable
  SSH operations; update dispatch handler to use it
- Add CheckGitHubRateLimitCtx for context-aware rate limit checking
- Document Forgejo/Gitea SDK v2 context limitation in FINDINGS.md
  (SDKs do not accept context.Context — adding ctx to 66 wrappers
  would be ceremony without real propagation)
- Review and document rate limiter: handles all edge cases, adaptive
  throttling at 75% GitHub usage, SDK header parsing not feasible

Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-20 05:42:02 +00:00
Claude
8d1d7fce01
test: push coverage across collect/jobrunner/gitea
collect: 83.0% -> 90.0% via error medium injection (write/list/read/ensureDir
failures), rate limiter blocking tests, HTTP mock servers for papers/market/
bitcointalk write errors, processor context cancellation, state round-trip,
and GitHub collector gh-auth-failure paths.

gitea: 89.2% -> 94.0% via paginated org/user repo servers, PR meta with
comment counting and nil dates, GetCommentBodies with nil poster, ListPullRequests
state mapping, and NewFromConfig flag override tests.

jobrunner: 86.4% -> 94.4% via journal error paths (empty baseDir, readonly dir,
path sanitisation), poller with error-returning source/handler/report, journal
integration (JSONL file verification), multiple sources, immediate cancellation,
and cycle counter tests.

handlers: 83.8% -> 89.2% via dispatch mock servers (invalid repo, EnsureLabel
failure, GetIssue not found, AssignIssue failure, AddIssueLabels error, issue
with no special labels), completion label errors, EnableAutoMerge pending checks,
PublishDraft merged state, SendFixCommand merge conflict, DismissReviews stale
review, TickParent checkbox ticking, and dual-run mode. Remaining 10.8% is in
SSH-dependent dispatch code (secureTransfer/runRemote/ticketExists) that cannot
be tested without modifying production code.

Co-Authored-By: Charon <charon@lethean.io>
2026-02-20 03:06:43 +00:00
Claude
b3e3ef2efb
test(git): push coverage from 79.5% to 96.7%
Add tests for Service lifecycle: NewService factory, OnStartup, and all
handleQuery/handleTask paths (QueryStatus, QueryDirtyRepos,
QueryAheadRepos, TaskPush, TaskPull, TaskPushMultiple, unknown types).

Add integration tests for Push with a real bare remote (push succeeds,
ahead count drops to zero), PushMultiple with multiple paths, empty
paths, and ahead/behind with no upstream tracking branch.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 02:01:12 +00:00
Claude
f50fc405f5
test(forgejo): push coverage from 73.3% to 95.0%
Add unit tests for all signal mapping functions (mapPRState, mapMergeable,
mapCombinedStatus with all branches including nil, zero count, error
state). Add tests for parseEpicChildren (all checked, all unchecked,
no checkboxes), findLinkedPR (found, not found, nil), buildSignal
(with and without head SHA), splitRepo table-driven tests.

Add Poll integration tests: multiple repos, NeedsCoding with assignee,
merged PR, no head SHA (PENDING status), API errors (graceful skip),
empty repos list, non-epic issues filtered. Add Report tests: nil
result, failed result with error message.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 01:59:36 +00:00
Claude
2505aff461
test(handlers): push coverage from 61.6% to 83.8%
Add full test suite for CompletionHandler (success, failure, no-message,
ensure-label-fails). Add Name() tests for all six handlers. Add Match
edge cases (closed PR, conflicting, no threads). Add Execute error paths
for PublishDraft (server error), SendFixCommand (code reviews message,
comment fails), TickParent (already ticked, fetch fails, edit fails,
close child fails), DismissReviews (list fails, nothing to dismiss,
dismiss fails). Add Dispatch dedup tests (already in-progress, already
completed, invalid repo owner).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 01:58:07 +00:00
Claude
b4e3d0555a
test(collect): push coverage from 57.3% to 83.0%
Add HTTP mock tests for BitcoinTalk (fetchPage, Collect with server),
papers (IACR HTML parsing, arXiv XML parsing, PaperSourceAll), market
(historical with FromDate, invalid date, server errors), process
(ordered lists, blockquotes, h4-h6, nested objects, cancelled context),
excavate (resume skips completed, progress events), and state (copy
safety, cursor round-trip, null JSON).

Uses httptest.Server with rewriteTransport to intercept external HTTP
calls without touching the production code.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 01:55:18 +00:00
Claude
4de0356880
docs(todo): mark Phase 1 complete with commit hash 9db37c6
Co-Authored-By: Charon <developers@lethean.io>
2026-02-20 01:00:10 +00:00
Claude
9db37c6fb3
test: add comprehensive unit tests for forge/, gitea/, git/, agentci/
Phase 1 test coverage for the three 0% packages plus agentci/ improvement:

- git/ (0% -> 79.5%): RepoStatus methods, status parsing with real temp
  repos, multi-repo parallel status, Push/Pull error paths, ahead/behind
  with bare remote, context cancellation, GitError, IsNonFastForward,
  service DirtyRepos/AheadRepos filtering

- forge/ (0% -> 91.2%): All SDK wrapper functions tested via httptest mock
  server — client creation, repos, issues, PRs, labels, webhooks, orgs,
  meta, config resolution, SetPRDraft raw HTTP endpoint

- gitea/ (0% -> 89.2%): All SDK wrapper functions tested via httptest mock
  server — client creation, repos, issues, PRs, meta, config resolution

- agentci/ (56% -> 94.5%): Clotho DeterminePlan all code paths, security
  helpers (SanitizePath, EscapeShellArg, SecureSSHCommand, MaskToken)

Key findings documented in FINDINGS.md:
- Forgejo SDK validates token via HTTP on NewClient()
- SDK route patterns differ from public API docs (/org/ vs /orgs/)
- Gitea SDK requires auth token for GitHub mirror creation
- Config resolution priority verified: config file < env vars < flags

Co-Authored-By: Charon <developers@lethean.io>
2026-02-20 00:59:46 +00:00
Snider
bedcb4e652 docs: add CLAUDE.md, TODO.md, FINDINGS.md for fleet delegation
Full domain expert session brief with architecture map, 4-phase
TODO covering test coverage (critical), hardening, AgentCI pipeline,
and Forge↔Gitea sync. Initial findings documenting package inventory,
zero-test gaps, and auth resolution.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-20 00:28:39 +00:00
Claude
3e883f6976
feat: extract SCM/forge integration packages from core/go
Forgejo and Gitea SDK wrappers, multi-repo git utilities, AgentCI
dispatch, distributed job orchestrator, and data collection pipelines.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 15:25:58 +00:00