Files
ss-tools/backend/src/api/routes/assistant/_tool_migration.py
busya 8e8a3c3235 feat: attention-optimized semantic protocol v2.7
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
2026-06-08 16:30:59 +03:00

121 lines
4.1 KiB
Python

# #region AssistantToolMigration [C:4] [TYPE Module] [SEMANTICS assistant, tool, migration, execute]
# @defgroup AssistantApi Module group.
# @BRIEF Handler for the "execute_migration" tool — run dashboard migration between environments.
# @LAYER API
# @RELATION DEPENDS_ON -> [AssistantToolRegistry]
# @RELATION DEPENDS_ON -> [TaskManager]
from __future__ import annotations
from typing import Any
from fastapi import HTTPException
from sqlalchemy.orm import Session
from src.core.config_manager import ConfigManager
from src.core.logger import belief_scope, logger
from src.core.task_manager import TaskManager
from src.schemas.auth import User
from ._history import _coerce_query_bool
from ._resolvers import (
_get_environment_name_by_id,
_resolve_dashboard_id_entity,
_resolve_env_id,
)
from ._schemas import AssistantAction
from ._tool_registry import _check_any_permission, assistant_tool
# #region handle_execute_migration [C:4] [TYPE Function]
# @ingroup AssistantApi
@assistant_tool(
operation="execute_migration",
domain="migration",
description=(
"Run dashboard migration (id/slug/title) between environments. "
"Optional boolean flags: replace_db_config, fix_cross_filters"
),
required_entities=["source_env", "target_env"],
optional_entities=[
"dashboard_id",
"dashboard_ref",
"replace_db_config",
"fix_cross_filters",
],
risk_level="guarded",
requires_confirmation=False,
permission_checks=[
("plugin:migration", "EXECUTE"),
("plugin:superset-migration", "EXECUTE"),
],
)
@belief_scope("execute_migration")
async def handle_execute_migration(
intent: dict[str, Any],
current_user: User,
task_manager: TaskManager,
config_manager: ConfigManager,
db: Session,
) -> tuple[str, str | None, list[AssistantAction]]:
"""Run dashboard migration between environments."""
_check_any_permission(
current_user,
[("plugin:migration", "EXECUTE"), ("plugin:superset-migration", "EXECUTE")],
)
entities = intent.get("entities", {})
src_token = entities.get("source_env")
dashboard_ref = entities.get("dashboard_ref")
dashboard_id = await _resolve_dashboard_id_entity(
entities, config_manager, env_hint=src_token
)
src = _resolve_env_id(src_token, config_manager)
tgt = _resolve_env_id(entities.get("target_env"), config_manager)
if not src or not tgt:
raise HTTPException(status_code=422, detail="Missing source_env/target_env")
if not dashboard_id and (not dashboard_ref):
raise HTTPException(status_code=422, detail="Missing dashboard_id/dashboard_ref")
migration_params: dict[str, Any] = {
"source_env_id": src,
"target_env_id": tgt,
"replace_db_config": _coerce_query_bool(
entities.get("replace_db_config", False)
),
"fix_cross_filters": _coerce_query_bool(
entities.get("fix_cross_filters", True)
),
}
if dashboard_id:
migration_params["selected_ids"] = [dashboard_id]
else:
migration_params["dashboard_regex"] = str(dashboard_ref)
task = await task_manager.create_task(
plugin_id="superset-migration",
params=migration_params,
user_id=current_user.id,
)
actions: list[AssistantAction] = [
AssistantAction(type="open_task", label="Open Task", target=task.id),
AssistantAction(
type="open_reports", label="Open Reports", target="/reports"
),
]
if dashboard_id:
actions.append(
AssistantAction(
type="open_route",
label=f"Открыть дашборд в {_get_environment_name_by_id(tgt, config_manager)}",
target=f"/dashboards/{dashboard_id}?env_id={tgt}",
)
)
actions.append(
AssistantAction(
type="open_diff", label="Показать Diff", target=str(dashboard_id)
)
)
return (f"Миграция запущена. task_id={task.id}", task.id, actions)
# #endregion handle_execute_migration
# #endregion AssistantToolMigration