11use anyhow:: Result ;
22use clap:: { Parser , Subcommand , ValueEnum } ;
33
4+ // IMPORTANT: This CLI wrapper for Julia's Pkg does NOT include the following REPL-only commands:
5+ //
6+ // 1. `activate` - This command changes the active environment within a REPL session.
7+ // In a CLI context, each invocation is stateless. Users should use Julia's --project
8+ // flag or JULIA_PROJECT environment variable to specify the project instead.
9+ //
10+ // 2. `undo` - This command undoes the last change within a REPL session.
11+ // In a CLI context, there is no session state to undo. Each command invocation
12+ // is independent and stateless.
13+ //
14+ // 3. `redo` - This command redoes an undone change within a REPL session.
15+ // In a CLI context, there is no session state to redo. Each command invocation
16+ // is independent and stateless.
17+ //
18+ // These commands are fundamentally REPL-specific as they rely on persistent session state
19+ // that doesn't exist in one-time CLI invocations. DO NOT add these commands to this CLI.
20+
421#[ derive( Parser ) ]
522#[ command( name = "jlpkg" ) ]
623#[ command( about = "Julia package manager" , long_about = None ) ]
@@ -28,6 +45,13 @@ enum PreserveLevel {
2845 Tiered ,
2946}
3047
48+ #[ derive( Clone , ValueEnum ) ]
49+ enum UpdatePreserveLevel {
50+ All ,
51+ Direct ,
52+ None ,
53+ }
54+
3155#[ derive( Subcommand ) ]
3256enum PkgCommand {
3357 /// Add packages to project
@@ -73,12 +97,12 @@ enum PkgCommand {
7397 /// Package specifications or paths to develop
7498 packages : Vec < String > ,
7599
76- /// Only download the package
100+ /// Clone package to local project dev folder
77101 #[ arg( short = 'l' , long) ]
78102 local : bool ,
79103
80- /// Install the dependencies of the package
81- #[ arg( short = 'd' , long) ]
104+ /// Clone package to shared dev folder (default)
105+ #[ arg( long) ]
82106 shared : bool ,
83107
84108 /// Preserve level for existing dependencies
@@ -90,27 +114,27 @@ enum PkgCommand {
90114 Free {
91115 /// Packages to free (all if empty)
92116 packages : Vec < String > ,
117+
118+ /// Free all packages
119+ #[ arg( long) ]
120+ all : bool ,
93121 } ,
94122
95123 /// Generate files for packages
96124 Generate {
97125 /// Package name
98126 package : String ,
99-
100- /// Generate package in its own directory
101- #[ arg( short = 't' , long) ]
102- template : bool ,
103127 } ,
104128
105129 /// Garbage collect packages not used for a significant time
106130 Gc {
131+ /// Show verbose output
132+ #[ arg( short = 'v' , long) ]
133+ verbose : bool ,
134+
107135 /// Delete all packages that cannot be reached from any existing environment
108136 #[ arg( long) ]
109137 all : bool ,
110-
111- /// Only log packages that would be garbage collected
112- #[ arg( long) ]
113- dry_run : bool ,
114138 } ,
115139
116140 /// Download and install all artifacts in the manifest
@@ -119,13 +143,13 @@ enum PkgCommand {
119143 #[ arg( short = 'v' , long) ]
120144 verbose : bool ,
121145
122- /// Manifest file to instantiate
123- #[ arg( short = 'm' , long, value_name = "PATH" ) ]
124- manifest : Option < String > ,
146+ /// Use manifest mode
147+ #[ arg( short = 'm' , long) ]
148+ manifest : bool ,
125149
126- /// Project directory
127- #[ arg( short = 'p' , long, value_name = "PATH" , id = "proj" ) ]
128- project : Option < String > ,
150+ /// Use project mode
151+ #[ arg( short = 'p' , long) ]
152+ project : bool ,
129153 } ,
130154
131155 /// Pin packages
@@ -142,38 +166,6 @@ enum PkgCommand {
142166 Precompile {
143167 /// Packages to precompile (all if empty)
144168 packages : Vec < String > ,
145-
146- /// Force recompilation
147- #[ arg( long) ]
148- force : bool ,
149-
150- /// Precompile for different configuration
151- #[ arg( long) ]
152- check_bounds : Option < String > ,
153-
154- /// Precompile for inlining or not
155- #[ arg( long) ]
156- inline : Option < bool > ,
157-
158- /// Precompile package dependencies in parallel
159- #[ arg( short = 'j' , long) ]
160- jobs : Option < usize > ,
161-
162- /// Precompile all configurations
163- #[ arg( long) ]
164- all : bool ,
165-
166- /// Precompile in strict mode
167- #[ arg( long) ]
168- strict : bool ,
169-
170- /// Warn when precompiling
171- #[ arg( long) ]
172- warn_loaded : bool ,
173-
174- /// Only check if packages need precompilation
175- #[ arg( long) ]
176- already_instantiated : bool ,
177169 } ,
178170
179171 /// Remove packages from project
@@ -182,16 +174,16 @@ enum PkgCommand {
182174 /// Packages to remove
183175 packages : Vec < String > ,
184176
185- /// Update manifest
186- #[ arg( short = 'u ' , long) ]
187- update : bool ,
177+ /// Use project mode
178+ #[ arg( short = 'p ' , long) ]
179+ project : bool ,
188180
189- /// Remove mode
190- #[ arg( short = 'm' , long, value_name = "manifest|project|deps|all" ) ]
191- mode : Option < String > ,
181+ /// Use manifest mode
182+ #[ arg( short = 'm' , long) ]
183+ manifest : bool ,
192184
193185 /// Remove all packages
194- #[ arg( short = 'a' , long) ]
186+ #[ arg( long) ]
195187 all : bool ,
196188 } ,
197189
@@ -202,10 +194,7 @@ enum PkgCommand {
202194 } ,
203195
204196 /// Resolve versions in the manifest
205- Resolve {
206- /// Packages to resolve
207- packages : Vec < String > ,
208- } ,
197+ Resolve ,
209198
210199 /// Show project status
211200 #[ command( visible_alias = "st" ) ]
@@ -217,8 +206,8 @@ enum PkgCommand {
217206 #[ arg( short = 'c' , long) ]
218207 compat : bool ,
219208
220- /// Show test dependency compatibility status
221- #[ arg( short = 't ' , long) ]
209+ /// Show extension dependencies
210+ #[ arg( short = 'e ' , long) ]
222211 extensions : bool ,
223212
224213 /// Show manifest status instead of project status
@@ -232,20 +221,16 @@ enum PkgCommand {
232221 /// Show status of outdated packages
233222 #[ arg( short = 'o' , long) ]
234223 outdated : bool ,
235-
236- /// Show status as a table
237- #[ arg( long) ]
238- as_table : bool ,
239224 } ,
240225
241226 /// Run tests for packages
242227 Test {
243228 /// Packages to test (all if empty)
244229 packages : Vec < String > ,
245230
246- /// Set code coverage to track
247- #[ arg( long, value_name = "none|user|all" ) ]
248- coverage : Option < String > ,
231+ /// Run tests with coverage enabled
232+ #[ arg( long) ]
233+ coverage : bool ,
249234 } ,
250235
251236 /// Update packages in manifest
@@ -254,13 +239,33 @@ enum PkgCommand {
254239 /// Packages to update (all if empty)
255240 packages : Vec < String > ,
256241
257- /// Preserve level for existing dependencies
258- #[ arg( long , value_enum ) ]
259- preserve : Option < PreserveLevel > ,
242+ /// Use project mode
243+ #[ arg( short = 'p' , long ) ]
244+ project : bool ,
260245
261- /// Update manifest
246+ /// Use manifest mode
262247 #[ arg( short = 'm' , long) ]
263248 manifest : bool ,
249+
250+ /// Only update within major version
251+ #[ arg( long) ]
252+ major : bool ,
253+
254+ /// Only update within minor version
255+ #[ arg( long) ]
256+ minor : bool ,
257+
258+ /// Only update within patch version
259+ #[ arg( long) ]
260+ patch : bool ,
261+
262+ /// Do not update
263+ #[ arg( long) ]
264+ fixed : bool ,
265+
266+ /// Preserve level for existing dependencies
267+ #[ arg( long, value_enum) ]
268+ preserve : Option < UpdatePreserveLevel > ,
264269 } ,
265270
266271 /// Explains why a package is in the dependency graph
0 commit comments