Skip to main content

plan_issue_cli/commands/
plan.rs

1use std::path::PathBuf;
2
3use clap::{ArgGroup, Args, ValueEnum};
4use serde::Serialize;
5
6use super::{CommentModeArgs, CommentTextArgs, GroupingArgs, PrefixArgs, SummaryArgs};
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, ValueEnum)]
9pub enum CloseReason {
10    Completed,
11    #[value(name = "not-planned")]
12    NotPlanned,
13}
14
15#[derive(Debug, Clone, Args, Serialize)]
16pub struct StartPlanArgs {
17    /// Plan markdown path.
18    #[arg(long, value_name = "path")]
19    pub plan: PathBuf,
20
21    /// Override plan issue title.
22    #[arg(long, value_name = "text")]
23    pub title: Option<String>,
24
25    /// Plan task-spec output path override.
26    #[arg(long, value_name = "path")]
27    pub task_spec_out: Option<PathBuf>,
28
29    /// Rendered plan issue body output path override.
30    #[arg(long, value_name = "path")]
31    pub issue_body_out: Option<PathBuf>,
32
33    #[command(flatten)]
34    pub prefixes: PrefixArgs,
35
36    #[command(flatten)]
37    pub grouping: GroupingArgs,
38
39    /// Labels to add at issue creation time.
40    #[arg(long = "label", value_name = "name", default_values = ["issue", "plan"])]
41    pub label: Vec<String>,
42}
43
44#[derive(Debug, Clone, Args, Serialize)]
45#[command(group(
46    ArgGroup::new("issue_source")
47        .required(true)
48        .args(["issue", "body_file"])
49))]
50pub struct StatusPlanArgs {
51    /// Plan issue number (live `plan-issue` path only).
52    #[arg(long, value_name = "number")]
53    pub issue: Option<u64>,
54
55    /// Offline issue body path.
56    #[arg(long, value_name = "path")]
57    pub body_file: Option<PathBuf>,
58
59    #[command(flatten)]
60    pub comment_mode: CommentModeArgs,
61}
62
63#[derive(Debug, Clone, Args, Serialize)]
64#[command(group(
65    ArgGroup::new("issue_source")
66        .required(true)
67        .args(["issue", "body_file"])
68))]
69pub struct ReadyPlanArgs {
70    /// Plan issue number (live `plan-issue` path only).
71    #[arg(long, value_name = "number")]
72    pub issue: Option<u64>,
73
74    /// Offline issue body path.
75    #[arg(long, value_name = "path")]
76    pub body_file: Option<PathBuf>,
77
78    #[command(flatten)]
79    pub summary: SummaryArgs,
80
81    /// Review label.
82    #[arg(long = "label", value_name = "name", default_value = "needs-review")]
83    pub label: String,
84
85    /// Labels to remove.
86    #[arg(long = "remove-label", value_name = "name")]
87    pub remove_label: Vec<String>,
88
89    #[command(flatten)]
90    pub comment_mode: CommentModeArgs,
91
92    /// Skip label updates.
93    #[arg(long)]
94    pub no_label_update: bool,
95}
96
97#[derive(Debug, Clone, Args, Serialize)]
98pub struct ClosePlanArgs {
99    /// Plan issue number (`--issue`-only path is live `plan-issue` only).
100    #[arg(long, value_name = "number")]
101    pub issue: Option<u64>,
102
103    /// Local issue body path (dry-run mode).
104    #[arg(long, value_name = "path")]
105    pub body_file: Option<PathBuf>,
106
107    /// Final approval comment URL.
108    #[arg(long = "approved-comment-url", value_name = "url")]
109    pub approved_comment_url: String,
110
111    /// Close reason.
112    #[arg(long, value_enum, default_value_t = CloseReason::Completed)]
113    pub reason: CloseReason,
114
115    #[command(flatten)]
116    pub close_comment: CommentTextArgs,
117
118    /// Allow closing when some tasks are not done.
119    #[arg(long)]
120    pub allow_not_done: bool,
121}
122
123#[derive(Debug, Clone, Args, Serialize)]
124pub struct CleanupWorktreesArgs {
125    /// Plan issue number (live `plan-issue` only).
126    #[arg(long, value_name = "number")]
127    pub issue: u64,
128}