lite-kits 0.1.0__py3-none-any.whl → 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. lite_kits/__init__.py +9 -9
  2. lite_kits/cli.py +170 -155
  3. lite_kits/core/__init__.py +13 -0
  4. lite_kits/core/banner.py +160 -0
  5. lite_kits/{installer.py → core/installer.py} +47 -27
  6. lite_kits/core/manifest.py +146 -0
  7. lite_kits/kits/README.md +9 -10
  8. lite_kits/kits/dev/README.md +241 -0
  9. lite_kits/kits/dev/claude/commands/audit.md +143 -0
  10. lite_kits/kits/dev/claude/commands/cleanup.md +361 -0
  11. lite_kits/kits/dev/claude/commands/commit.md +612 -0
  12. lite_kits/kits/dev/claude/commands/orient.md +146 -0
  13. lite_kits/kits/dev/claude/commands/pr.md +593 -0
  14. lite_kits/kits/dev/claude/commands/review.md +202 -0
  15. lite_kits/kits/dev/claude/commands/stats.md +162 -0
  16. lite_kits/kits/dev/github/prompts/audit.prompt.md +143 -0
  17. lite_kits/kits/dev/github/prompts/cleanup.prompt.md +382 -0
  18. lite_kits/kits/dev/github/prompts/commit.prompt.md +591 -0
  19. lite_kits/kits/dev/github/prompts/orient.prompt.md +150 -0
  20. lite_kits/kits/dev/github/prompts/pr.prompt.md +603 -0
  21. lite_kits/kits/dev/github/prompts/review.prompt.md +202 -0
  22. lite_kits/kits/dev/github/prompts/stats.prompt.md +163 -0
  23. lite_kits/kits/git/README.md +59 -68
  24. lite_kits/kits/git/claude/commands/review.md +202 -0
  25. lite_kits/kits/git/github/prompts/review.prompt.md +202 -0
  26. lite_kits/kits/kits.yaml +180 -0
  27. lite_kits/kits/multiagent/README.md +26 -15
  28. lite_kits/kits/multiagent/memory/pr-workflow-guide.md +1 -7
  29. lite_kits/kits/project/README.md +6 -22
  30. lite_kits/kits/project/claude/commands/audit.md +143 -0
  31. lite_kits/kits/project/claude/commands/orient.md +29 -46
  32. lite_kits/kits/project/claude/commands/review.md +112 -0
  33. lite_kits/kits/project/claude/commands/stats.md +162 -0
  34. lite_kits/kits/project/github/prompts/audit.prompt.md +143 -0
  35. lite_kits/kits/project/github/prompts/orient.prompt.md +33 -46
  36. lite_kits/kits/project/github/prompts/review.prompt.md +112 -0
  37. lite_kits/kits/project/github/prompts/stats.prompt.md +163 -0
  38. {lite_kits-0.1.0.dist-info → lite_kits-0.1.1.dist-info}/METADATA +98 -66
  39. lite_kits-0.1.1.dist-info/RECORD +58 -0
  40. lite_kits-0.1.0.dist-info/RECORD +0 -31
  41. {lite_kits-0.1.0.dist-info → lite_kits-0.1.1.dist-info}/WHEEL +0 -0
  42. {lite_kits-0.1.0.dist-info → lite_kits-0.1.1.dist-info}/entry_points.txt +0 -0
  43. {lite_kits-0.1.0.dist-info → lite_kits-0.1.1.dist-info}/licenses/LICENSE +0 -0
lite_kits/__init__.py CHANGED
@@ -1,9 +1,9 @@
1
- """
2
- spec-kit-multiagent: Lightweight multi-agent coordination add-on for GitHub spec-kit
3
-
4
- This package adds multi-agent coordination capabilities to vanilla spec-kit projects
5
- without forking or replacing any core files.
6
- """
7
-
8
- __version__ = "0.1.0"
9
- __all__ = ["__version__"]
1
+ """
2
+ spec-kit-multiagent: Lightweight multi-agent coordination add-on for GitHub spec-kit
3
+
4
+ This package adds multi-agent coordination capabilities to vanilla spec-kit projects
5
+ without forking or replacing any core files.
6
+ """
7
+
8
+ __version__ = "0.1.0"
9
+ __all__ = ["__version__"]
lite_kits/cli.py CHANGED
@@ -2,7 +2,7 @@
2
2
  """
3
3
  CLI for lite-kits
4
4
 
5
- Provides commands to add/remove enhancement kits for vanilla dev tools.
5
+ Lightweight enhancement kits for spec-driven development.
6
6
  """
