specpulse 1.4.0__py3-none-any.whl → 1.4.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.
- specpulse/__init__.py +1 -1
- specpulse/cli/main.py +30 -8
- specpulse/core/specpulse.py +328 -3
- specpulse/core/validator.py +115 -5
- specpulse/resources/commands/gemini/sp-pulse.toml +80 -23
- specpulse/resources/commands/gemini/sp-spec.toml +90 -45
- specpulse/resources/scripts/sp-pulse-decompose.ps1 +74 -0
- specpulse/resources/scripts/sp-pulse-execute.ps1 +177 -0
- specpulse/resources/scripts/sp-pulse-init.ps1 +36 -11
- specpulse/resources/scripts/sp-pulse-init.sh +29 -8
- specpulse/resources/scripts/sp-pulse-plan.sh +42 -17
- specpulse/resources/scripts/sp-pulse-spec.sh +49 -25
- specpulse/resources/scripts/sp-pulse-task.sh +49 -17
- specpulse/resources/templates/decomposition/api-contract.yaml +344 -12
- specpulse/resources/templates/decomposition/integration-plan.md +249 -97
- specpulse/resources/templates/decomposition/interface.ts +244 -13
- specpulse/resources/templates/decomposition/microservice.md +151 -0
- specpulse/resources/templates/decomposition/service-plan.md +187 -155
- specpulse/resources/templates/plan.md +134 -225
- specpulse/resources/templates/spec.md +94 -125
- specpulse/resources/templates/task.md +216 -161
- specpulse/utils/console.py +54 -6
- specpulse/utils/git_utils.py +47 -4
- specpulse/utils/version_check.py +15 -2
- {specpulse-1.4.0.dist-info → specpulse-1.4.2.dist-info}/METADATA +36 -17
- {specpulse-1.4.0.dist-info → specpulse-1.4.2.dist-info}/RECORD +30 -28
- specpulse/resources/templates/decomposition/microservices.md +0 -35
- {specpulse-1.4.0.dist-info → specpulse-1.4.2.dist-info}/WHEEL +0 -0
- {specpulse-1.4.0.dist-info → specpulse-1.4.2.dist-info}/entry_points.txt +0 -0
- {specpulse-1.4.0.dist-info → specpulse-1.4.2.dist-info}/licenses/LICENSE +0 -0
- {specpulse-1.4.0.dist-info → specpulse-1.4.2.dist-info}/top_level.txt +0 -0
@@ -1,165 +1,220 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
- **
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
- **Dependencies**: {{ task.dependencies | join(", ") }}
|
37
|
-
- **Type**: {{ task.type }}
|
38
|
-
- **Priority**: {{ task.priority }}
|
39
|
-
- **Estimate**: {{ task.estimate }}
|
40
|
-
- **Description**: {{ task.description }}
|
41
|
-
- **Acceptance**: {{ task.acceptance }}
|
42
|
-
{% endfor %}
|
43
|
-
|
44
|
-
### Critical Path
|
45
|
-
*Tasks that directly impact timeline*
|
46
|
-
|
47
|
-
{% for path in critical_path %}
|
48
|
-
{{ loop.index }}. {{ path.tasks | join(" -> ") }}
|
49
|
-
{% endfor %}
|
50
|
-
- Estimated critical path duration: {{ critical_path_duration }}
|
51
|
-
|
52
|
-
## SDD Gates Compliance
|
53
|
-
|
54
|
-
### Pre-Implementation Validation
|
55
|
-
{% for gate in SDD_gates %}
|
56
|
-
#### {{ gate.name }}
|
57
|
-
- [ ] {{ gate.check_1 }}
|
58
|
-
- [ ] {{ gate.check_2 }}
|
59
|
-
- [ ] {{ gate.check_3 }}
|
60
|
-
- [ ] {{ gate.check_4 }}
|
61
|
-
**Status**: {{ gate.status | default("PENDING") }}
|
62
|
-
{% endfor %}
|
63
|
-
|
64
|
-
## Task Details by Category
|
65
|
-
|
66
|
-
{% for category in task_categories %}
|
67
|
-
### {{ category.name }} Tasks {% if category.parallel %}[P]{% endif %}
|
68
|
-
{% for task in category.tasks %}
|
69
|
-
- [ ] {{ task.id }}: {{ task.name }}
|
70
|
-
{% endfor %}
|
71
|
-
{% endfor %}
|
72
|
-
|
73
|
-
## Execution Schedule
|
74
|
-
|
75
|
-
{% for phase in execution_schedule %}
|
76
|
-
### {{ phase.name }}
|
77
|
-
{% for time_block in phase.time_blocks %}
|
78
|
-
- {{ time_block.timing }}: {{ time_block.tasks | join(", ") }}{% if time_block.parallel %} (parallel){% endif %}
|
79
|
-
{% endfor %}
|
80
|
-
{% endfor %}
|
1
|
+
# Task Breakdown: {{feature_name}}
|
2
|
+
|
3
|
+
## Feature Overview
|
4
|
+
- **Feature ID**: {{feature_id}}
|
5
|
+
- **Specification**: SPEC-{{spec_id}}
|
6
|
+
- **Plan**: PLAN-{{plan_id}}
|
7
|
+
- **Created**: {{date}}
|
8
|
+
|
9
|
+
## Task Summary
|
10
|
+
Total Tasks: {{total_tasks}}
|
11
|
+
Estimated Effort: {{estimated_effort}}
|
12
|
+
Priority: {{priority}}
|
13
|
+
|
14
|
+
## Task Status Legend
|
15
|
+
- [ ] Pending
|
16
|
+
- [>] In Progress
|
17
|
+
- [x] Completed
|
18
|
+
- [!] Blocked
|
19
|
+
|
20
|
+
## Phase 0: Foundation Tasks
|
21
|
+
|
22
|
+
### T001: Project Setup
|
23
|
+
**Complexity**: Simple
|
24
|
+
**Estimate**: 1 hour
|
25
|
+
**Status**: [ ] Pending
|
26
|
+
|
27
|
+
**Description**: Initialize project structure and configuration
|
28
|
+
**Acceptance Criteria**:
|
29
|
+
- [ ] Project scaffolding created
|
30
|
+
- [ ] Configuration files in place
|
31
|
+
- [ ] Build system configured
|
32
|
+
|
33
|
+
**Technical Notes**:
|
34
|
+
- Use standard project template
|
35
|
+
- Ensure all paths are relative
|
81
36
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
37
|
+
---
|
38
|
+
|
39
|
+
### T002: Development Environment
|
40
|
+
**Complexity**: Simple
|
41
|
+
**Estimate**: 2 hours
|
42
|
+
**Status**: [ ] Pending
|
43
|
+
|
44
|
+
**Description**: Set up development environment and dependencies
|
45
|
+
**Acceptance Criteria**:
|
46
|
+
- [ ] All dependencies installed
|
47
|
+
- [ ] Environment variables configured
|
48
|
+
- [ ] Development server runs successfully
|
49
|
+
|
50
|
+
**Technical Notes**:
|
51
|
+
- Document any special setup requirements
|
52
|
+
- Create setup script if needed
|
53
|
+
|
54
|
+
---
|
55
|
+
|
56
|
+
## Phase 1: Core Implementation Tasks
|
57
|
+
|
58
|
+
### T003: Data Models
|
59
|
+
**Complexity**: Medium
|
60
|
+
**Estimate**: 4 hours
|
61
|
+
**Status**: [ ] Pending
|
62
|
+
|
63
|
+
**Description**: Create data models and database schema
|
64
|
+
**Acceptance Criteria**:
|
65
|
+
- [ ] Models defined with proper types
|
66
|
+
- [ ] Relationships established
|
67
|
+
- [ ] Migrations created and tested
|
68
|
+
|
69
|
+
**Technical Notes**:
|
70
|
+
- Follow existing naming conventions
|
71
|
+
- Add appropriate indexes
|
72
|
+
|
73
|
+
---
|
74
|
+
|
75
|
+
### T004: Business Logic
|
76
|
+
**Complexity**: Complex
|
77
|
+
**Estimate**: 8 hours
|
78
|
+
**Status**: [ ] Pending
|
79
|
+
|
80
|
+
**Description**: Implement core business logic
|
81
|
+
**Acceptance Criteria**:
|
82
|
+
- [ ] All business rules implemented
|
83
|
+
- [ ] Edge cases handled
|
84
|
+
- [ ] Unit tests written and passing
|
85
|
+
|
86
|
+
**Technical Notes**:
|
87
|
+
- Ensure proper error handling
|
88
|
+
- Follow SOLID principles
|
89
|
+
|
90
|
+
---
|
91
|
+
|
92
|
+
### T005: API Endpoints
|
93
|
+
**Complexity**: Medium
|
94
|
+
**Estimate**: 6 hours
|
95
|
+
**Status**: [ ] Pending
|
96
|
+
|
97
|
+
**Description**: Create API endpoints for feature
|
98
|
+
**Acceptance Criteria**:
|
99
|
+
- [ ] All endpoints implemented
|
100
|
+
- [ ] Request/response validation
|
101
|
+
- [ ] API documentation updated
|
102
|
+
|
103
|
+
**Technical Notes**:
|
104
|
+
- Follow RESTful conventions
|
105
|
+
- Implement proper status codes
|
106
|
+
|
107
|
+
---
|
108
|
+
|
109
|
+
## Phase 2: Enhancement Tasks
|
110
|
+
|
111
|
+
### T006: Error Handling
|
112
|
+
**Complexity**: Medium
|
113
|
+
**Estimate**: 3 hours
|
114
|
+
**Status**: [ ] Pending
|
115
|
+
|
116
|
+
**Description**: Implement comprehensive error handling
|
117
|
+
**Acceptance Criteria**:
|
118
|
+
- [ ] All errors caught and logged
|
119
|
+
- [ ] User-friendly error messages
|
120
|
+
- [ ] Error recovery mechanisms
|
109
121
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
All task execution should be handled by AI assistants (Claude or Gemini) following the SpecPulse methodology:
|
114
|
-
|
115
|
-
1. **Task Selection**: AI assistants should select tasks based on:
|
116
|
-
- Dependency order (sequential tasks first)
|
117
|
-
- Parallel execution opportunities
|
118
|
-
- Current context and feature priorities
|
119
|
-
- Resource availability
|
120
|
-
|
121
|
-
2. **Implementation Process**: For each task:
|
122
|
-
```markdown
|
123
|
-
## Task: {{ task.id }} - {{ task.name }}
|
124
|
-
|
125
|
-
**Status**: [ ] Pending / [x] Completed / [-] In Progress / [!] Blocked
|
126
|
-
**Dependencies**: {{ task.dependencies | join(", ") | default("None") }}
|
127
|
-
**Acceptance**: {{ task.acceptance }}
|
128
|
-
```
|
129
|
-
|
130
|
-
3. **Parallel Execution Strategy**: When tasks can be executed in parallel:
|
131
|
-
- AI assistants should work on multiple tasks simultaneously
|
132
|
-
- Coordinate task completion status
|
133
|
-
- Handle cross-task dependencies
|
134
|
-
- Maintain code consistency
|
135
|
-
|
136
|
-
### Task Dependencies Management
|
137
|
-
|
138
|
-
- **Sequential Dependencies**: Tasks must be completed in specific order
|
139
|
-
- **Parallel Opportunities**: Independent tasks can be worked on simultaneously
|
140
|
-
- **Dependency Resolution**: AI should resolve conflicts and blocking issues
|
141
|
-
- **Progress Coordination**: Multiple AI assistants should coordinate task completion
|
142
|
-
|
143
|
-
## AI Integration Notes
|
144
|
-
|
145
|
-
### SDD Gates
|
146
|
-
- All tasks MUST pass SDD compliance before implementation
|
147
|
-
- Use `/sp-validate` command to check compliance status
|
148
|
-
- Mark gates as completed only after actual validation
|
149
|
-
|
150
|
-
### Progress Tracking
|
151
|
-
- Update task status in real-time using markdown checkboxes: `[ ]` → `[-]` → `[x]`
|
152
|
-
- Document blockers immediately with `[!]` status and resolution notes
|
153
|
-
- Use velocity metrics to refine future estimates
|
154
|
-
- Coordinate with other AI assistants for parallel task execution
|
155
|
-
|
156
|
-
### Quality Assurance
|
157
|
-
- Each task requires specific acceptance criteria
|
158
|
-
- Testing strategy based on Principle 6: Quality Assurance
|
159
|
-
- Appropriate tests for your project type
|
122
|
+
**Technical Notes**:
|
123
|
+
- Use centralized error handling
|
124
|
+
- Log errors with context
|
160
125
|
|
161
126
|
---
|
162
|
-
|
163
|
-
|
164
|
-
**
|
165
|
-
**
|
127
|
+
|
128
|
+
### T007: Performance Optimization
|
129
|
+
**Complexity**: Medium
|
130
|
+
**Estimate**: 4 hours
|
131
|
+
**Status**: [ ] Pending
|
132
|
+
|
133
|
+
**Description**: Optimize performance bottlenecks
|
134
|
+
**Acceptance Criteria**:
|
135
|
+
- [ ] Database queries optimized
|
136
|
+
- [ ] Caching implemented where needed
|
137
|
+
- [ ] Load testing completed
|
138
|
+
|
139
|
+
**Technical Notes**:
|
140
|
+
- Profile before optimizing
|
141
|
+
- Document optimization decisions
|
142
|
+
|
143
|
+
---
|
144
|
+
|
145
|
+
## Phase 3: Testing & Documentation
|
146
|
+
|
147
|
+
### T008: Integration Testing
|
148
|
+
**Complexity**: Medium
|
149
|
+
**Estimate**: 4 hours
|
150
|
+
**Status**: [ ] Pending
|
151
|
+
|
152
|
+
**Description**: Write and run integration tests
|
153
|
+
**Acceptance Criteria**:
|
154
|
+
- [ ] All happy paths tested
|
155
|
+
- [ ] Error scenarios tested
|
156
|
+
- [ ] Tests automated in CI/CD
|
157
|
+
|
158
|
+
**Technical Notes**:
|
159
|
+
- Use existing test framework
|
160
|
+
- Mock external dependencies
|
161
|
+
|
162
|
+
---
|
163
|
+
|
164
|
+
### T009: Documentation
|
165
|
+
**Complexity**: Simple
|
166
|
+
**Estimate**: 2 hours
|
167
|
+
**Status**: [ ] Pending
|
168
|
+
|
169
|
+
**Description**: Complete feature documentation
|
170
|
+
**Acceptance Criteria**:
|
171
|
+
- [ ] API documentation complete
|
172
|
+
- [ ] User guide written
|
173
|
+
- [ ] Code comments added
|
174
|
+
|
175
|
+
**Technical Notes**:
|
176
|
+
- Follow documentation standards
|
177
|
+
- Include examples
|
178
|
+
|
179
|
+
---
|
180
|
+
|
181
|
+
### T010: Deployment
|
182
|
+
**Complexity**: Simple
|
183
|
+
**Estimate**: 2 hours
|
184
|
+
**Status**: [ ] Pending
|
185
|
+
|
186
|
+
**Description**: Deploy feature to production
|
187
|
+
**Acceptance Criteria**:
|
188
|
+
- [ ] Deployed successfully
|
189
|
+
- [ ] Monitoring configured
|
190
|
+
- [ ] Rollback plan tested
|
191
|
+
|
192
|
+
**Technical Notes**:
|
193
|
+
- Follow deployment checklist
|
194
|
+
- Verify in staging first
|
195
|
+
|
196
|
+
---
|
197
|
+
|
198
|
+
## Dependencies
|
199
|
+
- T003 depends on T001 and T002
|
200
|
+
- T004 depends on T003
|
201
|
+
- T005 depends on T004
|
202
|
+
- T006-T007 can be done in parallel after T005
|
203
|
+
- T008 depends on all implementation tasks
|
204
|
+
- T009 can be done in parallel with testing
|
205
|
+
- T010 depends on all other tasks
|
206
|
+
|
207
|
+
## Progress Tracking
|
208
|
+
```
|
209
|
+
[##########----------] 50% Complete
|
210
|
+
Completed: 5/10
|
211
|
+
In Progress: 1/10
|
212
|
+
Pending: 4/10
|
213
|
+
Blocked: 0/10
|
214
|
+
```
|
215
|
+
|
216
|
+
## Notes
|
217
|
+
<!-- Additional task notes -->
|
218
|
+
- Review with team before starting
|
219
|
+
- Update estimates based on actual effort
|
220
|
+
- Log any blockers immediately
|
specpulse/utils/console.py
CHANGED
@@ -131,9 +131,17 @@ class Console:
|
|
131
131
|
|
132
132
|
def spinner(self, message: str):
|
133
133
|
"""Show a loading spinner"""
|
134
|
-
#
|
134
|
+
# Return a context manager for compatibility
|
135
|
+
class SpinnerContext:
|
136
|
+
def __enter__(self):
|
137
|
+
return self
|
138
|
+
def __exit__(self, *args):
|
139
|
+
pass
|
140
|
+
def update(self, message):
|
141
|
+
pass
|
142
|
+
|
135
143
|
self.console.print(f"[bold cyan]{message}...[/bold cyan]")
|
136
|
-
return
|
144
|
+
return SpinnerContext()
|
137
145
|
|
138
146
|
def animated_text(self, text: str, delay: float = 0.03):
|
139
147
|
"""Print text with typewriter effect"""
|
@@ -216,6 +224,42 @@ class Console:
|
|
216
224
|
box=box.DOUBLE
|
217
225
|
)
|
218
226
|
self.console.print(panel)
|
227
|
+
|
228
|
+
def type_effect(self, text: str, delay: float = 0.05):
|
229
|
+
"""Display text with typing effect"""
|
230
|
+
for char in text:
|
231
|
+
self.console.print(char, end="")
|
232
|
+
import time
|
233
|
+
time.sleep(delay)
|
234
|
+
self.console.print()
|
235
|
+
|
236
|
+
def interactive_menu(self, title: str, options: List[str]) -> int:
|
237
|
+
"""Display interactive menu and get user choice"""
|
238
|
+
self.header(title)
|
239
|
+
for i, option in enumerate(options, 1):
|
240
|
+
self.console.print(f"[bright_yellow]{i}.[/bright_yellow] {option}")
|
241
|
+
|
242
|
+
while True:
|
243
|
+
try:
|
244
|
+
choice = int(input("\nSelect option: "))
|
245
|
+
if 1 <= choice <= len(options):
|
246
|
+
return choice - 1
|
247
|
+
except (ValueError, KeyboardInterrupt):
|
248
|
+
pass
|
249
|
+
self.error("Invalid choice. Please try again.")
|
250
|
+
|
251
|
+
def animation_wave(self, text: str = "Processing", duration: float = 2.0):
|
252
|
+
"""Display wave animation"""
|
253
|
+
import time
|
254
|
+
frames = ["⚪⚫⚫⚫", "⚫⚪⚫⚫", "⚫⚫⚪⚫", "⚫⚫⚫⚪", "⚫⚫⚪⚫", "⚫⚪⚫⚫"]
|
255
|
+
start_time = time.time()
|
256
|
+
i = 0
|
257
|
+
|
258
|
+
with self.console.status(f"[bold green]{text}...", spinner="dots") as status:
|
259
|
+
while time.time() - start_time < duration:
|
260
|
+
status.update(f"[bold green]{text}... {frames[i % len(frames)]}")
|
261
|
+
time.sleep(0.2)
|
262
|
+
i += 1
|
219
263
|
|
220
264
|
def validation_results(self, results: Dict[str, bool]):
|
221
265
|
"""Display validation results with visual indicators"""
|
@@ -305,17 +349,21 @@ class Console:
|
|
305
349
|
def gradient_text(self, text: str, colors: List[str] = None):
|
306
350
|
"""Print text with gradient colors"""
|
307
351
|
if not colors:
|
308
|
-
colors = ["bright_red", "bright_yellow", "bright_green",
|
352
|
+
colors = ["bright_red", "bright_yellow", "bright_green",
|
309
353
|
"bright_cyan", "bright_blue", "bright_magenta"]
|
310
|
-
|
354
|
+
|
311
355
|
words = text.split()
|
312
356
|
colored_words = []
|
313
|
-
|
357
|
+
|
314
358
|
for i, word in enumerate(words):
|
315
359
|
color = colors[i % len(colors)]
|
316
360
|
colored_words.append(f"[{color}]{word}[/{color}]")
|
317
|
-
|
361
|
+
|
318
362
|
self.console.print(" ".join(colored_words))
|
363
|
+
|
364
|
+
def tree_structure(self, data: Dict[str, Any], title: str = "Project Structure"):
|
365
|
+
"""Display tree structure - alias for tree method"""
|
366
|
+
return self.tree(title, data)
|
319
367
|
|
320
368
|
def celebration(self):
|
321
369
|
"""Show celebration animation"""
|
specpulse/utils/git_utils.py
CHANGED
@@ -29,10 +29,24 @@ class GitUtils:
|
|
29
29
|
except FileNotFoundError:
|
30
30
|
return False, "Git is not installed or not in PATH"
|
31
31
|
|
32
|
-
|
32
|
+
@staticmethod
|
33
|
+
def check_git_installed() -> bool:
|
34
|
+
"""Check if git is installed (static method)"""
|
35
|
+
try:
|
36
|
+
result = subprocess.run(
|
37
|
+
["git", "--version"],
|
38
|
+
capture_output=True,
|
39
|
+
text=True,
|
40
|
+
check=True
|
41
|
+
)
|
42
|
+
return True
|
43
|
+
except (subprocess.CalledProcessError, FileNotFoundError):
|
44
|
+
return False
|
45
|
+
|
46
|
+
@staticmethod
|
47
|
+
def is_git_installed() -> bool:
|
33
48
|
"""Check if git is installed"""
|
34
|
-
|
35
|
-
return success
|
49
|
+
return GitUtils.check_git_installed()
|
36
50
|
|
37
51
|
def is_git_repo(self, path: Optional[Path] = None) -> bool:
|
38
52
|
"""Check if directory is a git repository"""
|
@@ -175,4 +189,33 @@ class GitUtils:
|
|
175
189
|
success, output = self._run_git_command("tag", "-l")
|
176
190
|
if success:
|
177
191
|
return output.split('\n') if output else []
|
178
|
-
return []
|
192
|
+
return []
|
193
|
+
|
194
|
+
# Additional methods for test compatibility
|
195
|
+
def is_repo(self) -> bool:
|
196
|
+
"""Check if current directory is a git repository"""
|
197
|
+
return (self.repo_path / ".git").exists()
|
198
|
+
|
199
|
+
def add_all_files(self) -> bool:
|
200
|
+
"""Add all files to staging area"""
|
201
|
+
return self.add_files()
|
202
|
+
|
203
|
+
def get_commits(self, limit: int = 10) -> List[str]:
|
204
|
+
"""Get recent commits"""
|
205
|
+
return self.get_log(limit)
|
206
|
+
|
207
|
+
def stash(self) -> bool:
|
208
|
+
"""Stash current changes"""
|
209
|
+
success, _ = self._run_git_command("stash")
|
210
|
+
return success
|
211
|
+
|
212
|
+
def stash_pop(self) -> bool:
|
213
|
+
"""Pop stashed changes"""
|
214
|
+
success, _ = self._run_git_command("stash", "pop")
|
215
|
+
return success
|
216
|
+
|
217
|
+
def merge(self, branch: str) -> bool:
|
218
|
+
"""Merge branch into current branch"""
|
219
|
+
success, _ = self._run_git_command("merge", branch)
|
220
|
+
return success
|
221
|
+
|
specpulse/utils/version_check.py
CHANGED
@@ -78,11 +78,24 @@ def get_update_message(current: str, latest: str, is_major: bool) -> str:
|
|
78
78
|
Returns:
|
79
79
|
Formatted update message
|
80
80
|
"""
|
81
|
+
# Determine update type
|
82
|
+
curr_parts = current.split('.')
|
83
|
+
latest_parts = latest.split('.')
|
84
|
+
|
85
|
+
update_type = "patch"
|
86
|
+
if len(curr_parts) >= 2 and len(latest_parts) >= 2:
|
87
|
+
if curr_parts[0] != latest_parts[0]:
|
88
|
+
update_type = "major"
|
89
|
+
elif curr_parts[1] != latest_parts[1]:
|
90
|
+
update_type = "minor"
|
91
|
+
else:
|
92
|
+
update_type = "patch"
|
93
|
+
|
81
94
|
if is_major:
|
82
|
-
urgency = "[!] MAJOR"
|
95
|
+
urgency = f"[!] MAJOR ({update_type} update)"
|
83
96
|
color = "bright_red"
|
84
97
|
else:
|
85
|
-
urgency = "[i]"
|
98
|
+
urgency = f"[i] {update_type.upper()}"
|
86
99
|
color = "yellow"
|
87
100
|
|
88
101
|
message = f"""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: specpulse
|
3
|
-
Version: 1.4.
|
3
|
+
Version: 1.4.2
|
4
4
|
Summary: Specification-Driven Development Framework
|
5
5
|
Home-page: https://github.com/specpulse
|
6
6
|
Author: SpecPulse
|
@@ -67,13 +67,22 @@ Dynamic: requires-python
|
|
67
67
|
|
68
68
|
SpecPulse is a universal **Specification-Driven Development (SDD)** framework that works with ANY software project - web apps, mobile apps, desktop software, games, APIs, ML projects, and more. It ensures every feature starts with clear specifications, validated plans, and tracked tasks.
|
69
69
|
|
70
|
-
> **Latest Update (v1.4.
|
70
|
+
> **Latest Update (v1.4.2)** - Template System Enhancement:
|
71
|
+
> - 📁 **Physical Template Files**: Templates now exist as physical files for AI tools to read
|
72
|
+
> - 🔧 **Complete PowerShell Support**: Added PowerShell scripts matching all Bash functionality
|
73
|
+
> - 📝 **Enhanced Decomposition Templates**: Full microservice decomposition template support
|
74
|
+
>
|
75
|
+
> **v1.4.1** - Bug Fix Release:
|
76
|
+
> - 🐛 **Fixed Version Display**: Corrected `--version` command showing old version
|
77
|
+
>
|
78
|
+
> **v1.4.0** - Complete Framework Revolution:
|
71
79
|
> - 🚀 **Universal SDD Framework**: Transformed from Constitutional to Specification-Driven Development
|
72
80
|
> - 🎯 **No Technology Restrictions**: Support for ANY technology stack - web, mobile, desktop, games, ML
|
73
|
-
> - 🧪 **
|
81
|
+
> - 🧪 **Comprehensive Testing**: Full test suite with extensive coverage
|
74
82
|
> - ✨ **9 Universal Principles**: Flexible principles replacing rigid articles
|
75
83
|
> - 🔄 **Major API Updates**: All methods renamed from `constitution` to `sdd_compliance`
|
76
84
|
> - 📝 **Enhanced Documentation**: Complete overhaul of docs and templates
|
85
|
+
> - 🏗️ **Hybrid Template System**: Templates exist as both files and embedded code
|
77
86
|
|
78
87
|
### Why SpecPulse?
|
79
88
|
|
@@ -276,10 +285,11 @@ Stop guessing what users want:
|
|
276
285
|
Claude and Gemini use slash commands that accept arguments via `$ARGUMENTS`:
|
277
286
|
|
278
287
|
**Script Execution:**
|
279
|
-
- **
|
280
|
-
- **Requirements**: Bash shell
|
288
|
+
- **Cross-Platform Scripts**: Bash (.sh) and PowerShell (.ps1) scripts included
|
289
|
+
- **Requirements**: Bash shell (Git Bash on Windows) or PowerShell
|
281
290
|
- **Universal Compatibility**: Works whether installed via PyPI or source code
|
282
291
|
- **Unicode Support**: Full international character support (≤, ≥, →, ←)
|
292
|
+
- **Template System**: Templates exist as physical files in `resources/templates/` for AI tools to read
|
283
293
|
|
284
294
|
```bash
|
285
295
|
/sp-pulse user-authentication # Start new feature with name
|
@@ -301,14 +311,15 @@ Claude and Gemini use slash commands that accept arguments via `$ARGUMENTS`:
|
|
301
311
|
- Commands capture arguments using `$ARGUMENTS` variable
|
302
312
|
- **Shell scripts** in `resources/scripts/` folder process the arguments:
|
303
313
|
- `sp-pulse-*.sh` - Bash scripts (all platforms)
|
304
|
-
-
|
314
|
+
- `sp-pulse-*.ps1` - PowerShell scripts (Windows native)
|
315
|
+
- Templates are **physical files** in `resources/templates/` and also embedded in code
|
305
316
|
- Results are saved in `specs/`, `plans/`, `tasks/` folders
|
306
317
|
- Memory system tracks progress in `memory/` folder
|
307
318
|
|
308
319
|
**🔒 Important Security Rules:**
|
309
320
|
- **Protected Directories** (Read-Only after init):
|
310
|
-
- `templates/` -
|
311
|
-
- `scripts/` - Shell scripts
|
321
|
+
- `templates/` - Generated template files (created on init)
|
322
|
+
- `scripts/` - Shell and PowerShell scripts
|
312
323
|
- `commands/` - AI command definitions
|
313
324
|
- `.claude/` and `.gemini/` - AI configurations
|
314
325
|
- **Editable Directories**:
|
@@ -316,7 +327,7 @@ Claude and Gemini use slash commands that accept arguments via `$ARGUMENTS`:
|
|
316
327
|
- `plans/` - Implementation plans (AI creates/edits here)
|
317
328
|
- `tasks/` - Task breakdowns (AI creates/edits here)
|
318
329
|
- `memory/` - Project context and decisions
|
319
|
-
- **Workflow**: Templates are
|
330
|
+
- **Workflow**: Templates are used as references, content is generated in working directories
|
320
331
|
|
321
332
|
**Claude vs Gemini:**
|
322
333
|
- **Claude**: Uses Markdown command files (`.claude/commands/*.md`) with YAML frontmatter
|
@@ -466,12 +477,20 @@ my-project/
|
|
466
477
|
│ ├── auth-service-tasks.md
|
467
478
|
│ ├── user-service-tasks.md
|
468
479
|
│ └── integration-tasks.md
|
469
|
-
├── templates/ #
|
470
|
-
├── scripts/ #
|
471
|
-
│ ├── sp-pulse-init.sh
|
472
|
-
│ ├── sp-pulse-
|
473
|
-
│ ├── sp-pulse-
|
474
|
-
│
|
480
|
+
├── templates/ # Generated templates (created on init)
|
481
|
+
├── scripts/ # Cross-platform scripts for AI execution
|
482
|
+
│ ├── sp-pulse-init.sh # Feature initialization (Bash)
|
483
|
+
│ ├── sp-pulse-init.ps1 # Feature initialization (PowerShell)
|
484
|
+
│ ├── sp-pulse-spec.sh # Specification creation (Bash)
|
485
|
+
│ ├── sp-pulse-spec.ps1 # Specification creation (PowerShell)
|
486
|
+
│ ├── sp-pulse-plan.sh # Plan generation (Bash)
|
487
|
+
│ ├── sp-pulse-plan.ps1 # Plan generation (PowerShell)
|
488
|
+
│ ├── sp-pulse-task.sh # Task breakdown (Bash)
|
489
|
+
│ ├── sp-pulse-task.ps1 # Task breakdown (PowerShell)
|
490
|
+
│ ├── sp-pulse-decompose.sh # Microservice decomposition (Bash)
|
491
|
+
│ ├── sp-pulse-decompose.ps1 # Microservice decomposition (PowerShell)
|
492
|
+
│ ├── sp-pulse-execute.sh # Continuous task execution (Bash)
|
493
|
+
│ └── sp-pulse-execute.ps1 # Continuous task execution (PowerShell)
|
475
494
|
└── PULSE.md # Project manifest
|
476
495
|
```
|
477
496
|
|
@@ -621,8 +640,8 @@ MIT License - see [LICENSE](LICENSE) file for details.
|
|
621
640
|
## 🚦 Project Status
|
622
641
|
|
623
642
|
[](https://github.com/specpulse/specpulse)
|
624
|
-
[](https://github.com/specpulse/specpulse)
|
644
|
+
[](https://github.com/specpulse/specpulse)
|
626
645
|
[](https://github.com/specpulse/specpulse)
|
627
646
|
|
628
647
|
---
|