Core changes: - Add @defgroup/@ingroup to 1791 C2+ contracts (555 files) for HCA 128× pre-training DSA grouping - Add §0.1 Pre-Training Frequency matrix to semantics-core - Add §VIII Attention Architecture rules (ATTN_1-4) with MLA/CSA/HCA/DSA mechanics - Add @defgroup/@ingroup to canonical syntax (§II) and all contract examples Agent prompts (5 files): - Add ZERO-STATE RATIONALE with MLA/CSA/HCA/DSA compression mechanics - Add pre-training note: @RATIONALE/@REJECTED are in-context learned tags - svelte-coder: add missing #region contract, fix Svelte rule violations - python-coder/fullstack-coder: honor function contracts from speckit plan - qa-tester: add attention compliance audit (P3 ATTN_1-4 checks) Skills (6 files): - Translate all axiom_config descriptions to English - Fix doc_dirs to index .opencode/ and .specify/ - Deduplicate 5× complexity_rules → single global_tags catalog - Reduce semantics-svelte 591→485 lines (remove duplicate code blocks) - Fix semantics-testing: 'Short IDs' → 'Short hierarchical IDs' - Fix all examples: flat IDs → hierarchical Domain.Name format - Fix Svelte examples: replace raw Tailwind + <button> with semantic tokens + /ui Speckit workflow (commands + templates): - speckit.plan: add Function-Level Contracts for C3+ with @PRE/@POST/@TEST_EDGE - speckit.plan: add Attention Compliance Gate (ATTN_1-4 before contract generation) - speckit.tasks: add function contract inlining format (constraints in task description) - speckit.specify: load semantics-core for spec density rules - spec-template: add #region contract, @SEMANTICS grouping, hierarchical IDs - ux-reference-template: add #region wrapper - plan-template: add attention gate, @defgroup/@ingroup guidance - tasks-template: add attention audit + rebuild + orphan check tasks - constitution.md: translate to English, add Principle VIII (attention-optimized contracts) Reference modules rewritten (hierarchical IDs + full contracts): - Auth.Jwt: 6 child contracts with @RATIONALE/@REJECTED/@TEST_EDGE - Api.Auth: 5 endpoints with @TEST_EDGE + molecular CoT markers - Migration.Model: @defgroup Migration with 18 @ACTION + 6 @INVARIANT Scripts: - add_defgroup_ingroup.py: zero-risk additive @ingroup migration (1791 insertions) - migrate_hierarchical.py: flat→hierarchical ID dry-run analysis (792 contracts) - merge_prompts.py: merge all prompts/skills/commands into one review file Config: - axiom_config.yaml: 749→395 lines (-47%), English, doc_dirs include prompts - Fix test_datasets.py import collision (rename → test_datasets_routes.py) - Fix test_preview.py: SupersetClient→get_superset_client, AsyncMock, logger f-string
186 lines
6.7 KiB
Python
186 lines
6.7 KiB
Python
# #region GitGiteaRoutes [C:2] [TYPE Module] [SEMANTICS fastapi, git, gitea, api]
|
|
# @defgroup Api Module group.
|
|
# @BRIEF FastAPI endpoints for Gitea-specific repository operations.
|
|
# @LAYER API
|
|
|
|
|
|
from fastapi import Depends, HTTPException
|
|
from sqlalchemy.orm import Session
|
|
|
|
from src.api.routes.git_schemas import (
|
|
GiteaRepoCreateRequest,
|
|
GiteaRepoSchema,
|
|
RemoteRepoCreateRequest,
|
|
RemoteRepoSchema,
|
|
)
|
|
from src.core.database import get_db
|
|
from src.core.logger import belief_scope
|
|
from src.dependencies import has_permission
|
|
from src.models.git import GitProvider
|
|
|
|
from ._deps import get_git_service
|
|
from ._helpers import _get_git_config_or_404
|
|
from ._router import router
|
|
|
|
|
|
# #region list_gitea_repositories [C:2] [TYPE Function]
|
|
# @ingroup Api
|
|
# @BRIEF List repositories in Gitea for a saved Gitea config.
|
|
@router.get("/config/{config_id}/gitea/repos", response_model=list[GiteaRepoSchema])
|
|
async def list_gitea_repositories(
|
|
config_id: str,
|
|
db: Session = Depends(get_db),
|
|
_=Depends(has_permission("git_config", "READ")),
|
|
):
|
|
_gs = get_git_service()
|
|
with belief_scope("list_gitea_repositories"):
|
|
config = _get_git_config_or_404(db, config_id)
|
|
if config.provider != GitProvider.GITEA:
|
|
raise HTTPException(
|
|
status_code=400, detail="This endpoint supports GITEA provider only"
|
|
)
|
|
repos = await _gs.list_gitea_repositories(config.url, config.pat)
|
|
return [
|
|
GiteaRepoSchema(
|
|
name=repo.get("name", ""),
|
|
full_name=repo.get("full_name", ""),
|
|
private=bool(repo.get("private", False)),
|
|
clone_url=repo.get("clone_url"),
|
|
html_url=repo.get("html_url"),
|
|
ssh_url=repo.get("ssh_url"),
|
|
default_branch=repo.get("default_branch"),
|
|
)
|
|
for repo in repos
|
|
]
|
|
# #endregion list_gitea_repositories
|
|
|
|
|
|
# #region create_gitea_repository [C:2] [TYPE Function]
|
|
# @ingroup Api
|
|
# @BRIEF Create a repository in Gitea for a saved Gitea config.
|
|
@router.post("/config/{config_id}/gitea/repos", response_model=GiteaRepoSchema)
|
|
async def create_gitea_repository(
|
|
config_id: str,
|
|
request: GiteaRepoCreateRequest,
|
|
db: Session = Depends(get_db),
|
|
_=Depends(has_permission("admin:settings", "WRITE")),
|
|
):
|
|
_gs = get_git_service()
|
|
with belief_scope("create_gitea_repository"):
|
|
config = _get_git_config_or_404(db, config_id)
|
|
if config.provider != GitProvider.GITEA:
|
|
raise HTTPException(
|
|
status_code=400, detail="This endpoint supports GITEA provider only"
|
|
)
|
|
repo = await _gs.create_gitea_repository(
|
|
server_url=config.url,
|
|
pat=config.pat,
|
|
name=request.name,
|
|
private=request.private,
|
|
description=request.description,
|
|
auto_init=request.auto_init,
|
|
default_branch=request.default_branch,
|
|
)
|
|
return GiteaRepoSchema(
|
|
name=repo.get("name", ""),
|
|
full_name=repo.get("full_name", ""),
|
|
private=bool(repo.get("private", False)),
|
|
clone_url=repo.get("clone_url"),
|
|
html_url=repo.get("html_url"),
|
|
ssh_url=repo.get("ssh_url"),
|
|
default_branch=repo.get("default_branch"),
|
|
)
|
|
# #endregion create_gitea_repository
|
|
|
|
|
|
# #region delete_gitea_repository [C:2] [TYPE Function]
|
|
# @ingroup Api
|
|
# @BRIEF Delete repository in Gitea for a saved Gitea config.
|
|
@router.delete("/config/{config_id}/gitea/repos/{owner}/{repo_name}")
|
|
async def delete_gitea_repository(
|
|
config_id: str,
|
|
owner: str,
|
|
repo_name: str,
|
|
db: Session = Depends(get_db),
|
|
_=Depends(has_permission("admin:settings", "WRITE")),
|
|
):
|
|
_gs = get_git_service()
|
|
with belief_scope("delete_gitea_repository"):
|
|
config = _get_git_config_or_404(db, config_id)
|
|
if config.provider != GitProvider.GITEA:
|
|
raise HTTPException(
|
|
status_code=400, detail="This endpoint supports GITEA provider only"
|
|
)
|
|
await _gs.delete_gitea_repository(
|
|
server_url=config.url,
|
|
pat=config.pat,
|
|
owner=owner,
|
|
repo_name=repo_name,
|
|
)
|
|
return {"status": "success", "message": "Repository deleted"}
|
|
# #endregion delete_gitea_repository
|
|
|
|
|
|
# #region create_remote_repository [C:2] [TYPE Function]
|
|
# @ingroup Api
|
|
# @BRIEF Create repository on remote Git server using selected provider config.
|
|
@router.post("/config/{config_id}/repositories", response_model=RemoteRepoSchema)
|
|
async def create_remote_repository(
|
|
config_id: str,
|
|
request: RemoteRepoCreateRequest,
|
|
db: Session = Depends(get_db),
|
|
_=Depends(has_permission("admin:settings", "WRITE")),
|
|
):
|
|
_gs = get_git_service()
|
|
with belief_scope("create_remote_repository"):
|
|
config = _get_git_config_or_404(db, config_id)
|
|
|
|
if config.provider == GitProvider.GITEA:
|
|
repo = await _gs.create_gitea_repository(
|
|
server_url=config.url,
|
|
pat=config.pat,
|
|
name=request.name,
|
|
private=request.private,
|
|
description=request.description,
|
|
auto_init=request.auto_init,
|
|
default_branch=request.default_branch,
|
|
)
|
|
elif config.provider == GitProvider.GITHUB:
|
|
repo = await _gs.create_github_repository(
|
|
server_url=config.url,
|
|
pat=config.pat,
|
|
name=request.name,
|
|
private=request.private,
|
|
description=request.description,
|
|
auto_init=request.auto_init,
|
|
default_branch=request.default_branch,
|
|
)
|
|
elif config.provider == GitProvider.GITLAB:
|
|
repo = await _gs.create_gitlab_repository(
|
|
server_url=config.url,
|
|
pat=config.pat,
|
|
name=request.name,
|
|
private=request.private,
|
|
description=request.description,
|
|
auto_init=request.auto_init,
|
|
default_branch=request.default_branch,
|
|
)
|
|
else:
|
|
raise HTTPException(
|
|
status_code=501,
|
|
detail=f"Provider {config.provider} is not supported",
|
|
)
|
|
|
|
return RemoteRepoSchema(
|
|
provider=config.provider,
|
|
name=repo.get("name", ""),
|
|
full_name=repo.get("full_name", repo.get("name", "")),
|
|
private=bool(repo.get("private", False)),
|
|
clone_url=repo.get("clone_url"),
|
|
html_url=repo.get("html_url"),
|
|
ssh_url=repo.get("ssh_url"),
|
|
default_branch=repo.get("default_branch"),
|
|
)
|
|
# #endregion create_remote_repository
|
|
# #endregion GitGiteaRoutes
|