Remove quire-ci local subcommand
quire ci run is the right tool for local testing — it exercises the
full orchestrator path and will dispatch via container when that
executor lands. quire-ci local bypassed the executor entirely and
would have diverged further from the real execution environment.

Also collapses TransportArgs::Filesystem(Option<ApiSession>) to
Filesystem(ApiSession) now that None was only used by local.
change
commit 149549ffdfb8658ba186612a4b48862d41329d9d
author Claude <noreply@anthropic.com>
date
parent e2900837
diff --git a/quire-ci/src/main.rs b/quire-ci/src/main.rs
index 69e0d88..e7e847e 100644
--- a/quire-ci/src/main.rs
+++ b/quire-ci/src/main.rs
@@ -52,17 +52,6 @@ enum Commands {
     /// Compile and validate a ci.fnl pipeline.
     Validate,
 
-    /// Run the pipeline locally against the workspace.
-    ///
-    /// Uses placeholder push metadata (SHA = 40 zeros, ref = "HEAD")
-    /// and no secrets — `(secret :name)` calls error, and `(jobs
-    /// upstream)` reads return Nil for everything except `quire/push`.
-    /// Sh logs are written to a tempdir and dumped to stdout when the
-    /// run finishes.
-    ///
-    /// For orchestrator-dispatched runs see the `run` command.
-    Local,
-
     /// Execute a pipeline dispatched by the orchestrator.
     ///
     /// `--bootstrap <path>` points at a JSON file (see
@@ -120,7 +109,7 @@ impl TransportFlags {
             auth_token,
         };
         Ok(match self.transport {
-            Transport::Filesystem => TransportArgs::Filesystem(Some(session)),
+            Transport::Filesystem => TransportArgs::Filesystem(session),
             Transport::Api => TransportArgs::Api(session),
         })
     }
@@ -209,14 +198,12 @@ pub enum Transport {
 
 /// Resolved transport.
 ///
-/// - `Filesystem(None)`: `local` subcommand; no server session.
-/// - `Filesystem(Some(_))`: `run` subcommand with filesystem executor;
-///   session info held for upcoming API route use.
-/// - `Api(_)`: `run` subcommand with HTTP API executor.
+/// - `Filesystem(_)`: filesystem executor; session info held for upcoming API route use.
+/// - `Api(_)`: HTTP API executor.
 #[derive(Debug)]
 #[allow(dead_code)] // session fields read by upcoming API client
 enum TransportArgs {
-    Filesystem(Option<ApiSession>),
+    Filesystem(ApiSession),
     Api(ApiSession),
 }
 
@@ -225,22 +212,6 @@ fn main() -> miette::Result<()> {
     let cli = Cli::parse();
     match cli.command {
         Commands::Validate => validate(cli.workspace),
-        Commands::Local => {
-            let miette_layer = MietteLayer::new();
-            telemetry::init_tracing(miette_layer, FmtMode::Plain)?;
-            let dir = tempfile::tempdir().into_diagnostic()?;
-            let log_dir = dir.path().to_path_buf();
-            let _dump = DumpLogsOnDrop { dir };
-            run_pipeline(
-                cli.workspace.clone(),
-                Box::new(NullSink),
-                log_dir,
-                cli.workspace.join(".git"),
-                placeholder_meta(),
-                HashMap::new(),
-                TransportArgs::Filesystem(None),
-            )
-        }
         Commands::Run {
             events,
             out_dir,
@@ -372,16 +343,6 @@ fn validate(workspace: PathBuf) -> miette::Result<()> {
     Ok(())
 }
 
-/// Standalone runs synthesize a placeholder `quire/push`. Real meta
-/// arrives via `--bootstrap` from the orchestrator.
-fn placeholder_meta() -> RunMeta {
-    RunMeta {
-        sha: "0".repeat(40),
-        r#ref: "HEAD".to_string(),
-        pushed_at: jiff::Timestamp::now(),
-    }
-}
-
 /// Read and parse the bootstrap file the orchestrator wrote before
 /// spawning. Wraps revealed secret values back into `SecretString`.
 ///