7
7
 
8
8
  import sys
@@ -15,113 +15,161 @@ from rich.panel import Panel
15
15
  from rich.table import Table
16
16
 
17
17
  from . import __version__
18
- from .installer import Installer
18
+ from .core import diagonal_reveal_banner, show_loading_spinner, show_static_banner, Installer
19
19
 
20
20
  # Constants
21
21
  APP_NAME = "lite-kits"
22
- APP_DESCRIPTION = "Lightweight enhancement kits for vanilla dev tools"
23
- HELP_TIP = "Tip: Run 'lite-kits COMMAND --help' for detailed help on each command"
22
+ APP_DESCRIPTION = "Lightweight enhancement kits for spec-driven development."
24
23
 
25
24
  # Kit names
26
- KIT_PROJECT = "project"
27
- KIT_GIT = "git"
25
+ KIT_DEV = "dev"
28
26
  KIT_MULTIAGENT = "multiagent"
29
- KITS_ALL = [KIT_PROJECT, KIT_GIT, KIT_MULTIAGENT]
30
- KITS_RECOMMENDED = [KIT_PROJECT, KIT_GIT]
27
+ KITS_ALL = [KIT_DEV, KIT_MULTIAGENT]
28
+ KITS_RECOMMENDED = [KIT_DEV] # dev-kit is the default, multiagent is optional
31
29
 
32
- # Help panel names
33
- PANEL_KIT_MANAGEMENT = "Kit Management"
34
- PANEL_PACKAGE_MANAGEMENT = "Package Management"
35
-
36
- # Kit descriptions
37
- KIT_DESC_PROJECT = "/orient command, project orientation features"
38
- KIT_DESC_GIT = "/commit, /pr, /cleanup commands with smart workflows"
39
- KIT_DESC_MULTIAGENT = "/sync, collaboration directories, memory guides"
40
-
41
- # Status indicators
42
- STATUS_OK = "[green][OK][/green]"
43
- STATUS_NOT_FOUND = "[dim][--][/dim]"
44
- STATUS_ERROR = "[red][X][/red]"
30
+ # Kit descriptions for help
31
+ KIT_DESC_DEV = "Solo development essentials: /orient, /commit, /pr, /review, /cleanup, /audit, /stats"
32
+ KIT_DESC_MULTIAGENT = "Multi-agent coordination: /sync, collaboration dirs, memory guides (optional)"
45
33
 
46
34
  # Marker files for kit detection
47
- MARKER_PROJECT_KIT = ".claude/commands/orient.md"
48
- MARKER_GIT_KIT = ".claude/commands/commit.md"
35
+ MARKER_DEV_KIT = ".claude/commands/orient.md" # If orient exists, dev-kit is installed
49
36
  MARKER_MULTIAGENT_KIT = ".specify/memory/pr-workflow-guide.md"
50
37
 
51
38
  # Error messages
52
- ERROR_NO_TARGET = "Either --here or a target directory must be specified"
53
- ERROR_NOT_SPEC_KIT = "does not appear to be a spec-kit project"
39
+ ERROR_NOT_SPEC_KIT = "does not appear to be a spec-kit project!"
54
40
  ERROR_SPEC_KIT_HINT = "Looking for one of: .specify/, .claude/, or .github/prompts/"
55
41
 
56
42
  app = typer.Typer(
57
43
  name=APP_NAME,
58
- help=f"{APP_DESCRIPTION}\n\n[dim]{HELP_TIP}[/dim]",
59
- no_args_is_help=True,
60
- add_completion=False, # Disable shell completion to avoid modifying user profiles
61
- add_help_option=False, # Don't show --help in command help (redundant)
44
+ help=APP_DESCRIPTION, # Restore original description for --help
45
+ no_args_is_help=False, # We'll handle no-args case ourselves
46
+ add_completion=False,
62
47
  rich_markup_mode="rich",
63
48
  )
