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
167 lines
5.5 KiB
Python
167 lines
5.5 KiB
Python
# #region GitMergeRoutes [C:3] [TYPE Module] [SEMANTICS fastapi, git, api]
|
|
# @defgroup Api Module group.
|
|
# @BRIEF FastAPI endpoints for merge operations (status, conflicts, resolve, abort, continue).
|
|
# @LAYER API
|
|
|
|
|
|
from fastapi import Depends, HTTPException
|
|
|
|
from src.api.routes.git_schemas import (
|
|
MergeConflictFileSchema,
|
|
MergeContinueRequest,
|
|
MergeResolveRequest,
|
|
MergeStatusSchema,
|
|
)
|
|
from src.core.logger import belief_scope
|
|
from src.dependencies import get_config_manager, has_permission
|
|
|
|
from ._deps import get_git_service
|
|
from ._helpers import (
|
|
_handle_unexpected_git_route_error,
|
|
)
|
|
from ._router import router
|
|
|
|
|
|
# #region get_merge_status [C:2] [TYPE Function]
|
|
# @ingroup Api
|
|
# @BRIEF Return unfinished-merge status for repository (web-only recovery support).
|
|
@router.get(
|
|
"/repositories/{dashboard_ref}/merge/status", response_model=MergeStatusSchema
|
|
)
|
|
async def get_merge_status(
|
|
dashboard_ref: str,
|
|
env_id: str | None = None,
|
|
config_manager=Depends(get_config_manager),
|
|
_=Depends(has_permission("plugin:git", "EXECUTE")),
|
|
):
|
|
_gs = get_git_service()
|
|
with belief_scope("get_merge_status"):
|
|
from . import _resolve_dashboard_id_from_ref
|
|
|
|
try:
|
|
dashboard_id = await _resolve_dashboard_id_from_ref(
|
|
dashboard_ref, config_manager, env_id
|
|
)
|
|
return _gs.get_merge_status(dashboard_id)
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
_handle_unexpected_git_route_error("get_merge_status", e)
|
|
# #endregion get_merge_status
|
|
|
|
|
|
# #region get_merge_conflicts [C:2] [TYPE Function]
|
|
# @ingroup Api
|
|
# @BRIEF Return conflicted files with mine/theirs previews for web conflict resolver.
|
|
@router.get(
|
|
"/repositories/{dashboard_ref}/merge/conflicts",
|
|
response_model=list[MergeConflictFileSchema],
|
|
)
|
|
async def get_merge_conflicts(
|
|
dashboard_ref: str,
|
|
env_id: str | None = None,
|
|
config_manager=Depends(get_config_manager),
|
|
_=Depends(has_permission("plugin:git", "EXECUTE")),
|
|
):
|
|
_gs = get_git_service()
|
|
with belief_scope("get_merge_conflicts"):
|
|
from . import _resolve_dashboard_id_from_ref
|
|
|
|
try:
|
|
dashboard_id = await _resolve_dashboard_id_from_ref(
|
|
dashboard_ref, config_manager, env_id
|
|
)
|
|
return _gs.get_merge_conflicts(dashboard_id)
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
_handle_unexpected_git_route_error("get_merge_conflicts", e)
|
|
# #endregion get_merge_conflicts
|
|
|
|
|
|
# #region resolve_merge_conflicts [C:3] [TYPE Function]
|
|
# @ingroup Api
|
|
# @BRIEF Apply mine/theirs/manual conflict resolutions from WebUI and stage files.
|
|
# @RELATION CALLS -> [GitService]
|
|
@router.post("/repositories/{dashboard_ref}/merge/resolve")
|
|
async def resolve_merge_conflicts(
|
|
dashboard_ref: str,
|
|
resolve_data: MergeResolveRequest,
|
|
env_id: str | None = None,
|
|
config_manager=Depends(get_config_manager),
|
|
_=Depends(has_permission("plugin:git", "EXECUTE")),
|
|
):
|
|
_gs = get_git_service()
|
|
with belief_scope("resolve_merge_conflicts"):
|
|
from . import _resolve_dashboard_id_from_ref
|
|
|
|
try:
|
|
dashboard_id = await _resolve_dashboard_id_from_ref(
|
|
dashboard_ref, config_manager, env_id
|
|
)
|
|
resolved_files = _gs.resolve_merge_conflicts(
|
|
dashboard_id,
|
|
[item.model_dump() for item in resolve_data.resolutions],
|
|
)
|
|
return {"status": "success", "resolved_files": resolved_files}
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
_handle_unexpected_git_route_error("resolve_merge_conflicts", e)
|
|
# #endregion resolve_merge_conflicts
|
|
|
|
|
|
# #region abort_merge [C:2] [TYPE Function]
|
|
# @ingroup Api
|
|
# @BRIEF Abort unfinished merge from WebUI flow.
|
|
@router.post("/repositories/{dashboard_ref}/merge/abort")
|
|
async def abort_merge(
|
|
dashboard_ref: str,
|
|
env_id: str | None = None,
|
|
config_manager=Depends(get_config_manager),
|
|
_=Depends(has_permission("plugin:git", "EXECUTE")),
|
|
):
|
|
_gs = get_git_service()
|
|
with belief_scope("abort_merge"):
|
|
from . import _resolve_dashboard_id_from_ref
|
|
|
|
try:
|
|
dashboard_id = await _resolve_dashboard_id_from_ref(
|
|
dashboard_ref, config_manager, env_id
|
|
)
|
|
return _gs.abort_merge(dashboard_id)
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
_handle_unexpected_git_route_error("abort_merge", e)
|
|
# #endregion abort_merge
|
|
|
|
|
|
# #region continue_merge [C:3] [TYPE Function]
|
|
# @ingroup Api
|
|
# @BRIEF Finalize unfinished merge from WebUI flow.
|
|
# @RELATION CALLS -> [GitService]
|
|
@router.post("/repositories/{dashboard_ref}/merge/continue")
|
|
async def continue_merge(
|
|
dashboard_ref: str,
|
|
continue_data: MergeContinueRequest,
|
|
env_id: str | None = None,
|
|
config_manager=Depends(get_config_manager),
|
|
_=Depends(has_permission("plugin:git", "EXECUTE")),
|
|
):
|
|
_gs = get_git_service()
|
|
with belief_scope("continue_merge"):
|
|
from . import _resolve_dashboard_id_from_ref
|
|
|
|
try:
|
|
dashboard_id = await _resolve_dashboard_id_from_ref(
|
|
dashboard_ref, config_manager, env_id
|
|
)
|
|
return _gs.continue_merge(dashboard_id, continue_data.message)
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
_handle_unexpected_git_route_error("continue_merge", e)
|
|
# #endregion continue_merge
|
|
# #endregion GitMergeRoutes
|