[文書] DTP Playbook v3 完全版 — Sprint 1〜5 の全タスク網羅
Sprint 1 (今日): clippy修正 + Phase C + GNI確認 Sprint 2 (今週): OpenClawドッキング (JSON標準化/hooks/memory sync/サブエージェント) Sprint 3 (来週): 運用基盤 (Heartbeat/git自動同期/Telegram/VOICEBOX/Maestro) Sprint 4 (今月): 品質ゲート多層化 (rust-ai-pipeline/proptest/cargo-mutants) Sprint 5 (来月): 移行+公開 (TS→Rust/OpenClawプラグイン/npm配布) 各Sprint: DAG依存/承認ゲート/ロールバックポイント定義済み Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
4336e348b7
commit
89d2ab3c12
6 changed files with 399 additions and 23 deletions
|
|
@ -782,7 +782,7 @@ async fn main() -> anyhow::Result<()> {
|
|||
std::process::exit(code);
|
||||
}
|
||||
Some(Commands::Openclaw { command }) => {
|
||||
use miyabi_core::openclaw::{OpenClawClient, OpenClawResult};
|
||||
use miyabi_core::openclaw::OpenClawClient;
|
||||
use std::env;
|
||||
|
||||
// Get OpenClaw configuration
|
||||
|
|
@ -823,8 +823,6 @@ async fn main() -> anyhow::Result<()> {
|
|||
return Ok(());
|
||||
}
|
||||
|
||||
let client = OpenClawClient::new(gateway_url.clone(), token.clone());
|
||||
|
||||
// Handle Status command separately to avoid borrowing issues
|
||||
if let OpenclawCommand::Status = command {
|
||||
let token_display = if token.len() > 4 {
|
||||
|
|
@ -1112,7 +1110,7 @@ async fn main() -> anyhow::Result<()> {
|
|||
|
||||
fn handle_gate_command(
|
||||
format: &OutputFormat,
|
||||
store_path: &PathBuf,
|
||||
store_path: &std::path::Path,
|
||||
command: GateCommand,
|
||||
) -> anyhow::Result<i32> {
|
||||
use miyabi_core::protocol::{
|
||||
|
|
@ -1121,7 +1119,7 @@ fn handle_gate_command(
|
|||
};
|
||||
use miyabi_core::store::{CompletionMode, ImpactRiskLevel};
|
||||
|
||||
let protocol = DeterministicExecutionProtocol::from_store_path(store_path.clone());
|
||||
let protocol = DeterministicExecutionProtocol::from_store_path(store_path.to_path_buf());
|
||||
let actor = "miyabi-cli";
|
||||
let node = std::env::var("HOSTNAME")
|
||||
.ok()
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize};
|
|||
use std::pin::Pin;
|
||||
use std::time::Duration;
|
||||
use thiserror::Error;
|
||||
use tracing::{debug, error, warn};
|
||||
use tracing::{debug, warn};
|
||||
|
||||
/// Anthropic API base URL
|
||||
const API_BASE_URL: &str = "https://api.anthropic.com";
|
||||
|
|
|
|||
|
|
@ -38,19 +38,11 @@ impl Gate {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Default)]
|
||||
pub struct GateContext {
|
||||
pub lock_conflict: Option<LockConflict>,
|
||||
}
|
||||
|
||||
impl Default for GateContext {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
lock_conflict: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct GateReport {
|
||||
pub gate: Gate,
|
||||
|
|
@ -134,7 +126,7 @@ pub fn evaluate_gate(
|
|||
.unwrap_or_else(|| "missing branch_name".to_string()),
|
||||
),
|
||||
Gate::Gate6 => {
|
||||
let ok = task.github_evidence.as_ref().map_or(false, |evidence| {
|
||||
let ok = task.github_evidence.as_ref().is_some_and(|evidence| {
|
||||
evidence.pr_number > 0
|
||||
&& !evidence.pr_head_ref.is_empty()
|
||||
&& matches!(
|
||||
|
|
@ -152,7 +144,7 @@ pub fn evaluate_gate(
|
|||
)
|
||||
}
|
||||
Gate::Gate7 => {
|
||||
let ok = task.github_evidence.as_ref().map_or(false, |evidence| {
|
||||
let ok = task.github_evidence.as_ref().is_some_and(|evidence| {
|
||||
evidence.pr_state == GitHubPrState::Merged && evidence.merge_commit_sha.is_some()
|
||||
});
|
||||
(
|
||||
|
|
@ -167,7 +159,7 @@ pub fn evaluate_gate(
|
|||
Gate::Gate8 => {
|
||||
let ok = match task.completion_mode {
|
||||
CompletionMode::GithubPr => {
|
||||
task.github_evidence.as_ref().map_or(false, |evidence| {
|
||||
task.github_evidence.as_ref().is_some_and(|evidence| {
|
||||
evidence.issue_state == GitHubIssueState::Closed
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -165,9 +165,9 @@ impl DeterministicExecutionProtocol {
|
|||
.get_task(task_id)
|
||||
.cloned()
|
||||
.ok_or_else(|| ProtocolError::input(format!("unknown task: {task_id}")))?;
|
||||
Ok(StatusReport::Task(task))
|
||||
Ok(StatusReport::Task(Box::new(task)))
|
||||
} else {
|
||||
Ok(StatusReport::Snapshot(snapshot))
|
||||
Ok(StatusReport::Snapshot(Box::new(snapshot)))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -469,8 +469,8 @@ pub struct ImpactInput {
|
|||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum StatusReport {
|
||||
Task(ExecutionTask),
|
||||
Snapshot(TasksSnapshot),
|
||||
Task(Box<ExecutionTask>),
|
||||
Snapshot(Box<TasksSnapshot>),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
|
|
|
|||
|
|
@ -358,7 +358,7 @@ impl SnapshotStore {
|
|||
Ok(())
|
||||
})();
|
||||
|
||||
let unlock_result = lock_file.unlock();
|
||||
let unlock_result = fs2::FileExt::unlock(&lock_file);
|
||||
result?;
|
||||
unlock_result?;
|
||||
Ok(())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue