lite-kits 0.1.1__py3-none-any.whl → 0.3.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 (63) hide show
  1. lite_kits/__init__.py +56 -4
  2. lite_kits/cli.py +696 -185
  3. lite_kits/core/__init__.py +6 -0
  4. lite_kits/core/banner.py +1 -1
  5. lite_kits/core/conflict_checker.py +115 -0
  6. lite_kits/core/detector.py +140 -0
  7. lite_kits/core/installer.py +236 -351
  8. lite_kits/core/manifest.py +146 -146
  9. lite_kits/core/validator.py +146 -0
  10. lite_kits/kits/README.md +6 -6
  11. lite_kits/kits/dev/README.md +241 -241
  12. lite_kits/kits/dev/{claude/commands → commands/.claude}/audit.md +143 -143
  13. lite_kits/kits/dev/{claude/commands → commands/.claude}/cleanup.md +2 -2
  14. lite_kits/kits/{git/claude/commands → dev/commands/.claude}/commit.md +2 -2
  15. lite_kits/kits/{project/claude/commands → dev/commands/.claude}/orient.md +3 -4
  16. lite_kits/kits/{git/claude/commands → dev/commands/.claude}/pr.md +1 -1
  17. lite_kits/kits/{git/claude/commands → dev/commands/.claude}/review.md +202 -202
  18. lite_kits/kits/{project/claude/commands → dev/commands/.claude}/stats.md +162 -162
  19. lite_kits/kits/{project/github/prompts → dev/commands/.github}/audit.prompt.md +143 -143
  20. lite_kits/kits/{git/github/prompts → dev/commands/.github}/cleanup.prompt.md +2 -2
  21. lite_kits/kits/{git/github/prompts → dev/commands/.github}/commit.prompt.md +2 -2
  22. lite_kits/kits/dev/{github/prompts → commands/.github}/orient.prompt.md +3 -4
  23. lite_kits/kits/{git/github/prompts → dev/commands/.github}/pr.prompt.md +1 -1
  24. lite_kits/kits/{git/github/prompts → dev/commands/.github}/review.prompt.md +202 -202
  25. lite_kits/kits/dev/{github/prompts → commands/.github}/stats.prompt.md +163 -163
  26. lite_kits/kits/kits.yaml +497 -180
  27. lite_kits/kits/multiagent/README.md +6 -6
  28. lite_kits/kits/multiagent/{claude/commands → commands/.claude}/sync.md +331 -331
  29. lite_kits/kits/multiagent/{github/prompts → commands/.github}/sync.prompt.md +73 -69
  30. lite_kits/kits/multiagent/memory/git-worktrees-protocol.md +370 -370
  31. lite_kits/kits/multiagent/memory/parallel-work-protocol.md +536 -536
  32. lite_kits/kits/multiagent/memory/pr-workflow-guide.md +275 -275
  33. lite_kits/kits/multiagent/templates/collaboration-structure/README.md +166 -166
  34. lite_kits/kits/multiagent/templates/decision.md +79 -79
  35. lite_kits/kits/multiagent/templates/handoff.md +95 -95
  36. lite_kits/kits/multiagent/templates/session-log.md +68 -68
  37. lite_kits-0.3.1.dist-info/METADATA +259 -0
  38. lite_kits-0.3.1.dist-info/RECORD +41 -0
  39. {lite_kits-0.1.1.dist-info → lite_kits-0.3.1.dist-info}/licenses/LICENSE +21 -21
  40. lite_kits/kits/dev/claude/commands/commit.md +0 -612
  41. lite_kits/kits/dev/claude/commands/orient.md +0 -146
  42. lite_kits/kits/dev/claude/commands/pr.md +0 -593
  43. lite_kits/kits/dev/claude/commands/review.md +0 -202
  44. lite_kits/kits/dev/claude/commands/stats.md +0 -162
  45. lite_kits/kits/dev/github/prompts/audit.prompt.md +0 -143
  46. lite_kits/kits/dev/github/prompts/cleanup.prompt.md +0 -382
  47. lite_kits/kits/dev/github/prompts/commit.prompt.md +0 -591
  48. lite_kits/kits/dev/github/prompts/pr.prompt.md +0 -603
  49. lite_kits/kits/dev/github/prompts/review.prompt.md +0 -202
  50. lite_kits/kits/git/README.md +0 -365
  51. lite_kits/kits/git/claude/commands/cleanup.md +0 -361
  52. lite_kits/kits/git/scripts/bash/get-git-context.sh +0 -208
  53. lite_kits/kits/git/scripts/powershell/Get-GitContext.ps1 +0 -242
  54. lite_kits/kits/project/README.md +0 -228
  55. lite_kits/kits/project/claude/commands/audit.md +0 -143
  56. lite_kits/kits/project/claude/commands/review.md +0 -112
  57. lite_kits/kits/project/github/prompts/orient.prompt.md +0 -150
  58. lite_kits/kits/project/github/prompts/review.prompt.md +0 -112
  59. lite_kits/kits/project/github/prompts/stats.prompt.md +0 -163
  60. lite_kits-0.1.1.dist-info/METADATA +0 -447
  61. lite_kits-0.1.1.dist-info/RECORD +0 -58
  62. {lite_kits-0.1.1.dist-info → lite_kits-0.3.1.dist-info}/WHEEL +0 -0
  63. {lite_kits-0.1.1.dist-info → lite_kits-0.3.1.dist-info}/entry_points.txt +0 -0