64
49
  console = Console()
65
50
 
51
+ def print_help_hint():
52
+ console.print(f"[dim]See [bold cyan]--help[/bold cyan] for all options and commands.[/dim]\n")
53
+
54
+ def print_version_info():
55
+ """Print version information."""
56
+ console.print(f"[bold]Version:[/bold]")
57
+ console.print(f" [bold cyan]{APP_NAME} version {__version__}[/bold cyan]\n")
58
+
59
+ def print_quick_start():
60
+ console.print("[bold]Quick Start:[/bold]")
61
+ console.print(f" [cyan]1. {APP_NAME} add --recommended[/cyan] # Add project + git kits")
62
+ console.print(f" [cyan]2. {APP_NAME} status[/cyan] # Check installation")
63
+ console.print(f" [cyan]3. {APP_NAME} info[/cyan] # Package details\n")
64
+
65
+ def print_kit_info(target_dir: Path, is_spec_kit: bool, installed_kits: list):
66
+ """Print kit installation info."""
67
+ console.print()
68
+ if is_spec_kit:
69
+ console.print(f"[bold green][OK] Spec-kit project detected in {target_dir}.[/bold green]\n")
70
+ if installed_kits:
71
+ console.print("Installed kits:", style="bold")
72
+ kit_icons = {
73
+ "project": "🎯",
74
+ "git": "🔧",
75
+ "multiagent": "🤝"
76
+ }
77
+ for kit in installed_kits:
78
+ icon = kit_icons.get(kit, "📦")
79
+ console.print(f" {icon} {kit}-kit", style="green")
80
+ else:
81
+ console.print("No kits installed.", style="dim yellow")
82
+ else:
83
+ console.print(f"[bold red][X] {target_dir} {ERROR_NOT_SPEC_KIT}[/bold red]")
84
+ console.print(f"{ERROR_SPEC_KIT_HINT}", style="dim")
85
+ console.print()
66
86
 
67
87
  def version_callback(value: bool):
68
88
  """Print version and exit."""
69
89
  if value:
70
- console.print(f"{APP_NAME} version {__version__}")
90
+ console.print()
91
+ print_version_info()
71
92
  raise typer.Exit()
72
93
 
94
+ def banner_callback(value: bool):
95
+ """Show banner + hint and exit."""
96
+ if value:
97
+ diagonal_reveal_banner()
98
+ print_help_hint()
99
+ print_quick_start()
100
+ raise typer.Exit()
73
101
 
