specpulse 1.3.3__py3-none-any.whl → 1.4.0__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 +32 -6
- specpulse/core/specpulse.py +24 -90
- specpulse/core/validator.py +38 -34
- specpulse/resources/commands/claude/sp-decompose.md +17 -17
- specpulse/resources/commands/claude/sp-plan.md +47 -47
- specpulse/resources/commands/claude/sp-pulse.md +10 -10
- specpulse/resources/commands/claude/sp-spec.md +15 -10
- specpulse/resources/commands/claude/sp-task.md +15 -15
- specpulse/resources/commands/gemini/sp-plan.toml +17 -17
- specpulse/resources/memory/constitution.md +237 -128
- specpulse/resources/scripts/sp-pulse-init.ps1 +131 -0
- specpulse/resources/scripts/sp-pulse-plan.ps1 +147 -0
- specpulse/resources/scripts/sp-pulse-plan.sh +131 -127
- specpulse/resources/scripts/sp-pulse-spec.ps1 +126 -0
- specpulse/resources/scripts/sp-pulse-task.ps1 +166 -0
- specpulse/resources/scripts/sp-pulse-task.sh +6 -6
- specpulse/resources/templates/decomposition/integration-plan.md +6 -5
- specpulse/resources/templates/decomposition/microservices.md +6 -5
- specpulse/resources/templates/decomposition/service-plan.md +6 -5
- specpulse/resources/templates/plan.md +229 -205
- specpulse/resources/templates/task.md +165 -165
- specpulse/utils/version_check.py +128 -0
- {specpulse-1.3.3.dist-info → specpulse-1.4.0.dist-info}/METADATA +70 -29
- {specpulse-1.3.3.dist-info → specpulse-1.4.0.dist-info}/RECORD +29 -24
- {specpulse-1.3.3.dist-info → specpulse-1.4.0.dist-info}/WHEEL +0 -0
- {specpulse-1.3.3.dist-info → specpulse-1.4.0.dist-info}/entry_points.txt +0 -0
- {specpulse-1.3.3.dist-info → specpulse-1.4.0.dist-info}/licenses/LICENSE +0 -0
- {specpulse-1.3.3.dist-info → specpulse-1.4.0.dist-info}/top_level.txt +0 -0
specpulse/__init__.py
CHANGED
specpulse/cli/main.py
CHANGED
@@ -17,6 +17,7 @@ from ..core.specpulse import SpecPulse
|
|
17
17
|
from ..core.validator import Validator
|
18
18
|
from ..utils.console import Console
|
19
19
|
from ..utils.git_utils import GitUtils
|
20
|
+
from ..utils.version_check import check_pypi_version, compare_versions, get_update_message, should_check_version
|
20
21
|
|
21
22
|
|
22
23
|
class SpecPulseCLI:
|
@@ -24,7 +25,32 @@ class SpecPulseCLI:
|
|
24
25
|
self.console = Console(no_color=no_color, verbose=verbose)
|
25
26
|
self.specpulse = SpecPulse()
|
26
27
|
self.validator = Validator()
|
27
|
-
|
28
|
+
|
29
|
+
# Check for updates (non-blocking)
|
30
|
+
self._check_for_updates()
|
31
|
+
|
32
|
+
def _check_for_updates(self):
|
33
|
+
"""Check for available updates on PyPI"""
|
34
|
+
try:
|
35
|
+
if not should_check_version():
|
36
|
+
return
|
37
|
+
|
38
|
+
latest = check_pypi_version(timeout=1)
|
39
|
+
if latest:
|
40
|
+
current = __version__
|
41
|
+
is_outdated, is_major = compare_versions(current, latest)
|
42
|
+
|
43
|
+
if is_outdated:
|
44
|
+
message, color = get_update_message(current, latest, is_major)
|
45
|
+
# Only show for init command or when verbose
|
46
|
+
# Don't spam on every command
|
47
|
+
import sys
|
48
|
+
if len(sys.argv) > 1 and sys.argv[1] in ['init', '--version']:
|
49
|
+
self.console.info(message, style=color)
|
50
|
+
except:
|
51
|
+
# Never fail due to version check
|
52
|
+
pass
|
53
|
+
|
28
54
|
def init(self, project_name: Optional[str] = None,
|
29
55
|
here: bool = False,
|
30
56
|
ai: str = "claude",
|
@@ -239,20 +265,20 @@ class SpecPulseCLI:
|
|
239
265
|
resources_scripts_dir = self.specpulse.resources_dir / "scripts"
|
240
266
|
|
241
267
|
# Copy all script files from resources
|
242
|
-
script_extensions = [".sh", ".py"]
|
268
|
+
script_extensions = [".sh", ".ps1", ".py"]
|
243
269
|
scripts_copied = 0
|
244
|
-
|
270
|
+
|
245
271
|
for script_file in resources_scripts_dir.iterdir():
|
246
272
|
if script_file.suffix in script_extensions:
|
247
273
|
dest_path = scripts_dir / script_file.name
|
248
274
|
shutil.copy2(script_file, dest_path)
|
249
|
-
|
275
|
+
|
250
276
|
# Make shell scripts executable
|
251
|
-
if script_file.suffix
|
277
|
+
if script_file.suffix in [".sh", ".ps1"]:
|
252
278
|
try:
|
253
279
|
os.chmod(dest_path, 0o755)
|
254
280
|
except:
|
255
|
-
pass # Windows may not support chmod
|
281
|
+
pass # Windows may not support chmod for .sh files
|
256
282
|
|
257
283
|
scripts_copied += 1
|
258
284
|
|
specpulse/core/specpulse.py
CHANGED
@@ -41,7 +41,7 @@ class SpecPulse:
|
|
41
41
|
|
42
42
|
def get_spec_template(self) -> str:
|
43
43
|
"""Get specification template from file"""
|
44
|
-
template_path = self.resources_dir / "templates" / "spec
|
44
|
+
template_path = self.resources_dir / "templates" / "spec.md"
|
45
45
|
if template_path.exists():
|
46
46
|
with open(template_path, 'r', encoding='utf-8') as f:
|
47
47
|
return f.read()
|
@@ -125,7 +125,7 @@ FR-001: [Requirement]
|
|
125
125
|
|
126
126
|
def get_plan_template(self) -> str:
|
127
127
|
"""Get implementation plan template from file"""
|
128
|
-
template_path = self.resources_dir / "templates" / "plan
|
128
|
+
template_path = self.resources_dir / "templates" / "plan.md"
|
129
129
|
if template_path.exists():
|
130
130
|
with open(template_path, 'r', encoding='utf-8') as f:
|
131
131
|
return f.read()
|
@@ -294,14 +294,14 @@ indexes:
|
|
294
294
|
- Performance Benchmarks
|
295
295
|
- Security Scenarios
|
296
296
|
|
297
|
-
##
|
297
|
+
## SDD Compliance
|
298
298
|
|
299
299
|
### Principle Validation
|
300
|
-
- [ ]
|
301
|
-
- [ ]
|
302
|
-
- [ ]
|
303
|
-
- [ ]
|
304
|
-
- [ ]
|
300
|
+
- [ ] Specification First: Requirements clearly defined
|
301
|
+
- [ ] Incremental Planning: Phased approach planned
|
302
|
+
- [ ] Task Decomposition: Broken into executable tasks
|
303
|
+
- [ ] Quality Assurance: Appropriate testing strategy
|
304
|
+
- [ ] Architecture Documentation: Decisions recorded
|
305
305
|
|
306
306
|
## Risk Assessment
|
307
307
|
|
@@ -317,7 +317,7 @@ indexes:
|
|
317
317
|
|
318
318
|
## Success Criteria
|
319
319
|
- [ ] All functional requirements implemented
|
320
|
-
- [ ]
|
320
|
+
- [ ] Appropriate test coverage for project type
|
321
321
|
- [ ] Performance targets met
|
322
322
|
- [ ] Security audit passed
|
323
323
|
- [ ] Documentation complete
|
@@ -419,79 +419,9 @@ metrics:
|
|
419
419
|
if template_path.exists():
|
420
420
|
with open(template_path, 'r', encoding='utf-8') as f:
|
421
421
|
return f.read()
|
422
|
-
# Fallback
|
423
|
-
|
424
|
-
|
425
|
-
## Immutable Principles
|
426
|
-
|
427
|
-
### Principle 1: Simplicity First
|
428
|
-
Every solution must start with the simplest approach that could work.
|
429
|
-
Complexity is added only when proven necessary.
|
430
|
-
|
431
|
-
### Principle 2: Test-Driven Development
|
432
|
-
No production code without tests.
|
433
|
-
Tests are written first, implementation follows.
|
434
|
-
|
435
|
-
### Principle 3: Single Responsibility
|
436
|
-
Each module, function, and component does one thing well.
|
437
|
-
If you need "and" to describe it, split it.
|
438
|
-
|
439
|
-
### Principle 4: Documentation as Code
|
440
|
-
Documentation lives with code.
|
441
|
-
If it's not documented, it doesn't exist.
|
442
|
-
|
443
|
-
### Principle 5: Security by Design
|
444
|
-
Security is not an afterthought.
|
445
|
-
Every feature considers security implications from the start.
|
446
|
-
|
447
|
-
## Technical Standards
|
448
|
-
|
449
|
-
### Code Style
|
450
|
-
- Python: PEP 8 with type hints
|
451
|
-
- JavaScript: StandardJS
|
452
|
-
- Go: Official Go formatting
|
453
|
-
|
454
|
-
### Testing Requirements
|
455
|
-
- Minimum 80% code coverage
|
456
|
-
- All API endpoints must have contract tests
|
457
|
-
- Critical paths require E2E tests
|
458
|
-
|
459
|
-
### Performance Targets
|
460
|
-
- API response time: < 200ms (p95)
|
461
|
-
- Page load time: < 2 seconds
|
462
|
-
- Database queries: < 50ms
|
463
|
-
|
464
|
-
### Security Requirements
|
465
|
-
- All data encrypted in transit (TLS 1.3+)
|
466
|
-
- Sensitive data encrypted at rest
|
467
|
-
- Authentication: OAuth 2.0 / JWT
|
468
|
-
- Authorization: RBAC with least privilege
|
469
|
-
|
470
|
-
## Architecture Rules
|
471
|
-
|
472
|
-
### Service Boundaries
|
473
|
-
- Services communicate only through defined APIs
|
474
|
-
- No shared databases between services
|
475
|
-
- Each service owns its data
|
476
|
-
|
477
|
-
### Data Management
|
478
|
-
- Single source of truth for each data type
|
479
|
-
- Event sourcing for audit requirements
|
480
|
-
- CQRS where read/write patterns differ
|
481
|
-
|
482
|
-
### Error Handling
|
483
|
-
- All errors are handled explicitly
|
484
|
-
- User-facing errors are helpful and actionable
|
485
|
-
- System errors are logged with context
|
486
|
-
|
487
|
-
## Amendment Process
|
488
|
-
|
489
|
-
Changes to this constitution require:
|
490
|
-
1. Documented rationale
|
491
|
-
2. Team consensus
|
492
|
-
3. Gradual migration plan
|
493
|
-
4. Update to all affected documentation
|
494
|
-
"""
|
422
|
+
# Fallback - return empty if template not found
|
423
|
+
# Templates should always be loaded from resources/memory/constitution.md
|
424
|
+
return ""
|
495
425
|
|
496
426
|
def get_context_template(self) -> str:
|
497
427
|
"""Get context template from file"""
|
@@ -915,20 +845,24 @@ Validates specifications, plans, or project.
|
|
915
845
|
4. Plan approved → Use `/sp-task breakdown`
|
916
846
|
5. Before implementation → Use `/validate all`
|
917
847
|
|
918
|
-
##
|
848
|
+
## SDD Principles
|
919
849
|
|
920
|
-
|
921
|
-
1.
|
922
|
-
2.
|
923
|
-
3.
|
924
|
-
4.
|
925
|
-
5.
|
850
|
+
Follow these universal principles:
|
851
|
+
1. Specification First
|
852
|
+
2. Incremental Planning
|
853
|
+
3. Task Decomposition
|
854
|
+
4. Traceable Implementation
|
855
|
+
5. Continuous Validation
|
856
|
+
6. Quality Assurance
|
857
|
+
7. Architecture Documentation
|
858
|
+
8. Iterative Refinement
|
859
|
+
9. Stakeholder Alignment
|
926
860
|
|
927
861
|
## Context Management
|
928
862
|
|
929
863
|
- Read `memory/context.md` for project state
|
930
864
|
- Update context after major decisions
|
931
|
-
- Check `memory/constitution.md` for principles
|
865
|
+
- Check `memory/constitution.md` for SDD principles
|
932
866
|
- Reference previous specs for consistency
|
933
867
|
|
934
868
|
## Templates
|
specpulse/core/validator.py
CHANGED
@@ -32,8 +32,8 @@ class Validator:
|
|
32
32
|
# Validate plans
|
33
33
|
self._validate_plans(project_path, fix, verbose)
|
34
34
|
|
35
|
-
# Validate
|
36
|
-
self.
|
35
|
+
# Validate SDD principles compliance
|
36
|
+
self._validate_sdd_compliance(project_path, verbose)
|
37
37
|
|
38
38
|
return self.results
|
39
39
|
|
@@ -101,10 +101,10 @@ class Validator:
|
|
101
101
|
|
102
102
|
return self.results
|
103
103
|
|
104
|
-
def
|
105
|
-
"""Validate
|
104
|
+
def validate_sdd_compliance(self, project_path: Path, verbose: bool = False) -> List[Dict]:
|
105
|
+
"""Validate SDD principles compliance"""
|
106
106
|
self.results = []
|
107
|
-
self.
|
107
|
+
self._validate_sdd_compliance(project_path, verbose)
|
108
108
|
return self.results
|
109
109
|
|
110
110
|
def _validate_structure(self, project_path: Path):
|
@@ -283,27 +283,31 @@ class Validator:
|
|
283
283
|
"message": "No implementation plans found"
|
284
284
|
})
|
285
285
|
|
286
|
-
def
|
287
|
-
"""Validate compliance with
|
286
|
+
def _validate_sdd_compliance(self, project_path: Path, verbose: bool):
|
287
|
+
"""Validate compliance with SDD principles"""
|
288
288
|
constitution_path = project_path / "memory" / "constitution.md"
|
289
289
|
|
290
290
|
if not constitution_path.exists():
|
291
291
|
self.results.append({
|
292
292
|
"status": "error",
|
293
|
-
"message": "
|
293
|
+
"message": "SDD principles file (constitution.md) not found"
|
294
294
|
})
|
295
295
|
return
|
296
296
|
|
297
297
|
with open(constitution_path, 'r', encoding='utf-8') as f:
|
298
298
|
constitution = f.read()
|
299
299
|
|
300
|
-
# Check for key principles
|
300
|
+
# Check for key SDD principles
|
301
301
|
principles = [
|
302
|
-
"
|
303
|
-
"
|
304
|
-
"
|
305
|
-
"
|
306
|
-
"
|
302
|
+
"Specification First",
|
303
|
+
"Incremental Planning",
|
304
|
+
"Task Decomposition",
|
305
|
+
"Traceable Implementation",
|
306
|
+
"Continuous Validation",
|
307
|
+
"Quality Assurance",
|
308
|
+
"Architecture Documentation",
|
309
|
+
"Iterative Refinement",
|
310
|
+
"Stakeholder Alignment"
|
307
311
|
]
|
308
312
|
|
309
313
|
for principle in principles:
|
@@ -311,12 +315,12 @@ class Validator:
|
|
311
315
|
if verbose:
|
312
316
|
self.results.append({
|
313
317
|
"status": "success",
|
314
|
-
"message": f"
|
318
|
+
"message": f"SDD principle found: {principle}"
|
315
319
|
})
|
316
320
|
else:
|
317
321
|
self.results.append({
|
318
322
|
"status": "warning",
|
319
|
-
"message": f"
|
323
|
+
"message": f"Missing SDD principle: {principle}"
|
320
324
|
})
|
321
325
|
|
322
326
|
# Check config for constitution enforcement
|
@@ -325,15 +329,15 @@ class Validator:
|
|
325
329
|
with open(config_path, 'r', encoding='utf-8') as f:
|
326
330
|
config = yaml.safe_load(f)
|
327
331
|
|
328
|
-
if config.get("
|
332
|
+
if config.get("sdd", {}).get("enforce", True):
|
329
333
|
self.results.append({
|
330
334
|
"status": "success",
|
331
|
-
"message": "
|
335
|
+
"message": "SDD principles enforcement enabled"
|
332
336
|
})
|
333
337
|
else:
|
334
338
|
self.results.append({
|
335
339
|
"status": "warning",
|
336
|
-
"message": "
|
340
|
+
"message": "SDD principles enforcement disabled"
|
337
341
|
})
|
338
342
|
|
339
343
|
def _load_constitution(self, project_root: Path):
|
@@ -362,7 +366,7 @@ class Validator:
|
|
362
366
|
self._load_constitution(project_root)
|
363
367
|
return self.constitution is not None
|
364
368
|
|
365
|
-
def
|
369
|
+
def validate_spec_file(self, spec_path: Path, verbose: bool = False) -> Dict:
|
366
370
|
"""Validate a single specification file"""
|
367
371
|
if not spec_path.exists():
|
368
372
|
return {"status": "error", "message": f"Spec file not found: {spec_path}"}
|
@@ -381,7 +385,7 @@ class Validator:
|
|
381
385
|
|
382
386
|
return result
|
383
387
|
|
384
|
-
def
|
388
|
+
def validate_plan_file(self, plan_path: Path, verbose: bool = False) -> Dict:
|
385
389
|
"""Validate a single plan file"""
|
386
390
|
if not plan_path.exists():
|
387
391
|
return {"status": "error", "message": f"Plan file not found: {plan_path}"}
|
@@ -400,7 +404,7 @@ class Validator:
|
|
400
404
|
|
401
405
|
return result
|
402
406
|
|
403
|
-
def
|
407
|
+
def validate_task_file(self, task_path: Path, verbose: bool = False) -> Dict:
|
404
408
|
"""Validate a single task file"""
|
405
409
|
if not task_path.exists():
|
406
410
|
return {"status": "error", "message": f"Task file not found: {task_path}"}
|
@@ -417,16 +421,16 @@ class Validator:
|
|
417
421
|
|
418
422
|
return result
|
419
423
|
|
420
|
-
def
|
421
|
-
"""Validate that content complies with
|
424
|
+
def validate_sdd_principles(self, spec_content: str, verbose: bool = False) -> Dict:
|
425
|
+
"""Validate that content complies with SDD principles"""
|
422
426
|
result = {"status": "compliant", "violations": []}
|
423
427
|
|
424
428
|
if not self.constitution:
|
425
429
|
return result
|
426
430
|
|
427
|
-
# Check for
|
428
|
-
if '
|
429
|
-
result["violations"].append("
|
431
|
+
# Check for specification clarity
|
432
|
+
if '[needs clarification]' in spec_content.lower():
|
433
|
+
result["violations"].append("Specification First: Contains unresolved clarifications")
|
430
434
|
|
431
435
|
if result["violations"]:
|
432
436
|
result["status"] = "non-compliant"
|
@@ -435,9 +439,9 @@ class Validator:
|
|
435
439
|
|
436
440
|
def check_phase_gate(self, gate_name: str, context: Dict) -> bool:
|
437
441
|
"""Check if a phase gate passes"""
|
438
|
-
#
|
439
|
-
if gate_name == "
|
440
|
-
return context.get("
|
442
|
+
# Gate checking logic
|
443
|
+
if gate_name == "specification":
|
444
|
+
return context.get("spec_complete", False)
|
441
445
|
elif gate_name == "test-first":
|
442
446
|
return context.get("tests_written", False)
|
443
447
|
return True
|
@@ -448,26 +452,26 @@ class Validator:
|
|
448
452
|
"specs": [],
|
449
453
|
"plans": [],
|
450
454
|
"tasks": [],
|
451
|
-
"
|
455
|
+
"sdd_compliance": True
|
452
456
|
}
|
453
457
|
|
454
458
|
# Validate specs
|
455
459
|
specs_dir = project_root / "specs"
|
456
460
|
if specs_dir.exists():
|
457
461
|
for spec_file in specs_dir.glob("*/spec*.md"):
|
458
|
-
results["specs"].append(self.
|
462
|
+
results["specs"].append(self.validate_spec_file(spec_file, verbose))
|
459
463
|
|
460
464
|
# Validate plans
|
461
465
|
plans_dir = project_root / "plans"
|
462
466
|
if plans_dir.exists():
|
463
467
|
for plan_file in plans_dir.glob("*/plan*.md"):
|
464
|
-
results["plans"].append(self.
|
468
|
+
results["plans"].append(self.validate_plan_file(plan_file, verbose))
|
465
469
|
|
466
470
|
# Validate tasks
|
467
471
|
tasks_dir = project_root / "tasks"
|
468
472
|
if tasks_dir.exists():
|
469
473
|
for task_file in tasks_dir.glob("*/task*.md"):
|
470
|
-
results["tasks"].append(self.
|
474
|
+
results["tasks"].append(self.validate_task_file(task_file, verbose))
|
471
475
|
|
472
476
|
return results
|
473
477
|
|
@@ -108,8 +108,8 @@ When called with `/sp-decompose $ARGUMENTS`, I will:
|
|
108
108
|
- Check for circular dependencies
|
109
109
|
- Verify data consistency boundaries
|
110
110
|
- Ensure single responsibility principle
|
111
|
-
- Validate against
|
112
|
-
-
|
111
|
+
- Validate against SDD principles:
|
112
|
+
- Clear service boundaries
|
113
113
|
- Clear boundaries
|
114
114
|
- Testability
|
115
115
|
|
@@ -180,28 +180,28 @@ specs/001-authentication/decomposition/
|
|
180
180
|
└── migration-plan.md # Decomposition strategy
|
181
181
|
```
|
182
182
|
|
183
|
-
##
|
183
|
+
## SDD Compliance
|
184
184
|
|
185
|
-
**
|
186
|
-
- Each service
|
187
|
-
-
|
188
|
-
-
|
185
|
+
**Principle 1: Specification First**
|
186
|
+
- Each service has clear specifications
|
187
|
+
- Service boundaries well-defined
|
188
|
+
- Requirements traced to services
|
189
189
|
|
190
|
-
**
|
191
|
-
- Services
|
192
|
-
- Clear
|
193
|
-
-
|
190
|
+
**Principle 3: Task Decomposition**
|
191
|
+
- Services broken into manageable tasks
|
192
|
+
- Clear service-specific work items
|
193
|
+
- Integration tasks identified
|
194
194
|
|
195
|
-
**
|
196
|
-
-
|
197
|
-
-
|
198
|
-
-
|
195
|
+
**Principle 7: Architecture Documentation**
|
196
|
+
- Service boundaries documented
|
197
|
+
- Technology choices recorded
|
198
|
+
- Integration patterns defined
|
199
199
|
|
200
200
|
## Integration with SpecPulse Workflow
|
201
201
|
|
202
202
|
1. **After `/sp-spec create`**:
|
203
203
|
- AI analyzes spec complexity
|
204
|
-
- Suggests decomposition if
|
204
|
+
- Suggests decomposition if complexity warrants it
|
205
205
|
- User confirms with `/sp-decompose`
|
206
206
|
|
207
207
|
2. **During decomposition**:
|
@@ -223,7 +223,7 @@ specs/001-authentication/decomposition/
|
|
223
223
|
5. **With `/sp-validate`**:
|
224
224
|
- Validates service boundaries
|
225
225
|
- Checks circular dependencies
|
226
|
-
- Ensures
|
226
|
+
- Ensures SDD compliance
|
227
227
|
|
228
228
|
## Error Handling
|
229
229
|
|
@@ -11,7 +11,7 @@ allowed_tools:
|
|
11
11
|
|
12
12
|
# /sp-plan Command
|
13
13
|
|
14
|
-
Generate implementation plans from specifications following SpecPulse methodology with
|
14
|
+
Generate implementation plans from specifications following SpecPulse methodology with SDD compliance and AI-optimized templates.
|
15
15
|
|
16
16
|
## CRITICAL: File Edit Restrictions
|
17
17
|
- **NEVER EDIT**: templates/, scripts/, commands/, .claude/, .gemini/
|
@@ -36,7 +36,7 @@ When called with `/sp-plan $ARGUMENTS`, I will:
|
|
36
36
|
- If no context found, ask user to specify feature or run `/sp-pulse` first
|
37
37
|
|
38
38
|
2. **Parse arguments** and determine action:
|
39
|
-
- If `validate`: Check plan against
|
39
|
+
- If `validate`: Check plan against SDD gates
|
40
40
|
- If `optimize`: Improve existing plan complexity
|
41
41
|
- Otherwise: Generate new plan
|
42
42
|
|
@@ -57,12 +57,12 @@ When called with `/sp-plan $ARGUMENTS`, I will:
|
|
57
57
|
bash scripts/sp-pulse-plan.sh "$FEATURE_DIR"
|
58
58
|
```
|
59
59
|
|
60
|
-
e. **Run
|
61
|
-
-
|
62
|
-
-
|
63
|
-
-
|
64
|
-
-
|
65
|
-
-
|
60
|
+
e. **Run SDD Compliance Gates**:
|
61
|
+
- Specification First: Requirements clear and traced
|
62
|
+
- Incremental Planning: Phased approach defined
|
63
|
+
- Task Decomposition: Clear breakdown planned
|
64
|
+
- Quality Assurance: Testing strategy defined
|
65
|
+
- Architecture Documentation: Decisions recorded
|
66
66
|
|
67
67
|
f. **Generate AI-optimized plan** by COPYING template from templates/plan.md to plans/XXX-feature/:
|
68
68
|
```markdown
|
@@ -91,10 +91,10 @@ When called with `/sp-plan $ARGUMENTS`, I will:
|
|
91
91
|
* Security considerations
|
92
92
|
* Deployment strategy with rollback plans
|
93
93
|
|
94
|
-
h. **
|
95
|
-
- Document all
|
96
|
-
- Create
|
97
|
-
- Track
|
94
|
+
h. **Architecture documentation**:
|
95
|
+
- Document all architectural decisions with rationale
|
96
|
+
- Create improvement strategies for technical debt
|
97
|
+
- Track future enhancement opportunities
|
98
98
|
|
99
99
|
i. **Version management**: Check existing plan files and create next version (plan-001.md, plan-002.md, etc.)
|
100
100
|
j. **Write NEW plan file** to `plans/XXX-feature/plan-XXX.md`
|
@@ -107,8 +107,8 @@ When called with `/sp-plan $ARGUMENTS`, I will:
|
|
107
107
|
```bash
|
108
108
|
bash scripts/sp-pulse-plan.sh "$FEATURE_DIR"
|
109
109
|
```
|
110
|
-
d. Verify all
|
111
|
-
e. Check
|
110
|
+
d. Verify all SDD gates are addressed
|
111
|
+
e. Check architectural decisions have proper documentation
|
112
112
|
f. Validate test-first approach is documented
|
113
113
|
g. Ensure integration strategy uses real services
|
114
114
|
h. Report detailed validation results
|
@@ -124,38 +124,38 @@ When called with `/sp-plan $ARGUMENTS`, I will:
|
|
124
124
|
e. **Generate optimization recommendations**
|
125
125
|
f. **Create new version**: Write optimized plan as next version (plan-XXX.md)
|
126
126
|
|
127
|
-
##
|
127
|
+
## SDD Compliance Gates (Phase -1)
|
128
128
|
|
129
129
|
**Must pass before implementation:**
|
130
130
|
|
131
|
-
###
|
132
|
-
- [ ]
|
133
|
-
- [ ]
|
134
|
-
- [ ]
|
135
|
-
- [ ]
|
136
|
-
|
137
|
-
###
|
138
|
-
- [ ]
|
139
|
-
- [ ]
|
140
|
-
- [ ]
|
141
|
-
- [ ]
|
142
|
-
|
143
|
-
###
|
144
|
-
- [ ]
|
145
|
-
- [ ]
|
146
|
-
- [ ]
|
147
|
-
- [ ]
|
148
|
-
|
149
|
-
###
|
150
|
-
- [ ]
|
151
|
-
- [ ]
|
152
|
-
- [ ]
|
153
|
-
- [ ]
|
154
|
-
|
155
|
-
###
|
156
|
-
- [ ]
|
157
|
-
- [ ]
|
158
|
-
- [ ]
|
131
|
+
### Principle 1: Specification First
|
132
|
+
- [ ] Clear requirements documented
|
133
|
+
- [ ] User stories with acceptance criteria
|
134
|
+
- [ ] [NEEDS CLARIFICATION] markers used
|
135
|
+
- [ ] Functional and non-functional requirements
|
136
|
+
|
137
|
+
### Principle 2: Incremental Planning
|
138
|
+
- [ ] Work broken into valuable phases
|
139
|
+
- [ ] Each phase delivers working software
|
140
|
+
- [ ] Milestones and checkpoints defined
|
141
|
+
- [ ] Features prioritized by business value
|
142
|
+
|
143
|
+
### Principle 3: Task Decomposition
|
144
|
+
- [ ] Tasks are specific and actionable
|
145
|
+
- [ ] Effort estimates provided
|
146
|
+
- [ ] Definition of Done clear
|
147
|
+
- [ ] Dependencies identified
|
148
|
+
|
149
|
+
### Principle 6: Quality Assurance
|
150
|
+
- [ ] Testing strategy appropriate for project
|
151
|
+
- [ ] Acceptance criteria testable
|
152
|
+
- [ ] Code review process defined
|
153
|
+
- [ ] Quality metrics identified
|
154
|
+
|
155
|
+
### Principle 7: Architecture Documentation
|
156
|
+
- [ ] Technology choices documented
|
157
|
+
- [ ] Integration points identified
|
158
|
+
- [ ] Technical debt tracked
|
159
159
|
- [ ] Trade-offs documented
|
160
160
|
|
161
161
|
## Examples
|
@@ -184,7 +184,7 @@ User: /sp-plan validate
|
|
184
184
|
I will run comprehensive validation:
|
185
185
|
```
|
186
186
|
PLAN_FILE=plans/001-user-authentication/plan.md
|
187
|
-
|
187
|
+
SDD_GATES_STATUS=COMPLETED
|
188
188
|
MISSING_SECTIONS=0
|
189
189
|
STATUS=validation_complete
|
190
190
|
```
|
@@ -199,8 +199,8 @@ I will analyze and recommend complexity reductions.
|
|
199
199
|
|
200
200
|
- **AI-optimized templates** with Jinja2-style variables
|
201
201
|
- **Script execution** with Bash
|
202
|
-
- **
|
203
|
-
- **
|
202
|
+
- **SDD compliance tracking** with gate status
|
203
|
+
- **Architecture decision tracking** with rationale
|
204
204
|
- **Performance and security considerations** integrated
|
205
205
|
- **Integration-first approach** with real service usage
|
206
206
|
- **Detailed validation reporting** with specific recommendations
|
@@ -209,7 +209,7 @@ I will analyze and recommend complexity reductions.
|
|
209
209
|
## Error Handling
|
210
210
|
|
211
211
|
- Specification existence validation
|
212
|
-
-
|
212
|
+
- SDD gate compliance checking
|
213
213
|
- Template structure validation
|
214
214
|
- Directory structure verification
|
215
215
|
- Feature context auto-discovery
|