Files
AirCoding/AirPlan/docs/spec/AirPlan-ParaV2/plugins/aireng/scripts/aireng_mode.py
AirCoding ae44be31d5 chore: push all design docs, V2 plan specs, and current working state
Includes AirPlan design documents, AircOding-alpha1-plan, AirPlanV2,
AirPlan-ParaV2, AirPlan-Para V1 reference docs, and all working code
changes across packages.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 17:12:29 +08:00

185 lines
7.9 KiB
Python
Executable File

#!/usr/bin/env python3
from __future__ import annotations
import argparse
import sys
from pathlib import Path
def _add_lib_path() -> None:
root = Path(__file__).resolve().parents[3]
lib_path = root / "lib"
if str(lib_path) not in sys.path:
sys.path.insert(0, str(lib_path))
_add_lib_path()
from air_runtime.engine import (
build_engine_plan,
dispatch_worker_group,
enter_engine,
intervene_engine,
merge_worker_result,
monitor_engine,
run_engine_once,
status_engine,
)
from air_runtime.paths import todo_path as workflow_todo_path
from air_runtime.project_bootstrap import ensure_project_bootstrap
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="AirEng public scheduler runtime")
parser.add_argument(
"--mode",
choices=["enter", "status", "plan", "dispatch", "merge", "monitor", "run", "intervene"],
default="status",
)
parser.add_argument("--project", default=".")
parser.add_argument("--todo", default="")
parser.add_argument("--result", default="")
parser.add_argument("--dispatch-group", default="")
return parser.parse_args()
def main() -> None:
args = parse_args()
project_root = Path(args.project).expanduser().resolve()
ensure_project_bootstrap(project_root)
if args.mode == "enter":
state_path, health = enter_engine(project_root)
print("aireng_mode=enabled")
print(f"project_root={project_root}")
print(f"state_path={state_path}")
for key, value in health.items():
print(f"{key}={'ok' if value else 'missing'}")
return
if args.mode == "status":
state = status_engine(project_root)
print(f"aireng_mode={'enabled' if state.get('enabled') else 'disabled'}")
print(f"project_root={project_root}")
print(f"engine_mode={state.get('engineMode', '')}")
print(f"active_wave_id={state.get('activeWaveId', '')}")
print(f"active_dispatch_path={state.get('activeDispatchPath', '')}")
print(f"active_worker_count={len(state.get('activeWorkers', []))}")
print(f"merged_results={len(state.get('mergedResults', []))}")
print(f"pending_global_updates={len(state.get('pendingGlobalUpdates', []))}")
print(f"planning_source={state.get('planningSource', '')}")
print(f"xdb_sessions={len(state.get('xdbSessions', []))}")
print(f"xdb_policy_enabled={state.get('xdbPolicy', {}).get('enabled')}")
print(f"debug_sessions={len(state.get('debugSessions', []))}")
print(f"debug_policy_enabled={state.get('debugPolicy', {}).get('enabled')}")
print(f"repair_attempts={len(state.get('repairAttempts', []))}")
print(f"active_repairs={state.get('activeRepairCount', 0)}")
print(f"repair_policy_enabled={state.get('repairPolicy', {}).get('enabled')}")
print(f"monitor_interval_seconds={state.get('monitoringPolicy', {}).get('checkIntervalSeconds', 0)}")
print(f"last_loop_at={state.get('lastLoopAt', '')}")
print(f"last_intervention_at={state.get('lastInterventionAt', '')}")
print(f"next_action={state.get('nextAction', '')}")
for key, value in state.get("artifactHealth", {}).items():
print(f"{key}={'ok' if value else 'missing'}")
return
if args.mode == "plan":
current_todo_path = Path(args.todo).expanduser().resolve() if args.todo else workflow_todo_path(project_root)
result = build_engine_plan(project_root, current_todo_path)
print("aireng_mode=planned")
print(f"project_root={project_root}")
print(f"todo_path={current_todo_path}")
print(f"plan_path={result['planPath']}")
print(f"plan_markdown_path={result['planMarkdownPath']}")
print(f"review_json_path={result['reviewJsonPath']}")
print(f"review_markdown_path={result['reviewMarkdownPath']}")
print(f"planning_source={result['planningSource']}")
print(f"review_source_path={result['reviewSourcePath']}")
print(f"selected_tasks={','.join(result['selectedTasks'])}")
print(f"parallel_group_count={result['parallelGroupCount']}")
print(f"conflict_count={result['conflictCount']}")
return
if args.mode == "dispatch":
result = dispatch_worker_group(project_root, args.dispatch_group)
print("aireng_mode=dispatched")
print(f"project_root={project_root}")
print(f"dispatch_path={result['dispatchPath']}")
print(f"group_name={result['groupName']}")
print(f"wave_id={result['waveId']}")
print(f"task_ids={','.join(result['taskIds'])}")
print(f"recommended_concurrency={result['recommendedConcurrency']}")
return
if args.mode == "monitor":
result = monitor_engine(project_root)
print("aireng_mode=monitored")
print(f"project_root={project_root}")
print(f"engine_mode={result['engineMode']}")
print(f"active_worker_count={result['activeWorkerCount']}")
print(f"ready_to_merge_count={result['readyToMergeCount']}")
print(f"merged_count={result['mergedCount']}")
print(f"stalled_count={result['stalledCount']}")
print(f"intervention_count={result['interventionCount']}")
print(f"blocked_task_count={result['blockedTaskCount']}")
print(f"repair_queue_path={result['repairQueuePath']}")
print(f"next_action={result['nextAction']}")
return
if args.mode == "intervene":
result = intervene_engine(project_root)
print("aireng_mode=intervened")
print(f"project_root={project_root}")
print(f"engine_mode={result['engineMode']}")
print(f"stalled_count={result['stalledCount']}")
print(f"intervention_count={result['interventionCount']}")
print(f"blocked_task_count={result['blockedTaskCount']}")
print(f"next_action={result['nextAction']}")
return
if args.mode == "run":
current_todo_path = Path(args.todo).expanduser().resolve() if args.todo else workflow_todo_path(project_root)
result = run_engine_once(project_root, current_todo_path)
print("aireng_mode=ran")
print(f"project_root={project_root}")
print(f"action={result['action']}")
print(f"steps={','.join(result['steps'])}")
print(f"plan_path={result['planPath']}")
print(f"engine_mode={result['engineMode']}")
print(f"next_action={result['nextAction']}")
if 'dispatchPath' in result:
print(f"dispatch_path={result['dispatchPath']}")
if 'waveId' in result:
print(f"wave_id={result['waveId']}")
if 'taskIds' in result:
print(f"task_ids={','.join(result['taskIds'])}")
if 'activeWorkerCount' in result:
print(f"active_worker_count={result['activeWorkerCount']}")
return
if not args.result:
raise SystemExit("--result is required for merge mode")
result_path = Path(args.result).expanduser().resolve()
merged = merge_worker_result(project_root, result_path)
print("aireng_mode=merged")
print(f"project_root={project_root}")
print(f"task_id={merged['taskId']}")
print(f"task_status={merged['status']}")
print(f"archived_result_path={merged['archivedResultPath']}")
print(f"pending_global_update_count={merged['pendingGlobalUpdateCount']}")
print(f"doc_queue_path={merged['docQueuePath']}")
print(f"repair_queue_path={merged['repairQueuePath']}")
print(f"todo_path={merged['todoPath']}")
print(f"applied_doc_path_count={merged['appliedDocPathCount']}")
print(f"xdb_session_count={merged['xdbSessionCount']}")
print(f"debug_session_count={merged['debugSessionCount']}")
print(f"repair_attempt_count={merged['repairAttemptCount']}")
print(f"repair_prepared={merged['repairPrepared']}")
print(f"repair_dispatch_path={merged['repairDispatchPath']}")
print(f"next_action={merged['nextAction']}")
if __name__ == "__main__":
main()