specpulse 1.0.5__py3-none-any.whl → 1.1.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.
Files changed (43) hide show
  1. specpulse/__init__.py +1 -1
  2. specpulse/cli/main.py +60 -93
  3. specpulse/core/specpulse.py +1110 -1099
  4. specpulse/resources/commands/claude/sp-continue.md +203 -0
  5. specpulse/resources/commands/claude/{plan.md → sp-plan.md} +53 -38
  6. specpulse/resources/commands/claude/sp-pulse.md +142 -0
  7. specpulse/resources/commands/claude/{spec.md → sp-spec.md} +36 -23
  8. specpulse/resources/commands/claude/sp-status.md +170 -0
  9. specpulse/resources/commands/claude/{task.md → sp-task.md} +68 -48
  10. specpulse/resources/commands/gemini/sp-continue.toml +56 -0
  11. specpulse/resources/commands/gemini/sp-plan.toml +68 -0
  12. specpulse/resources/commands/gemini/{pulse.toml → sp-pulse.toml} +12 -6
  13. specpulse/resources/commands/gemini/sp-spec.toml +54 -0
  14. specpulse/resources/commands/gemini/sp-status.toml +61 -0
  15. specpulse/resources/commands/gemini/sp-task.toml +79 -0
  16. specpulse/resources/memory/constitution.md +5 -5
  17. specpulse/resources/memory/context.md +12 -1
  18. specpulse/resources/scripts/{pulse-init.py → sp-pulse-init.py} +6 -6
  19. specpulse/resources/scripts/{pulse-init.sh → sp-pulse-init.sh} +95 -95
  20. specpulse/resources/scripts/{pulse-plan.py → sp-pulse-plan.py} +32 -7
  21. specpulse/resources/scripts/{pulse-plan.sh → sp-pulse-plan.sh} +136 -126
  22. specpulse/resources/scripts/{pulse-spec.py → sp-pulse-spec.py} +26 -6
  23. specpulse/resources/scripts/{pulse-spec.sh → sp-pulse-spec.sh} +126 -103
  24. specpulse/resources/scripts/{pulse-task.py → sp-pulse-task.py} +42 -6
  25. specpulse/resources/scripts/{pulse-task.sh → sp-pulse-task.sh} +32 -16
  26. specpulse/resources/templates/plan.md +206 -206
  27. specpulse/resources/templates/spec.md +125 -125
  28. specpulse/resources/templates/task.md +164 -163
  29. {specpulse-1.0.5.dist-info → specpulse-1.1.0.dist-info}/METADATA +36 -45
  30. specpulse-1.1.0.dist-info/RECORD +41 -0
  31. specpulse/resources/commands/claude/pulse.md +0 -91
  32. specpulse/resources/commands/gemini/plan.toml +0 -59
  33. specpulse/resources/commands/gemini/spec.toml +0 -45
  34. specpulse/resources/commands/gemini/task.toml +0 -69
  35. specpulse/resources/scripts/pulse-init.ps1 +0 -186
  36. specpulse/resources/scripts/pulse-plan.ps1 +0 -251
  37. specpulse/resources/scripts/pulse-spec.ps1 +0 -185
  38. specpulse/resources/scripts/pulse-task.ps1 +0 -263
  39. specpulse-1.0.5.dist-info/RECORD +0 -41
  40. {specpulse-1.0.5.dist-info → specpulse-1.1.0.dist-info}/WHEEL +0 -0
  41. {specpulse-1.0.5.dist-info → specpulse-1.1.0.dist-info}/entry_points.txt +0 -0
  42. {specpulse-1.0.5.dist-info → specpulse-1.1.0.dist-info}/licenses/LICENSE +0 -0
  43. {specpulse-1.0.5.dist-info → specpulse-1.1.0.dist-info}/top_level.txt +0 -0
specpulse/__init__.py CHANGED
@@ -3,7 +3,7 @@ SpecPulse: Specification-Driven Development Framework
3
3
  Built for the AI era
