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.
- lite_kits/__init__.py +9 -9
- lite_kits/cli.py +170 -155
- lite_kits/core/__init__.py +13 -0
- lite_kits/core/banner.py +160 -0
- lite_kits/{installer.py → core/installer.py} +47 -27
- lite_kits/core/manifest.py +146 -0
- lite_kits/kits/README.md +9 -10
- lite_kits/kits/dev/README.md +241 -0
- lite_kits/kits/dev/claude/commands/audit.md +143 -0
- lite_kits/kits/dev/claude/commands/cleanup.md +361 -0
- lite_kits/kits/dev/claude/commands/commit.md +612 -0
- lite_kits/kits/dev/claude/commands/orient.md +146 -0
- lite_kits/kits/dev/claude/commands/pr.md +593 -0
- lite_kits/kits/dev/claude/commands/review.md +202 -0
- lite_kits/kits/dev/claude/commands/stats.md +162 -0
- lite_kits/kits/dev/github/prompts/audit.prompt.md +143 -0
- lite_kits/kits/dev/github/prompts/cleanup.prompt.md +382 -0
- lite_kits/kits/dev/github/prompts/commit.prompt.md +591 -0
- lite_kits/kits/dev/github/prompts/orient.prompt.md +150 -0
- lite_kits/kits/dev/github/prompts/pr.prompt.md +603 -0
- lite_kits/kits/dev/github/prompts/review.prompt.md +202 -0
- lite_kits/kits/dev/github/prompts/stats.prompt.md +163 -0
- lite_kits/kits/git/README.md +59 -68
- lite_kits/kits/git/claude/commands/review.md +202 -0
- lite_kits/kits/git/github/prompts/review.prompt.md +202 -0
- lite_kits/kits/kits.yaml +180 -0
- lite_kits/kits/multiagent/README.md +26 -15
- lite_kits/kits/multiagent/memory/pr-workflow-guide.md +1 -7
- lite_kits/kits/project/README.md +6 -22
- lite_kits/kits/project/claude/commands/audit.md +143 -0
- lite_kits/kits/project/claude/commands/orient.md +29 -46
- lite_kits/kits/project/claude/commands/review.md +112 -0
- lite_kits/kits/project/claude/commands/stats.md +162 -0
- lite_kits/kits/project/github/prompts/audit.prompt.md +143 -0
- lite_kits/kits/project/github/prompts/orient.prompt.md +33 -46
- lite_kits/kits/project/github/prompts/review.prompt.md +112 -0
- lite_kits/kits/project/github/prompts/stats.prompt.md +163 -0
- {lite_kits-0.1.0.dist-info → lite_kits-0.1.1.dist-info}/METADATA +98 -66
- lite_kits-0.1.1.dist-info/RECORD +58 -0
- lite_kits-0.1.0.dist-info/RECORD +0 -31
- {lite_kits-0.1.0.dist-info → lite_kits-0.1.1.dist-info}/WHEEL +0 -0
- {lite_kits-0.1.0.dist-info → lite_kits-0.1.1.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
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 .
|
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
|
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
|
-
|
27
|
-
KIT_GIT = "git"
|
25
|
+
KIT_DEV = "dev"
|
28
26
|
KIT_MULTIAGENT = "multiagent"
|
29
|
-
KITS_ALL = [
|
30
|
-
KITS_RECOMMENDED = [
|
27
|
+
KITS_ALL = [KIT_DEV, KIT_MULTIAGENT]
|
28
|
+
KITS_RECOMMENDED = [KIT_DEV] # dev-kit is the default, multiagent is optional
|
31
29
|
|
32
|
-
#
|
33
|
-
|
34
|
-
|
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
|
-
|
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
|
-
|
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=
|
59
|
-
no_args_is_help=
|
60
|
-
add_completion=False,
|
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(
|
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
|
-
"-
|
80
|
-
help="
|
108
|
+
"-V",
|
109
|
+
help="Display the lite-kits version",
|
81
110
|
callback=version_callback,
|
82
111
|
is_eager=True,
|
83
112
|
),
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
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
|
-
|
97
|
-
|
98
|
-
"--
|
99
|
-
|
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)}
|
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
|
-
|
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
|
-
|
170
|
-
|
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 --
|
209
|
-
lite-kits remove --
|
210
|
-
lite-kits remove --
|
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
|
-
|
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
|
322
|
+
lite-kits validate
|
294
323
|
"""
|
295
|
-
|
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
|
-
|
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
|
368
|
+
lite-kits status
|
353
369
|
"""
|
354
|
-
|
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
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
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
|
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
|
-
#
|
428
|
-
|
429
|
-
console.print(
|
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
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
console.print(
|
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
|
-
|
460
|
-
|
461
|
-
|
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 --
|
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
|
+
]
|