74
- @app.callback()
102
+ @app.callback(invoke_without_command=True)
75
103
  def main(
104
+ ctx: typer.Context,
76
105
  version: Optional[bool] = typer.Option(
77
106
  None,
78
107
  "--version",
79
- "-v",
80
- help="Show version and exit",
108
+ "-V",
109
+ help="Display the lite-kits version",
81
110
  callback=version_callback,
82
111
  is_eager=True,
83
112
  ),
84
- ):
85
- f"""{APP_NAME}: {APP_DESCRIPTION}"""
86
- pass
87
-
88
-
89
- @app.command(name="add", rich_help_panel=PANEL_KIT_MANAGEMENT)
90
- def add_kits(
91
- here: bool = typer.Option(
92
- False,
93
- "--here",
94
- help="Add to current directory",
113
+ banner: Optional[bool] = typer.Option(
114
+ None,
115
+ "--banner",
116
+ help="Show the lite-kits banner",
117
+ callback=banner_callback,
118
+ is_eager=True,
95
119
  ),
96
- dry_run: bool = typer.Option(
97
- False,
98
- "--dry-run",
99
- help="Preview changes without applying them",
120
+ quiet: Optional[bool] = typer.Option(
121
+ None,
122
+ "--quiet",
123
+ "-q",
124
+ help="Use quiet output",
100
125
  ),
126
+ verbose: Optional[bool] = typer.Option(
127
+ None,
128
+ "--verbose",
129
+ "-v",
130
+ help="Use verbose output",
131
+ ),
132
+ directory: Optional[Path] = typer.Option(
133
+ None,
134
+ "--directory",
135
+ help="Change to the given directory prior to running the command",
136
+ ),
137
+ ):
138
+ """Main CLI entry point."""
139
+ if directory:
140
+ import os
141
+ os.chdir(directory)
142
+
143
+ # Show banner + hint and quick-start when no command is given
144
+ if ctx.invoked_subcommand is None:
145
+ show_static_banner()
146
+ print_help_hint()
147
+ print_quick_start()
148
+
149
+ @app.command(name="add")
150
+ def add_kits(
101
151
  kit: Optional[str] = typer.Option(
102
152
  None,
103
153
  "--kit",
104
- help=f"Comma-separated list of kits to add: {','.join(KITS_ALL)} (default: {KIT_PROJECT})",
154
+ help=f"Comma-separated list of kits to add: {','.join(KITS_ALL)}",
105
155
  ),
106
156
  recommended: bool = typer.Option(
107
157
  False,
108
158
  "--recommended",
109
159
  help=f"Add recommended kits: {' + '.join(KITS_RECOMMENDED)}",
110
160
  ),
161
+ dry_run: bool = typer.Option(
162
+ False,
163
+ "--dry-run",
164
+ help="Preview changes without applying them",
165
+ ),
111
166
  target: Optional[Path] = typer.Argument(
112
167
  None,
113
168
  help="Target directory (defaults to current directory)",
114
169
  ),
115
170
  ):
116
171
  """Add enhancement kits to a spec-kit project."""
117
- if not here and target is None:
118
- console.print(
119
- f"[red]Error:[/red] {ERROR_NO_TARGET}",
120
- style="bold",
121
- )
122
- raise typer.Exit(1)
123
-
124
- target_dir = Path.cwd() if here else target
172
+ target_dir = Path.cwd() if target is None else target
125
173
 
126
174
  # Determine which kits to install
127
175
  kits = None
@@ -166,27 +214,23 @@ def add_kits(
166
214
  else:
167
215
  console.print(f"\n[bold green]Adding enhancement kits to {target_dir}[/bold green]\n")
168
216
 
169
- with console.status("[bold green]Adding kits..."):
170
- result = installer.install()
217
+ show_loading_spinner("Adding kits...")
218
+ result = installer.install()
171
219
 
172
220
  if result["success"]:
173
221
  console.print("\n[bold green][OK] Kits added successfully![/bold green]\n")
174
222
  _display_installation_summary(result)
223
+ # Show static banner after successful install
224
+ show_static_banner()
175
225
  else:
176
226
  console.print(f"\n[bold red][X] Failed to add kits:[/bold red] {result['error']}\n")
177
227
  raise typer.Exit(1)
178
228
 
179
-
180
- @app.command(rich_help_panel=PANEL_KIT_MANAGEMENT)
229
+ @app.command()
181
230
  def remove(
182
- here: bool = typer.Option(
183
- False,
184
- "--here",
185
- help="Remove from current directory",
186
- ),
187
231
  kit: Optional[str] = typer.Option(
188
232
  None,
189
- "--kit",
233
+ "--kit",
190
234
  help=f"Comma-separated list of kits to remove: {','.join(KITS_ALL)}",
191
235
  ),
192
236
  all_kits: bool = typer.Option(
@@ -199,24 +243,16 @@ def remove(
199
243
  help="Target directory (defaults to current directory)",
200
244
  ),
201
245
  ):
202
- """
203
- Remove enhancement kits from a spec-kit project.
246
+ """Remove enhancement kits from a spec-kit project.
204
247
 
205
248
  Returns the project to vanilla spec-kit state.
206
249
 
207
250
  Examples:
208
- lite-kits remove --here --kit git # Remove git-kit only
209
- lite-kits remove --here --kit project,git # Remove specific kits
210
- lite-kits remove --here --all # Remove all kits
251
+ lite-kits remove --kit git # Remove git-kit only
252
+ lite-kits remove --kit project,git # Remove specific kits
253
+ lite-kits remove --all # Remove all kits
211
254
  """
212
- if not here and target is None:
213
- console.print(
214
- "[red]Error:[/red] Either --here or a target directory must be specified",
215
- style="bold",
216
- )
217
- raise typer.Exit(1)
218
-
219
- target_dir = Path.cwd() if here else target
255
+ target_dir = Path.cwd() if target is None else target
220
256
 
221
257
  # Determine which kits to remove
222
258
  kits = None
@@ -267,36 +303,25 @@ def remove(
267
303
  console.print(f"\n[bold red]Removal failed:[/bold red] {result['error']}\n")
268
304
  raise typer.Exit(1)
269
305
 
270
-
271
- @app.command(rich_help_panel=PANEL_KIT_MANAGEMENT)
306
+ @app.command()
272
307
  def validate(
273
- here: bool = typer.Option(
274
- False,
275
- "--here",
276
- help="Validate current directory",
277
- ),
278
308
  target: Optional[Path] = typer.Argument(
279
309
  None,
280
310
  help="Target directory (defaults to current directory)",
281
311
  ),
282
312
  ):
283
- """
284
- Validate enhancement kit installation.
313
+ """Validate enhancement kit installation.
285
314
 
286
315
  Checks:
287
316
  - Kit files are present and correctly installed
288
- - Collaboration directory structure (if multiagent-kit installed)
317
+ - Collaboration directory structure (if multiagent-kit installed)
289
318
  - Required files present
290
319
  - Cross-kit consistency
291
320
 
292
321
  Example:
293
- lite-kits validate --here
322
+ lite-kits validate
294
323
  """
295
- # Default to current directory if no target specified
296
- if here or target is None:
297
- target_dir = Path.cwd()
298
- else:
299
- target_dir = target
324
+ target_dir = Path.cwd() if target is None else target
300
325
 
301
326
  # For validation, we don't know which kits are installed yet, so check for all
302
327
  installer = Installer(target_dir, kits=KITS_ALL)
@@ -315,53 +340,38 @@ def validate(
315
340
  raise typer.Exit(1)
316
341
 
317
342
  # Validate structure
318
- with console.status("[bold cyan]Validating..."):
319
- validation_result = installer.validate()
320
-
343
+ validation_result = show_loading_spinner("Validating...", installer.validate)
321
344
  _display_validation_results(validation_result)
322
345
 
323
346
  if validation_result["valid"]:
324
- console.print("\n[bold green][OK] Validation passed![/bold green]")
347
+ console.print("\n[bold green][OK] Validation passed![/bold green]\n")
325
348
  raise typer.Exit(0)
326
349
  else:
327
- console.print("\n[bold red][X] Validation failed[/bold red]")
350
+ console.print("\n[bold red][X] Validation failed[/bold red]\n")
328
351
  raise typer.Exit(1)
329
352
 
330
-
331
- @app.command(rich_help_panel=PANEL_KIT_MANAGEMENT)
353
+ @app.command()
332
354
  def status(
333
- here: bool = typer.Option(
334
- False,
335
- "--here",
336
- help="Check current directory",
337
- ),
338
355
  target: Optional[Path] = typer.Argument(
339
356
  None,
340
357
  help="Target directory (defaults to current directory)",
341
358
  ),
342
359
  ):
343
- """
344
- Show enhancement kit installation status for the project.
360
+ """Show enhancement kit installation status for the project.
345
361
 
346
362
  Displays:
347
363
  - Spec-kit project detection
348
- - Installed kits
364
+ - Installed kits
349
365
  - Installation health
350
366
 
351
367
  Example:
352
- lite-kits status --here
368
+ lite-kits status
353
369
  """
354
- # Default to current directory if no target specified
355
- if here or target is None:
356
- target_dir = Path.cwd()
357
- else:
358
- target_dir = target
370
+ target_dir = Path.cwd() if target is None else target
359
371
 
360
372
  # For status, check for all possible kits
361
373
  installer = Installer(target_dir, kits=KITS_ALL)
362
374
 
363
- console.print(f"\n[bold cyan]Project Status: {target_dir}[/bold cyan]\n")
364
-
365
375
  # Basic checks
366
376
  is_spec_kit = installer.is_spec_kit_project()
367
377
 
@@ -370,18 +380,18 @@ def status(
370
380
  git_kit_installed = (target_dir / MARKER_GIT_KIT).exists()
371
381
  multiagent_kit_installed = (target_dir / MARKER_MULTIAGENT_KIT).exists()
372
382
 
373
- table = Table(show_header=False, box=None)
374
- table.add_column("Item", style="cyan")
375
- table.add_column("Status")
376
-
377
- table.add_row("Spec-kit project", STATUS_OK if is_spec_kit else STATUS_ERROR)
378
- table.add_row(f"{KIT_PROJECT}-kit", STATUS_OK if project_kit_installed else STATUS_NOT_FOUND)
379
- table.add_row(f"{KIT_GIT}-kit", STATUS_OK if git_kit_installed else STATUS_NOT_FOUND)
380
- table.add_row(f"{KIT_MULTIAGENT}-kit", STATUS_OK if multiagent_kit_installed else STATUS_NOT_FOUND)
381
-
382
- console.print(table)
383
- console.print()
383
+ # Build list of installed kits for banner
384
+ installed_kits = []
385
+ if project_kit_installed:
386
+ installed_kits.append("project")
387
+ if git_kit_installed:
388
+ installed_kits.append("git")
389
+ if multiagent_kit_installed:
390
+ installed_kits.append("multiagent")
384
391
 
392
+ # Show banner + kit info
393
+ show_static_banner()
394
+ print_kit_info(target_dir, is_spec_kit, installed_kits)
385
395
 
386
396
  def _display_changes(changes: dict):
387
397
  """Display preview of changes."""
@@ -397,7 +407,6 @@ def _display_changes(changes: dict):
397
407
  for dir in changes.get("new_directories", []):
398
408
  console.print(f" [blue]+[/blue] {dir}")
399
409
 
400
-
401
410
  def _display_installation_summary(result: dict):
402
411
  """Display kit addition summary."""
403
412
  console.print("[bold]Added:[/bold]")
@@ -405,10 +414,9 @@ def _display_installation_summary(result: dict):
405
414
  console.print(f" [OK] {item}")
406
415
 
407
416
  console.print("\n[bold cyan]Next steps:[/bold cyan]")
408
- console.print(" 1. Run: /orient (in your AI assistant)")
417
+ console.print(f" 1. Run: /orient (in your AI assistant)")
409
418
  console.print(f" 2. Check: {MARKER_PROJECT_KIT} or .github/prompts/orient.prompt.md")
410
- console.print(f" 3. Validate: {APP_NAME} validate --here")
411
-
419
+ console.print(f" 3. Validate: {APP_NAME} validate")
412
420
 
413
421
  def _display_validation_results(result: dict):
414
422
  """Display validation results."""
@@ -420,15 +428,15 @@ def _display_validation_results(result: dict):
420
428
  if not check_result["passed"] and "message" in check_result:
421
429
  console.print(f" {check_result['message']}", style="dim")
422
430
 
423
-
424
- @app.command(name="info", rich_help_panel=PANEL_PACKAGE_MANAGEMENT)
431
+ @app.command(name="info")
425
432
  def package_info():
426
433
  """Show package information and installation details."""
427
- # Use __version__ from package instead of importlib.metadata
428
- console.print(f"\n[bold cyan]{APP_NAME} v{__version__}[/bold cyan]")
429
- console.print(f"[dim]{APP_DESCRIPTION}[/dim]\n")
434
+ # Show the static banner for visual appeal
435
+ show_static_banner()
436
+ console.print()
430
437
 
431
438
  # Package info
439
+ console.print("[bold]Info:[/bold]")
432
440
  info_table = Table(show_header=False, box=None, padding=(0, 2))
433
441
  info_table.add_column("Key", style="cyan")
434
442
  info_table.add_column("Value")
@@ -442,27 +450,30 @@ def package_info():
442
450
 
443
451
  # Available kits
444
452
  console.print("[bold]Available Kits:[/bold]")
445
- console.print(f" • [cyan]{KIT_PROJECT}[/cyan]: {KIT_DESC_PROJECT}")
446
- console.print(f" [cyan]{KIT_GIT}[/cyan]: {KIT_DESC_GIT}")
447
- console.print(f" • [cyan]{KIT_MULTIAGENT}[/cyan]: {KIT_DESC_MULTIAGENT}")
448
- console.print()
449
-
450
- # Quick start
451
- console.print("[bold]Quick Start:[/bold]")
452
- console.print(f" 1. [cyan]{APP_NAME} add --here --recommended[/cyan] # Add project + git kits")
453
- console.print(f" 2. [cyan]{APP_NAME} status --here[/cyan] # Check installation")
454
- console.print(f" 3. [cyan]/orient[/cyan] # Run in your AI assistant")
453
+ kits_table = Table(show_header=False, box=None, padding=(0, 2))
454
+ kits_table.add_column("Kit", style="cyan")
455
+ kits_table.add_column("Description")
456
+
457
+ kits_table.add_row(KIT_PROJECT, KIT_DESC_PROJECT)
458
+ kits_table.add_row(KIT_GIT, KIT_DESC_GIT)
459
+ kits_table.add_row(KIT_MULTIAGENT, KIT_DESC_MULTIAGENT)
460
+
461
+ console.print(kits_table)
455
462
  console.print()
456
463
 
457
464
  # Package management
458
465
  console.print("[bold]Package Management:[/bold]")
459
- console.print(f" Install: [dim]uv tool install {APP_NAME}[/dim]")
460
- console.print(f" Update: [dim]uv tool install --upgrade {APP_NAME}[/dim]")
461
- console.print(f" Uninstall: [dim]uv tool uninstall {APP_NAME}[/dim]")
466
+ package_table = Table(show_header=False, box=None, padding=(0, 2))
467
+ package_table.add_column("Action", style="cyan")
468
+ package_table.add_column("Command")
469
+
470
+ package_table.add_row("Update", f"[dim]uv tool install --upgrade {APP_NAME}[/dim]")
471
+ package_table.add_row("Uninstall", f"[dim]uv tool uninstall {APP_NAME}[/dim]")
472
+
473
+ console.print(package_table)
462
474
  console.print()
463
475
 
464
-
465
- @app.command(name="uninstall", rich_help_panel=PANEL_PACKAGE_MANAGEMENT)
476
+ @app.command(name="uninstall")
466
477
  def package_uninstall():
467
478
  """Instructions for uninstalling the lite-kits package."""
468
479
  console.print(f"\n[bold yellow]Uninstall {APP_NAME}[/bold yellow]\n")
@@ -474,8 +485,12 @@ def package_uninstall():
474
485
  console.print(f" [dim]pip uninstall {APP_NAME}[/dim]\n")
475
486
 
476
487
  console.print("[bold]Note:[/bold] This will remove the package but NOT the kits you've added to projects.")
477
- console.print(f"To remove kits from a project, first run: [cyan]{APP_NAME} remove --here --all[/cyan]\n")
488
+ console.print(f"To remove kits from a project, first run: [cyan]{APP_NAME} remove --all[/cyan]\n")
478
489
 
490
+ @app.command(name="banner", hidden=True)
491
+ def show_banner():
492
+ """Show the lite-kits banner (hidden easter egg command)."""
493
+ diagonal_reveal_banner()
479
494
 
480
495
  if __name__ == "__main__":
481
496
  app()
@@ -0,0 +1,13 @@
1
+ """Core modules for lite-kits."""
2
+
3
+ from .banner import diagonal_reveal_banner, show_loading_spinner, show_static_banner
4
+ from .installer import Installer
5
+ from .manifest import KitManifest
6
+
7
+ __all__ = [
8
+ "diagonal_reveal_banner",
9
+ "show_loading_spinner",
10
+ "show_static_banner",
11
+ "Installer",
12
+ "KitManifest",
13
+ ]