4
4
  """
5
5
 
6
- __version__ = "1.0.5"
6
+ __version__ = "1.1.0"
7
7
  __author__ = "SpecPulse"
8
8
  __url__ = "https://github.com/specpulse"
9
9
 
specpulse/cli/main.py CHANGED
@@ -88,8 +88,8 @@ class SpecPulseCLI:
88
88
  "primary": ai
89
89
  },
90
90
  "templates": {
91
- "spec": "templates/spec.md",
92
- "plan": "templates/plan.md",
91
+ "spec": "templates/spec-001.md",
92
+ "plan": "templates/plan-001.md",
93
93
  "task": "templates/task.md"
94
94
  },
95
95
  "conventions": {
@@ -179,12 +179,12 @@ class SpecPulseCLI:
179
179
 
180
180
  # Create spec template
181
181
  spec_template = self.specpulse.get_spec_template()
182
- with open(templates_dir / "spec.md", 'w', encoding='utf-8') as f:
182
+ with open(templates_dir / "spec-001.md", 'w', encoding='utf-8') as f:
183
183
  f.write(spec_template)
184
184
 
185
185
  # Create plan template
186
186
  plan_template = self.specpulse.get_plan_template()
187
- with open(templates_dir / "plan.md", 'w', encoding='utf-8') as f:
187
+ with open(templates_dir / "plan-001.md", 'w', encoding='utf-8') as f:
188
188
  f.write(plan_template)
189
189
 
190
190
  # Create task template
@@ -216,97 +216,64 @@ class SpecPulseCLI:
216
216
  self.console.animated_success("Memory files created")
217
217
 
218
218
  def _create_scripts(self, project_path: Path):
219
- """Create automation scripts"""
219
+ """Create automation scripts - copy all cross-platform scripts from resources"""
220
220
  scripts_dir = project_path / "scripts"
221
-
222
- # Pulse init script
223
- init_script = self.specpulse.get_setup_script()
224
- with open(scripts_dir / "pulse-init.sh", 'w', encoding='utf-8') as f:
225
- f.write(init_script)
226
- try:
227
- os.chmod(scripts_dir / "pulse-init.sh", 0o755)
228
- except:
229
- pass # Windows may not support chmod
230
-
231
- # Pulse spec script
232
- spec_script = self.specpulse.get_spec_script()
233
- with open(scripts_dir / "pulse-spec.sh", 'w', encoding='utf-8') as f:
234
- f.write(spec_script)
235
- try:
236
- os.chmod(scripts_dir / "pulse-spec.sh", 0o755)
237
- except:
238
- pass
239
-
240
- # Pulse plan script
241
- plan_script = self.specpulse.get_plan_script()
242
- with open(scripts_dir / "pulse-plan.sh", 'w', encoding='utf-8') as f:
243
- f.write(plan_script)
244
- try:
245
- os.chmod(scripts_dir / "pulse-plan.sh", 0o755)
246
- except:
247
- pass
248
-
249
- # Pulse task script
250
- task_script = self.specpulse.get_task_script()
251
- with open(scripts_dir / "pulse-task.sh", 'w', encoding='utf-8') as f:
252
- f.write(task_script)
253
- try:
254
- os.chmod(scripts_dir / "pulse-task.sh", 0o755)
255
- except:
256
- pass
257
-
258
- self.console.animated_success("Scripts created")
221
+ resources_scripts_dir = self.specpulse.resources_dir / "scripts"
222
+
223
+ # Copy all script files from resources
224
+ script_extensions = [".sh", ".py"]
225
+ scripts_copied = 0
226
+
227
+ for script_file in resources_scripts_dir.iterdir():
228
+ if script_file.suffix in script_extensions:
229
+ dest_path = scripts_dir / script_file.name
230
+ shutil.copy2(script_file, dest_path)
231
+
232
+ # Make shell scripts executable
233
+ if script_file.suffix == ".sh":
234
+ try:
235
+ os.chmod(dest_path, 0o755)
236
+ except:
237
+ pass # Windows may not support chmod
238
+
239
+ scripts_copied += 1
240
+
241
+ if scripts_copied == 0:
242
+ self.console.warning("No scripts found in resources directory")
243
+ else:
244
+ self.console.animated_success(f"Scripts created ({scripts_copied} files)")
259
245
 
260
246
  def _create_ai_commands(self, project_path: Path):
261
247
  """Create AI command files for Claude and Gemini CLI integration"""
262
248
 
263
- # Claude commands (.md format)
264
- claude_commands_dir = project_path / ".claude" / "commands"
265
-
266
- # /pulse command - Initialize feature
267
- pulse_command = self.specpulse.get_claude_pulse_command()
268
- with open(claude_commands_dir / "pulse.md", 'w', encoding='utf-8') as f:
269
- f.write(pulse_command)
270
-
271
- # /spec command - Create specification
272
- spec_command = self.specpulse.get_claude_spec_command()
273
- with open(claude_commands_dir / "spec.md", 'w', encoding='utf-8') as f:
274
- f.write(spec_command)
249
+ # Copy all command files from resources
250
+ resources_commands_dir = self.specpulse.resources_dir / "commands"
251
+ commands_copied = 0
275
252
 
276
- # /plan command - Generate plan
277
- plan_command = self.specpulse.get_claude_plan_command()
278
- with open(claude_commands_dir / "plan.md", 'w', encoding='utf-8') as f:
279
- f.write(plan_command)
253
+ # Copy Claude commands (.md format)
254
+ claude_commands_dir = project_path / ".claude" / "commands"
255
+ claude_resources_dir = resources_commands_dir / "claude"
280
256
 
281
- # /task command - Create task breakdown
282
- task_command = self.specpulse.get_claude_task_command()
283
- with open(claude_commands_dir / "task.md", 'w', encoding='utf-8') as f:
284
- f.write(task_command)
257
+ if claude_resources_dir.exists():
258
+ for command_file in claude_resources_dir.glob("*.md"):
259
+ dest_path = claude_commands_dir / command_file.name
260
+ shutil.copy2(command_file, dest_path)
261
+ commands_copied += 1
285
262
 
286
- # Gemini commands (.toml format)
263
+ # Copy Gemini commands (.toml format)
287
264
  gemini_commands_dir = project_path / ".gemini" / "commands"
265
+ gemini_resources_dir = resources_commands_dir / "gemini"
288
266
 
289
- # pulse command
290
- pulse_toml = self.specpulse.get_gemini_pulse_command()
291
- with open(gemini_commands_dir / "pulse.toml", 'w', encoding='utf-8') as f:
292
- f.write(pulse_toml)
293
-
294
- # spec command
295
- spec_toml = self.specpulse.get_gemini_spec_command()
296
- with open(gemini_commands_dir / "spec.toml", 'w', encoding='utf-8') as f:
297
- f.write(spec_toml)
298
-
299
- # plan command
300
- plan_toml = self.specpulse.get_gemini_plan_command()
301
- with open(gemini_commands_dir / "plan.toml", 'w', encoding='utf-8') as f:
302
- f.write(plan_toml)
267
+ if gemini_resources_dir.exists():
268
+ for command_file in gemini_resources_dir.glob("*.toml"):
269
+ dest_path = gemini_commands_dir / command_file.name
270
+ shutil.copy2(command_file, dest_path)
271
+ commands_copied += 1
303
272
 
304
- # task command
305
- task_toml = self.specpulse.get_gemini_task_command()
306
- with open(gemini_commands_dir / "task.toml", 'w', encoding='utf-8') as f:
307
- f.write(task_toml)
308
-
309
- self.console.animated_success("AI command files created")
273
+ if commands_copied == 0:
274
+ self.console.warning("No AI command files found in resources directory")
275
+ else:
276
+ self.console.animated_success(f"AI command files created ({commands_copied} files)")
310
277
 
311
278
  # def _create_ai_files(self, project_path: Path, ai: str):
312
279
  # """Create AI instruction files (deprecated - AI tools create these themselves)"""
@@ -322,10 +289,10 @@ This project uses SpecPulse for specification-driven development.
322
289
 
323
290
  ## Quick Start
324
291
  1. Open in your AI assistant (Claude or Gemini)
325
- 2. Use `/pulse init <feature>` to start a new feature
326
- 3. Use `/spec create` to generate specifications
327
- 4. Use `/plan generate` to create implementation plans
328
- 5. Use `/task breakdown` to create task lists
292
+ 2. Use `/sp-pulse <feature>` to start a new feature
293
+ 3. Use `/sp-spec create` to generate specifications
294
+ 4. Use `/sp-plan generate` to create implementation plans
295
+ 5. Use `/sp-task breakdown` to create task lists
329
296
  6. Use `/validate all` before implementation
330
297
 
331
298
  ## Project Structure
@@ -337,10 +304,10 @@ This project uses SpecPulse for specification-driven development.
337
304
  - `templates/` - Document templates
338
305
 
339
306
  ## Commands
340
- - `/pulse init <feature>` - Initialize new feature
341
- - `/spec create <description>` - Create specification
342
- - `/plan generate` - Generate implementation plan
343
- - `/task breakdown` - Create task list
307
+ - `/sp-pulse <feature>` - Initialize new feature
308
+ - `/sp-spec create <description>` - Create specification
309
+ - `/sp-plan generate` - Generate implementation plan
310
+ - `/sp-task breakdown` - Create task list
344
311
  - `/validate [component]` - Validate project
345
312
 
346
313
  Generated with SpecPulse v1.0.0
@@ -465,7 +432,7 @@ Generated with SpecPulse v1.0.0
465
432
  # Consolidate specs
466
433
  specs_dir = project_path / "specs"
467
434
  if specs_dir.exists():
468
- spec_count = len(list(specs_dir.glob("*/spec.md")))
435
+ spec_count = len(list(specs_dir.glob("*/spec-*.md")))
469
436
  sync_items.append(("Specifications", f"{spec_count} found"))
470
437
 
471
438
  # Check git status