lite-kits 0.1.1__py3-none-any.whl → 0.3.2__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 +56 -4
- lite_kits/cli.py +782 -189
- lite_kits/core/__init__.py +6 -0
- lite_kits/core/banner.py +1 -1
- lite_kits/core/conflict_checker.py +115 -0
- lite_kits/core/detector.py +177 -0
- lite_kits/core/installer.py +242 -351
- lite_kits/core/manifest.py +146 -146
- lite_kits/core/validator.py +183 -0
- lite_kits/kits/README.md +6 -6
- lite_kits/kits/dev/README.md +241 -241
- lite_kits/kits/dev/{claude/commands → commands/.claude}/audit.md +143 -143
- lite_kits/kits/dev/{claude/commands → commands/.claude}/cleanup.md +2 -2
- lite_kits/kits/{git/claude/commands → dev/commands/.claude}/commit.md +2 -2
- lite_kits/kits/{project/claude/commands → dev/commands/.claude}/orient.md +3 -4
- lite_kits/kits/{git/claude/commands → dev/commands/.claude}/pr.md +1 -1
- lite_kits/kits/{git/claude/commands → dev/commands/.claude}/review.md +202 -202
- lite_kits/kits/{project/claude/commands → dev/commands/.claude}/stats.md +162 -162
- lite_kits/kits/{project/github/prompts → dev/commands/.github}/audit.prompt.md +143 -143
- lite_kits/kits/{git/github/prompts → dev/commands/.github}/cleanup.prompt.md +2 -2
- lite_kits/kits/{git/github/prompts → dev/commands/.github}/commit.prompt.md +2 -2
- lite_kits/kits/dev/{github/prompts → commands/.github}/orient.prompt.md +3 -4
- lite_kits/kits/{git/github/prompts → dev/commands/.github}/pr.prompt.md +1 -1
- lite_kits/kits/{git/github/prompts → dev/commands/.github}/review.prompt.md +202 -202
- lite_kits/kits/dev/{github/prompts → commands/.github}/stats.prompt.md +163 -163
- lite_kits/kits/kits.yaml +497 -180
- lite_kits/kits/multiagent/README.md +6 -6
- lite_kits/kits/multiagent/{claude/commands → commands/.claude}/sync.md +331 -331
- lite_kits/kits/multiagent/{github/prompts → commands/.github}/sync.prompt.md +73 -69
- lite_kits/kits/multiagent/memory/git-worktrees-protocol.md +370 -370
- lite_kits/kits/multiagent/memory/parallel-work-protocol.md +536 -536
- lite_kits/kits/multiagent/memory/pr-workflow-guide.md +275 -275
- lite_kits/kits/multiagent/templates/collaboration-structure/README.md +166 -166
- lite_kits/kits/multiagent/templates/decision.md +79 -79
- lite_kits/kits/multiagent/templates/handoff.md +95 -95
- lite_kits/kits/multiagent/templates/session-log.md +68 -68
- lite_kits-0.3.2.dist-info/METADATA +259 -0
- lite_kits-0.3.2.dist-info/RECORD +41 -0
- {lite_kits-0.1.1.dist-info → lite_kits-0.3.2.dist-info}/licenses/LICENSE +21 -21
- lite_kits/kits/dev/claude/commands/commit.md +0 -612
- lite_kits/kits/dev/claude/commands/orient.md +0 -146
- lite_kits/kits/dev/claude/commands/pr.md +0 -593
- lite_kits/kits/dev/claude/commands/review.md +0 -202
- lite_kits/kits/dev/claude/commands/stats.md +0 -162
- lite_kits/kits/dev/github/prompts/audit.prompt.md +0 -143
- lite_kits/kits/dev/github/prompts/cleanup.prompt.md +0 -382
- lite_kits/kits/dev/github/prompts/commit.prompt.md +0 -591
- lite_kits/kits/dev/github/prompts/pr.prompt.md +0 -603
- lite_kits/kits/dev/github/prompts/review.prompt.md +0 -202
- lite_kits/kits/git/README.md +0 -365
- lite_kits/kits/git/claude/commands/cleanup.md +0 -361
- lite_kits/kits/git/scripts/bash/get-git-context.sh +0 -208
- lite_kits/kits/git/scripts/powershell/Get-GitContext.ps1 +0 -242
- lite_kits/kits/project/README.md +0 -228
- lite_kits/kits/project/claude/commands/audit.md +0 -143
- lite_kits/kits/project/claude/commands/review.md +0 -112
- lite_kits/kits/project/github/prompts/orient.prompt.md +0 -150
- lite_kits/kits/project/github/prompts/review.prompt.md +0 -112
- lite_kits/kits/project/github/prompts/stats.prompt.md +0 -163
- lite_kits-0.1.1.dist-info/METADATA +0 -447
- lite_kits-0.1.1.dist-info/RECORD +0 -58
- {lite_kits-0.1.1.dist-info → lite_kits-0.3.2.dist-info}/WHEEL +0 -0
- {lite_kits-0.1.1.dist-info → lite_kits-0.3.2.dist-info}/entry_points.txt +0 -0
lite_kits/core/manifest.py
CHANGED
@@ -1,146 +1,146 @@
|
|
1
|
-
"""
|
2
|
-
Kit manifest loader and utilities.
|
3
|
-
|
4
|
-
Loads kit definitions from kits.yaml and provides helpers for installation,
|
5
|
-
validation, and status checking.
|
6
|
-
"""
|
7
|
-
|
8
|
-
from pathlib import Path
|
9
|
-
from typing import Dict, List, Optional
|
10
|
-
import yaml
|
11
|
-
|
12
|
-
|
13
|
-
class KitManifest:
|
14
|
-
"""Loads and provides access to kit definitions from kits.yaml"""
|
15
|
-
|
16
|
-
def __init__(self, kits_dir: Path):
|
17
|
-
"""
|
18
|
-
Initialize manifest loader.
|
19
|
-
|
20
|
-
Args:
|
21
|
-
kits_dir: Path to kits directory containing kits.yaml
|
22
|
-
"""
|
23
|
-
self.kits_dir = kits_dir
|
24
|
-
self.manifest_path = kits_dir / "kits.yaml"
|
25
|
-
self._manifest = None
|
26
|
-
|
27
|
-
@property
|
28
|
-
def manifest(self) -> Dict:
|
29
|
-
"""Load and cache manifest data"""
|
30
|
-
if self._manifest is None:
|
31
|
-
with open(self.manifest_path) as f:
|
32
|
-
self._manifest = yaml.safe_load(f)
|
33
|
-
return self._manifest
|
34
|
-
|
35
|
-
def get_kit(self, kit_name: str) -> Optional[Dict]:
|
36
|
-
"""Get kit definition by name"""
|
37
|
-
return self.manifest['kits'].get(kit_name)
|
38
|
-
|
39
|
-
def get_all_kits(self) -> Dict[str, Dict]:
|
40
|
-
"""Get all kit definitions"""
|
41
|
-
return self.manifest['kits']
|
42
|
-
|
43
|
-
def get_kit_names(self) -> List[str]:
|
44
|
-
"""Get list of all kit names"""
|
45
|
-
return list(self.manifest['kits'].keys())
|
46
|
-
|
47
|
-
def get_recommended_kits(self) -> List[str]:
|
48
|
-
"""Get list of recommended kit names"""
|
49
|
-
return [
|
50
|
-
name for name, kit in self.manifest['kits'].items()
|
51
|
-
if kit.get('recommended', False)
|
52
|
-
]
|
53
|
-
|
54
|
-
def get_default_kit(self) -> str:
|
55
|
-
"""Get default kit name"""
|
56
|
-
return self.manifest['options']['default_kit']
|
57
|
-
|
58
|
-
def get_kit_files(self, kit_name: str, agent: Optional[str] = None) -> List[Dict]:
|
59
|
-
"""
|
60
|
-
Get list of files for a kit.
|
61
|
-
|
62
|
-
Args:
|
63
|
-
kit_name: Name of kit
|
64
|
-
agent: Optional agent filter ('claude', 'copilot', None for all)
|
65
|
-
|
66
|
-
Returns:
|
67
|
-
List of file dicts with 'path', 'source', 'required' keys
|
68
|
-
"""
|
69
|
-
kit = self.get_kit(kit_name)
|
70
|
-
if not kit:
|
71
|
-
return []
|
72
|
-
|
73
|
-
files = []
|
74
|
-
file_groups = kit.get('files', {})
|
75
|
-
|
76
|
-
# Map agent names to file groups
|
77
|
-
agent_groups = {
|
78
|
-
'claude': ['claude'],
|
79
|
-
'copilot': ['copilot'],
|
80
|
-
None: list(file_groups.keys()) # All groups
|
81
|
-
}
|
82
|
-
|
83
|
-
groups_to_include = agent_groups.get(agent, [])
|
84
|
-
|
85
|
-
for group_name in groups_to_include:
|
86
|
-
if group_name in file_groups:
|
87
|
-
files.extend(file_groups[group_name])
|
88
|
-
|
89
|
-
return files
|
90
|
-
|
91
|
-
def get_kit_markers(self, kit_name: str) -> List[str]:
|
92
|
-
"""
|
93
|
-
Get marker files for kit detection.
|
94
|
-
|
95
|
-
Args:
|
96
|
-
kit_name: Name of kit
|
97
|
-
|
98
|
-
Returns:
|
99
|
-
List of marker file paths
|
100
|
-
"""
|
101
|
-
kit = self.get_kit(kit_name)
|
102
|
-
return kit.get('markers', []) if kit else []
|
103
|
-
|
104
|
-
def get_kit_commands(self, kit_name: str) -> List[Dict]:
|
105
|
-
"""
|
106
|
-
Get list of commands for a kit.
|
107
|
-
|
108
|
-
Args:
|
109
|
-
kit_name: Name of kit
|
110
|
-
|
111
|
-
Returns:
|
112
|
-
List of command dicts with 'name', 'description', 'status' keys
|
113
|
-
"""
|
114
|
-
kit = self.get_kit(kit_name)
|
115
|
-
return kit.get('commands', []) if kit else []
|
116
|
-
|
117
|
-
def get_agent_config(self, agent: str) -> Optional[Dict]:
|
118
|
-
"""
|
119
|
-
Get agent configuration.
|
120
|
-
|
121
|
-
Args:
|
122
|
-
agent: Agent name ('claude', 'copilot')
|
123
|
-
|
124
|
-
Returns:
|
125
|
-
Agent config dict or None
|
126
|
-
"""
|
127
|
-
return self.manifest.get('agents', {}).get(agent)
|
128
|
-
|
129
|
-
def validate_kit_name(self, kit_name: str) -> bool:
|
130
|
-
"""Check if kit name is valid"""
|
131
|
-
return kit_name in self.get_kit_names()
|
132
|
-
|
133
|
-
def get_kit_description(self, kit_name: str) -> str:
|
134
|
-
"""Get kit description"""
|
135
|
-
kit = self.get_kit(kit_name)
|
136
|
-
return kit.get('description', '') if kit else ''
|
137
|
-
|
138
|
-
def get_kit_icon(self, kit_name: str) -> str:
|
139
|
-
"""Get kit icon emoji"""
|
140
|
-
kit = self.get_kit(kit_name)
|
141
|
-
return kit.get('icon', '📦') if kit else '📦'
|
142
|
-
|
143
|
-
def is_recommended(self, kit_name: str) -> bool:
|
144
|
-
"""Check if kit is recommended"""
|
145
|
-
kit = self.get_kit(kit_name)
|
146
|
-
return kit.get('recommended', False) if kit else False
|
1
|
+
"""
|
2
|
+
Kit manifest loader and utilities.
|
3
|
+
|
4
|
+
Loads kit definitions from kits.yaml and provides helpers for installation,
|
5
|
+
validation, and status checking.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from pathlib import Path
|
9
|
+
from typing import Dict, List, Optional
|
10
|
+
import yaml
|
11
|
+
|
12
|
+
|
13
|
+
class KitManifest:
|
14
|
+
"""Loads and provides access to kit definitions from kits.yaml"""
|
15
|
+
|
16
|
+
def __init__(self, kits_dir: Path):
|
17
|
+
"""
|
18
|
+
Initialize manifest loader.
|
19
|
+
|
20
|
+
Args:
|
21
|
+
kits_dir: Path to kits directory containing kits.yaml
|
22
|
+
"""
|
23
|
+
self.kits_dir = kits_dir
|
24
|
+
self.manifest_path = kits_dir / "kits.yaml"
|
25
|
+
self._manifest = None
|
26
|
+
|
27
|
+
@property
|
28
|
+
def manifest(self) -> Dict:
|
29
|
+
"""Load and cache manifest data"""
|
30
|
+
if self._manifest is None:
|
31
|
+
with open(self.manifest_path, encoding='utf-8') as f:
|
32
|
+
self._manifest = yaml.safe_load(f)
|
33
|
+
return self._manifest
|
34
|
+
|
35
|
+
def get_kit(self, kit_name: str) -> Optional[Dict]:
|
36
|
+
"""Get kit definition by name"""
|
37
|
+
return self.manifest['kits'].get(kit_name)
|
38
|
+
|
39
|
+
def get_all_kits(self) -> Dict[str, Dict]:
|
40
|
+
"""Get all kit definitions"""
|
41
|
+
return self.manifest['kits']
|
42
|
+
|
43
|
+
def get_kit_names(self) -> List[str]:
|
44
|
+
"""Get list of all kit names"""
|
45
|
+
return list(self.manifest['kits'].keys())
|
46
|
+
|
47
|
+
def get_recommended_kits(self) -> List[str]:
|
48
|
+
"""Get list of recommended kit names"""
|
49
|
+
return [
|
50
|
+
name for name, kit in self.manifest['kits'].items()
|
51
|
+
if kit.get('recommended', False)
|
52
|
+
]
|
53
|
+
|
54
|
+
def get_default_kit(self) -> str:
|
55
|
+
"""Get default kit name"""
|
56
|
+
return self.manifest['options']['default_kit']
|
57
|
+
|
58
|
+
def get_kit_files(self, kit_name: str, agent: Optional[str] = None) -> List[Dict]:
|
59
|
+
"""
|
60
|
+
Get list of files for a kit.
|
61
|
+
|
62
|
+
Args:
|
63
|
+
kit_name: Name of kit
|
64
|
+
agent: Optional agent filter ('claude', 'copilot', None for all)
|
65
|
+
|
66
|
+
Returns:
|
67
|
+
List of file dicts with 'path', 'source', 'required' keys
|
68
|
+
"""
|
69
|
+
kit = self.get_kit(kit_name)
|
70
|
+
if not kit:
|
71
|
+
return []
|
72
|
+
|
73
|
+
files = []
|
74
|
+
file_groups = kit.get('files', {})
|
75
|
+
|
76
|
+
# Map agent names to file groups
|
77
|
+
agent_groups = {
|
78
|
+
'claude': ['claude'],
|
79
|
+
'copilot': ['copilot'],
|
80
|
+
None: list(file_groups.keys()) # All groups
|
81
|
+
}
|
82
|
+
|
83
|
+
groups_to_include = agent_groups.get(agent, [])
|
84
|
+
|
85
|
+
for group_name in groups_to_include:
|
86
|
+
if group_name in file_groups:
|
87
|
+
files.extend(file_groups[group_name])
|
88
|
+
|
89
|
+
return files
|
90
|
+
|
91
|
+
def get_kit_markers(self, kit_name: str) -> List[str]:
|
92
|
+
"""
|
93
|
+
Get marker files for kit detection.
|
94
|
+
|
95
|
+
Args:
|
96
|
+
kit_name: Name of kit
|
97
|
+
|
98
|
+
Returns:
|
99
|
+
List of marker file paths
|
100
|
+
"""
|
101
|
+
kit = self.get_kit(kit_name)
|
102
|
+
return kit.get('markers', []) if kit else []
|
103
|
+
|
104
|
+
def get_kit_commands(self, kit_name: str) -> List[Dict]:
|
105
|
+
"""
|
106
|
+
Get list of commands for a kit.
|
107
|
+
|
108
|
+
Args:
|
109
|
+
kit_name: Name of kit
|
110
|
+
|
111
|
+
Returns:
|
112
|
+
List of command dicts with 'name', 'description', 'status' keys
|
113
|
+
"""
|
114
|
+
kit = self.get_kit(kit_name)
|
115
|
+
return kit.get('commands', []) if kit else []
|
116
|
+
|
117
|
+
def get_agent_config(self, agent: str) -> Optional[Dict]:
|
118
|
+
"""
|
119
|
+
Get agent configuration.
|
120
|
+
|
121
|
+
Args:
|
122
|
+
agent: Agent name ('claude', 'copilot')
|
123
|
+
|
124
|
+
Returns:
|
125
|
+
Agent config dict or None
|
126
|
+
"""
|
127
|
+
return self.manifest.get('agents', {}).get(agent)
|
128
|
+
|
129
|
+
def validate_kit_name(self, kit_name: str) -> bool:
|
130
|
+
"""Check if kit name is valid"""
|
131
|
+
return kit_name in self.get_kit_names()
|
132
|
+
|
133
|
+
def get_kit_description(self, kit_name: str) -> str:
|
134
|
+
"""Get kit description"""
|
135
|
+
kit = self.get_kit(kit_name)
|
136
|
+
return kit.get('description', '') if kit else ''
|
137
|
+
|
138
|
+
def get_kit_icon(self, kit_name: str) -> str:
|
139
|
+
"""Get kit icon emoji"""
|
140
|
+
kit = self.get_kit(kit_name)
|
141
|
+
return kit.get('icon', '📦') if kit else '📦'
|
142
|
+
|
143
|
+
def is_recommended(self, kit_name: str) -> bool:
|
144
|
+
"""Check if kit is recommended"""
|
145
|
+
kit = self.get_kit(kit_name)
|
146
|
+
return kit.get('recommended', False) if kit else False
|
@@ -0,0 +1,183 @@
|
|
1
|
+
"""
|
2
|
+
Kit validation and integrity checking.
|
3
|
+
|
4
|
+
Validates installed kits, checks for missing/corrupted files.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from pathlib import Path
|
8
|
+
from typing import Dict
|
9
|
+
|
10
|
+
from .manifest import KitManifest
|
11
|
+
from .detector import Detector
|
12
|
+
|
13
|
+
|
14
|
+
class Validator:
|
15
|
+
"""Validates kit installations."""
|
16
|
+
|
17
|
+
def __init__(self, target_dir: Path, manifest: KitManifest):
|
18
|
+
"""
|
19
|
+
Initialize validator.
|
20
|
+
|
21
|
+
Args:
|
22
|
+
target_dir: Target project directory
|
23
|
+
manifest: Loaded kit manifest
|
24
|
+
"""
|
25
|
+
self.target_dir = target_dir
|
26
|
+
self.manifest = manifest
|
27
|
+
self.detector = Detector(target_dir, manifest)
|
28
|
+
|
29
|
+
def validate_all(self) -> Dict:
|
30
|
+
"""
|
31
|
+
Validate all kits.
|
32
|
+
|
33
|
+
Returns:
|
34
|
+
Validation results for all kits
|
35
|
+
"""
|
36
|
+
checks = {}
|
37
|
+
options = self.manifest.manifest.get('options', {})
|
38
|
+
|
39
|
+
for kit_name in self.manifest.get_kit_names():
|
40
|
+
checks[kit_name] = self.validate_kit(kit_name, options)
|
41
|
+
|
42
|
+
# Overall validation passes if at least one kit is fully installed
|
43
|
+
any_installed = any(
|
44
|
+
check['status'] == 'installed'
|
45
|
+
for check in checks.values()
|
46
|
+
)
|
47
|
+
|
48
|
+
return {
|
49
|
+
"valid": any_installed,
|
50
|
+
"checks": checks,
|
51
|
+
"target_dir": self.target_dir,
|
52
|
+
}
|
53
|
+
|
54
|
+
def validate_kit(self, kit_name: str, options: Dict) -> Dict:
|
55
|
+
"""
|
56
|
+
Validate a single kit.
|
57
|
+
|
58
|
+
Args:
|
59
|
+
kit_name: Name of kit to validate
|
60
|
+
options: Options from manifest
|
61
|
+
|
62
|
+
Returns:
|
63
|
+
Validation result for this kit
|
64
|
+
"""
|
65
|
+
kit_info = self.manifest.get_kit(kit_name)
|
66
|
+
markers = self.manifest.get_kit_markers(kit_name)
|
67
|
+
|
68
|
+
# Check if kit is installed
|
69
|
+
kit_installed = any(
|
70
|
+
(self.target_dir / marker).exists()
|
71
|
+
for marker in markers
|
72
|
+
)
|
73
|
+
|
74
|
+
if not kit_installed:
|
75
|
+
return {
|
76
|
+
"passed": True,
|
77
|
+
"status": "not_installed",
|
78
|
+
"message": f"{kit_info['name']}: not installed",
|
79
|
+
}
|
80
|
+
|
81
|
+
# Detect which agents are actually present in the project
|
82
|
+
detected_agents = self.detector.detect_agents()
|
83
|
+
detected_shells = self.detector.detect_shells()
|
84
|
+
|
85
|
+
# Kit is installed, validate only files for detected agents/shells that actually have kit files
|
86
|
+
files_to_validate = []
|
87
|
+
|
88
|
+
# Add agent-specific files (commands/prompts) - only if at least one kit file exists for that agent
|
89
|
+
for agent in detected_agents:
|
90
|
+
agent_files = self.manifest.get_kit_files(kit_name, agent=agent)
|
91
|
+
# Check if any of this kit's files exist for this agent
|
92
|
+
has_kit_files = any(
|
93
|
+
(self.target_dir / f['path']).exists()
|
94
|
+
for f in agent_files
|
95
|
+
if f.get('status') != 'planned'
|
96
|
+
)
|
97
|
+
if has_kit_files:
|
98
|
+
files_to_validate.extend(agent_files)
|
99
|
+
|
100
|
+
# Add shell-specific files (scripts) - only if at least one kit file exists for that shell
|
101
|
+
for shell in detected_shells:
|
102
|
+
shell_files = self.manifest.get_kit_files(kit_name, agent=shell)
|
103
|
+
has_kit_files = any(
|
104
|
+
(self.target_dir / f['path']).exists()
|
105
|
+
for f in shell_files
|
106
|
+
if f.get('status') != 'planned'
|
107
|
+
)
|
108
|
+
if has_kit_files:
|
109
|
+
files_to_validate.extend(shell_files)
|
110
|
+
|
111
|
+
# Add agent/shell-agnostic files (memory, templates, etc.)
|
112
|
+
all_files = self.manifest.get_kit_files(kit_name, agent=None)
|
113
|
+
for file_info in all_files:
|
114
|
+
# Only add files that aren't agent/shell-specific
|
115
|
+
if file_info.get('type') not in ['command', 'prompt', 'script']:
|
116
|
+
files_to_validate.append(file_info)
|
117
|
+
|
118
|
+
missing = []
|
119
|
+
corrupted = []
|
120
|
+
outdated = []
|
121
|
+
|
122
|
+
for file_info in files_to_validate:
|
123
|
+
# Skip non-required files
|
124
|
+
if not file_info.get('required', True):
|
125
|
+
continue
|
126
|
+
|
127
|
+
# Skip planned files
|
128
|
+
if file_info.get('status') == 'planned':
|
129
|
+
continue
|
130
|
+
|
131
|
+
target_path = self.target_dir / file_info['path']
|
132
|
+
|
133
|
+
# Check exists
|
134
|
+
if not target_path.exists():
|
135
|
+
missing.append(file_info['path'])
|
136
|
+
continue
|
137
|
+
|
138
|
+
# Check integrity
|
139
|
+
if options.get('check_file_integrity', True):
|
140
|
+
min_size = options.get('min_file_size', 100)
|
141
|
+
if target_path.stat().st_size < min_size:
|
142
|
+
corrupted.append(file_info['path'])
|
143
|
+
|
144
|
+
# Check if outdated (differs from source)
|
145
|
+
# (Placeholder for now, can add diff later)
|
146
|
+
|
147
|
+
# Build result
|
148
|
+
if missing or corrupted:
|
149
|
+
issues = []
|
150
|
+
if missing:
|
151
|
+
issues.append(f"{len(missing)} missing")
|
152
|
+
if corrupted:
|
153
|
+
issues.append(f"{len(corrupted)} corrupted")
|
154
|
+
|
155
|
+
return {
|
156
|
+
"passed": False,
|
157
|
+
"status": "partial",
|
158
|
+
"message": f"{kit_info['name']}: {', '.join(issues)}",
|
159
|
+
"missing_files": missing,
|
160
|
+
"corrupted_files": corrupted,
|
161
|
+
}
|
162
|
+
|
163
|
+
return {
|
164
|
+
"passed": True,
|
165
|
+
"status": "installed",
|
166
|
+
"message": f"{kit_info['name']}: all files present",
|
167
|
+
}
|
168
|
+
|
169
|
+
def is_kit_installed(self, kit_name: str) -> bool:
|
170
|
+
"""
|
171
|
+
Quick check if kit is installed.
|
172
|
+
|
173
|
+
Args:
|
174
|
+
kit_name: Name of kit
|
175
|
+
|
176
|
+
Returns:
|
177
|
+
True if any marker exists
|
178
|
+
"""
|
179
|
+
markers = self.manifest.get_kit_markers(kit_name)
|
180
|
+
return any(
|
181
|
+
(self.target_dir / marker).exists()
|
182
|
+
for marker in markers
|
183
|
+
)
|
lite_kits/kits/README.md
CHANGED
@@ -6,7 +6,7 @@ This directory contains modular add-on kits that can be installed independently
|
|
6
6
|
|
7
7
|
### ✅ Recommended (Default Installation)
|
8
8
|
|
9
|
-
#### 1. **
|
9
|
+
#### 1. **dev-kit**
|
10
10
|
**Commands**: `/orient` ⭐, `/audit`, `/stats`
|
11
11
|
**Scripts**: Enhanced feature creation with custom naming
|
12
12
|
|
@@ -21,7 +21,7 @@ Essential project-level utilities combining agent orientation, quality checks, a
|
|
21
21
|
|
22
22
|
---
|
23
23
|
|
24
|
-
#### 2. **
|
24
|
+
#### 2. **dev-kit**
|
25
25
|
**Commands**: `/commit`, `/pr`, `/review`, `/sync`, `/cleanup`
|
26
26
|
|
27
27
|
Git workflow automation with smart commits, PR creation, code review, sync status, and cleanup operations. Includes ASCII visualization for better readability.
|
@@ -48,7 +48,7 @@ Multi-agent coordination structure for complex projects with multiple AI agents
|
|
48
48
|
- `.specify/memory/git-worktrees-protocol.md`
|
49
49
|
- `specs/*/collaboration/` (template, created per-feature)
|
50
50
|
|
51
|
-
**Use case**: Large projects with multiple AI agents collaborating (e.g., Claude Code + Copilot). Works best when combined with
|
51
|
+
**Use case**: Large projects with multiple AI agents collaborating (e.g., Claude Code + Copilot). Works best when combined with dev-kit and dev-kit.
|
52
52
|
|
53
53
|
---
|
54
54
|
|
@@ -139,7 +139,7 @@ lite-kits remove -Kit git,project
|
|
139
139
|
|
140
140
|
## Kit Details
|
141
141
|
|
142
|
-
###
|
142
|
+
### dev-kit Commands
|
143
143
|
|
144
144
|
| Command | Description |
|
145
145
|
|---------|-------------|
|
@@ -147,7 +147,7 @@ lite-kits remove -Kit git,project
|
|
147
147
|
| `/audit` | Security and quality audit |
|
148
148
|
| `/stats` | Project statistics (LOC, test coverage, complexity) |
|
149
149
|
|
150
|
-
###
|
150
|
+
### dev-kit Commands
|
151
151
|
|
152
152
|
| Command | Description |
|
153
153
|
|---------|-------------|
|
@@ -156,7 +156,7 @@ lite-kits remove -Kit git,project
|
|
156
156
|
| `/review` | Code review of staged changes against best practices |
|
157
157
|
| `/cleanup` | Clean merged branches, stale worktrees |
|
158
158
|
|
159
|
-
###
|
159
|
+
### dev-kit Enhancements
|
160
160
|
|
161
161
|
| Enhancement | Description |
|
162
162
|
|-------------|-------------|
|