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.
- specpulse/__init__.py +1 -1
- specpulse/cli/main.py +60 -93
- specpulse/core/specpulse.py +1110 -1099
- specpulse/resources/commands/claude/sp-continue.md +203 -0
- specpulse/resources/commands/claude/{plan.md → sp-plan.md} +53 -38
- specpulse/resources/commands/claude/sp-pulse.md +142 -0
- specpulse/resources/commands/claude/{spec.md → sp-spec.md} +36 -23
- specpulse/resources/commands/claude/sp-status.md +170 -0
- specpulse/resources/commands/claude/{task.md → sp-task.md} +68 -48
- specpulse/resources/commands/gemini/sp-continue.toml +56 -0
- specpulse/resources/commands/gemini/sp-plan.toml +68 -0
- specpulse/resources/commands/gemini/{pulse.toml → sp-pulse.toml} +12 -6
- specpulse/resources/commands/gemini/sp-spec.toml +54 -0
- specpulse/resources/commands/gemini/sp-status.toml +61 -0
- specpulse/resources/commands/gemini/sp-task.toml +79 -0
- specpulse/resources/memory/constitution.md +5 -5
- specpulse/resources/memory/context.md +12 -1
- specpulse/resources/scripts/{pulse-init.py → sp-pulse-init.py} +6 -6
- specpulse/resources/scripts/{pulse-init.sh → sp-pulse-init.sh} +95 -95
- specpulse/resources/scripts/{pulse-plan.py → sp-pulse-plan.py} +32 -7
- specpulse/resources/scripts/{pulse-plan.sh → sp-pulse-plan.sh} +136 -126
- specpulse/resources/scripts/{pulse-spec.py → sp-pulse-spec.py} +26 -6
- specpulse/resources/scripts/{pulse-spec.sh → sp-pulse-spec.sh} +126 -103
- specpulse/resources/scripts/{pulse-task.py → sp-pulse-task.py} +42 -6
- specpulse/resources/scripts/{pulse-task.sh → sp-pulse-task.sh} +32 -16
- specpulse/resources/templates/plan.md +206 -206
- specpulse/resources/templates/spec.md +125 -125
- specpulse/resources/templates/task.md +164 -163
- {specpulse-1.0.5.dist-info → specpulse-1.1.0.dist-info}/METADATA +36 -45
- specpulse-1.1.0.dist-info/RECORD +41 -0
- specpulse/resources/commands/claude/pulse.md +0 -91
- specpulse/resources/commands/gemini/plan.toml +0 -59
- specpulse/resources/commands/gemini/spec.toml +0 -45
- specpulse/resources/commands/gemini/task.toml +0 -69
- specpulse/resources/scripts/pulse-init.ps1 +0 -186
- specpulse/resources/scripts/pulse-plan.ps1 +0 -251
- specpulse/resources/scripts/pulse-spec.ps1 +0 -185
- specpulse/resources/scripts/pulse-task.ps1 +0 -263
- specpulse-1.0.5.dist-info/RECORD +0 -41
- {specpulse-1.0.5.dist-info → specpulse-1.1.0.dist-info}/WHEEL +0 -0
- {specpulse-1.0.5.dist-info → specpulse-1.1.0.dist-info}/entry_points.txt +0 -0
- {specpulse-1.0.5.dist-info → specpulse-1.1.0.dist-info}/licenses/LICENSE +0 -0
- {specpulse-1.0.5.dist-info → specpulse-1.1.0.dist-info}/top_level.txt +0 -0
specpulse/__init__.py
CHANGED
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
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
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
|
-
#
|
264
|
-
|
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
|
-
#
|
277
|
-
|
278
|
-
|
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
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
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
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
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
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
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
|
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
|
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
|
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
|