Files
Teamup/src/Shared/TeamUp.SharedKernel/Git/IGitProvider.cs
T
soroush.asadi bfcd223374 M2: the four V1 atoms + Git sync (Gitea / filesystem)
- Author the four V1 skill atoms in skills/ (Git is the source of truth): spec-writing &
  story-breakdown (product-owner), test-plan-generation & diff-review (qa) — each with
  risk-tagged actions, golden tests, and a body.
- SharedKernel: IGitProvider seam (read-only, provider-agnostic) + GitFile.
- Integrations module (its first real code): FileSystemGitProvider (dogfood/local) and a
  GiteaGitProvider (Gitea REST: recursive tree → SKILL.md blobs → base64 contents); the
  provider is chosen by GitSource:Provider config.
- Skills: SkillSyncService consumes IGitProvider (never Integrations) and indexes each file;
  POST /api/skills/sync and a POST /api/skills/webhook/gitea (re-sync on push; signature
  verification + changed-file-only + queue offload come later).

Verified: build green; ArchitectureTests 8/8 (Skills & Integrations reference only
SharedKernel; the Git seam lives in SharedKernel); IntegrationTests 22/22 incl. a sync that
indexes the four real atoms from skills/, published and queryable by role.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 18:34:53 +03:30

19 lines
816 B
C#

namespace TeamUp.SharedKernel.Git;
/// <summary>A file read from a Git source.</summary>
public sealed record GitFile(string Path, string Content);
/// <summary>
/// Provider-agnostic read access to a Git source (Gitea in V1; GitHub/GitLab/Azure DevOps later).
/// Implemented by the Integrations module; consumed by Skills to sync SKILL.md files. Read-only in
/// V1 — write-back (PR comments, branches) is Phase 2.
/// </summary>
public interface IGitProvider
{
/// <summary>A short identifier for the configured source (used as the skill's provenance).</summary>
string Name { get; }
/// <summary>Returns every <c>SKILL.md</c> in the source, with its repo-relative path and content.</summary>
Task<IReadOnlyList<GitFile>> ListSkillFilesAsync(CancellationToken cancellationToken = default);
}