@@ -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,146 @@
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
+
12
+
13
+ class Validator:
14
+ """Validates kit installations."""
15
+
16
+ def __init__(self, target_dir: Path, manifest: KitManifest):
17
+ """
18
+ Initialize validator.
19
+
20
+ Args:
21
+ target_dir: Target project directory
22
+ manifest: Loaded kit manifest
23
+ """
24
+ self.target_dir = target_dir
25
+ self.manifest = manifest
26
+
27
+ def validate_all(self) -> Dict:
28
+ """
29
+ Validate all kits.
30
+
31
+ Returns:
32
+ Validation results for all kits
33
+ """
34
+ checks = {}
35
+ options = self.manifest.manifest.get('options', {})
36
+
37
+ for kit_name in self.manifest.get_kit_names():
38
+ checks[kit_name] = self.validate_kit(kit_name, options)
39
+
40
+ # Overall validation passes if at least one kit is fully installed
41
+ any_installed = any(
42
+ check['status'] == 'installed'
43
+ for check in checks.values()
44
+ )
45
+
46
+ return {
47
+ "valid": any_installed,
48
+ "checks": checks,
49
+ }
50
+
51
+ def validate_kit(self, kit_name: str, options: Dict) -> Dict:
52
+ """
53
+ Validate a single kit.
54
+
55
+ Args:
56
+ kit_name: Name of kit to validate
57
+ options: Options from manifest
58
+
59
+ Returns:
60
+ Validation result for this kit
61
+ """
62
+ kit_info = self.manifest.get_kit(kit_name)
63
+ markers = self.manifest.get_kit_markers(kit_name)
64
+
65
+ # Check if kit is installed
66
+ kit_installed = any(
67
+ (self.target_dir / marker).exists()
68
+ for marker in markers
69
+ )
70
+
71
+ if not kit_installed:
72
+ return {
73
+ "passed": True,
74
+ "status": "not_installed",
75
+ "message": f"{kit_info['name']}: not installed",
76
+ }
77
+
78
+ # Kit is installed, validate files
79
+ all_files = self.manifest.get_kit_files(kit_name, agent=None)
80
+
81
+ missing = []
82
+ corrupted = []
83
+ outdated = []
84
+
85
+ for file_info in all_files:
86
+ # Skip non-required files
87
+ if not file_info.get('required', True):
88
+ continue
89
+
90
+ # Skip planned files
91
+ if file_info.get('status') == 'planned':
92
+ continue
93
+
94
+ target_path = self.target_dir / file_info['path']
95
+
96
+ # Check exists
97
+ if not target_path.exists():
98
+ missing.append(file_info['path'])
99
+ continue
100
+
101
+ # Check integrity
102
+ if options.get('check_file_integrity', True):
103
+ min_size = options.get('min_file_size', 100)
104
+ if target_path.stat().st_size < min_size:
105
+ corrupted.append(file_info['path'])
106
+
107
+ # Check if outdated (differs from source)
108
+ # (Placeholder for now, can add diff later)
109
+
110
+ # Build result
111
+ if missing or corrupted:
112
+ issues = []
113
+ if missing:
114
+ issues.append(f"{len(missing)} missing")
115
+ if corrupted:
116
+ issues.append(f"{len(corrupted)} corrupted")
117
+
118
+ return {
119
+ "passed": False,
120
+ "status": "partial",
121
+ "message": f"{kit_info['name']}: {', '.join(issues)}",
122
+ "missing_files": missing,
123
+ "corrupted_files": corrupted,
124
+ }
125
+
126
+ return {
127
+ "passed": True,
128
+ "status": "installed",
129
+ "message": f"{kit_info['name']}: all files present",
130
+ }
131
+
132
+ def is_kit_installed(self, kit_name: str) -> bool:
133
+ """
134
+ Quick check if kit is installed.
135
+
136
+ Args:
137
+ kit_name: Name of kit
138
+
139
+ Returns:
140
+ True if any marker exists
141
+ """
142
+ markers = self.manifest.get_kit_markers(kit_name)
143
+ return any(
144
+ (self.target_dir / marker).exists()
145
+ for marker in markers
146
+ )
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. **project-kit**
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. **git-kit**
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 project-kit and git-kit.
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
- ### project-kit Commands
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
- ### git-kit Commands
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
- ### project-kit Enhancements
159
+ ### dev-kit Enhancements
160
160
 
161
161
  | Enhancement | Description |
162
162
  |-------------|-------------|