specpulse 1.3.1__py3-none-any.whl → 1.3.3__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 +14 -3
- specpulse/resources/scripts/sp-pulse-execute.sh +3 -3
- specpulse/resources/scripts/sp-pulse-init.sh +3 -1
- specpulse/resources/scripts/sp-pulse-plan.sh +6 -17
- specpulse/resources/scripts/sp-pulse-spec.sh +6 -17
- specpulse/resources/scripts/sp-pulse-task.sh +9 -21
- {specpulse-1.3.1.dist-info → specpulse-1.3.3.dist-info}/METADATA +1 -1
- {specpulse-1.3.1.dist-info → specpulse-1.3.3.dist-info}/RECORD +13 -13
- {specpulse-1.3.1.dist-info → specpulse-1.3.3.dist-info}/WHEEL +0 -0
- {specpulse-1.3.1.dist-info → specpulse-1.3.3.dist-info}/entry_points.txt +0 -0
- {specpulse-1.3.1.dist-info → specpulse-1.3.3.dist-info}/licenses/LICENSE +0 -0
- {specpulse-1.3.1.dist-info → specpulse-1.3.3.dist-info}/top_level.txt +0 -0
specpulse/__init__.py
CHANGED
specpulse/cli/main.py
CHANGED
@@ -67,10 +67,11 @@ class SpecPulseCLI:
|
|
67
67
|
".gemini/commands",
|
68
68
|
"memory",
|
69
69
|
"specs",
|
70
|
-
"plans",
|
70
|
+
"plans",
|
71
71
|
"tasks",
|
72
72
|
"scripts",
|
73
|
-
"templates"
|
73
|
+
"templates",
|
74
|
+
"templates/decomposition"
|
74
75
|
]
|
75
76
|
|
76
77
|
# Create directories with progress bar
|
@@ -198,7 +199,17 @@ class SpecPulseCLI:
|
|
198
199
|
task_template = self.specpulse.get_task_template()
|
199
200
|
with open(templates_dir / "task.md", 'w', encoding='utf-8') as f:
|
200
201
|
f.write(task_template)
|
201
|
-
|
202
|
+
|
203
|
+
# Copy decomposition templates
|
204
|
+
decomp_dir = templates_dir / "decomposition"
|
205
|
+
decomp_dir.mkdir(parents=True, exist_ok=True)
|
206
|
+
|
207
|
+
resources_decomp_dir = self.specpulse.resources_dir / "templates" / "decomposition"
|
208
|
+
if resources_decomp_dir.exists():
|
209
|
+
for template_file in resources_decomp_dir.iterdir():
|
210
|
+
if template_file.is_file():
|
211
|
+
shutil.copy2(template_file, decomp_dir / template_file.name)
|
212
|
+
|
202
213
|
self.console.success("Created templates")
|
203
214
|
|
204
215
|
def _create_memory_files(self, project_path: Path):
|
@@ -5,9 +5,9 @@ set -euo pipefail # Exit on error, unset vars, pipe failures
|
|
5
5
|
|
6
6
|
# Configuration
|
7
7
|
SCRIPT_NAME="$(basename "$0")"
|
8
|
-
|
9
|
-
|
10
|
-
PROJECT_ROOT="$(cd "$
|
8
|
+
# Script is in project-root/scripts/, so parent dir is project root
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
10
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
11
11
|
|
12
12
|
# Function to log messages
|
13
13
|
log() {
|
@@ -5,7 +5,9 @@ set -euo pipefail # Exit on error, unset vars, pipe failures
|
|
5
5
|
|
6
6
|
# Configuration
|
7
7
|
SCRIPT_NAME="$(basename "$0")"
|
8
|
-
|
8
|
+
# Script is in project-root/scripts/, so parent dir is project root
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
10
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
9
11
|
|
10
12
|
# Function to log messages
|
11
13
|
log() {
|
@@ -5,9 +5,9 @@ set -euo pipefail # Exit on error, unset vars, pipe failures
|
|
5
5
|
|
6
6
|
# Configuration
|
7
7
|
SCRIPT_NAME="$(basename "$0")"
|
8
|
-
|
9
|
-
|
10
|
-
PROJECT_ROOT="$(cd "$
|
8
|
+
# Script is in project-root/scripts/, so parent dir is project root
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
10
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
11
11
|
|
12
12
|
# Function to log messages
|
13
13
|
log() {
|
@@ -27,6 +27,9 @@ fi
|
|
27
27
|
|
28
28
|
FEATURE_DIR="$1"
|
29
29
|
|
30
|
+
# Extract feature ID from directory name (e.g., "001-feature-name" -> "001")
|
31
|
+
FEATURE_ID=$(echo "$FEATURE_DIR" | grep -o '^[0-9]\{3\}' || echo "001")
|
32
|
+
|
30
33
|
# Sanitize feature directory
|
31
34
|
SANITIZED_DIR=$(echo "$FEATURE_DIR" | sed 's/[^a-zA-Z0-9_-]//g')
|
32
35
|
|
@@ -34,20 +37,6 @@ if [ -z "$SANITIZED_DIR" ]; then
|
|
34
37
|
error_exit "Invalid feature directory: '$FEATURE_DIR'"
|
35
38
|
fi
|
36
39
|
|
37
|
-
# Find feature directory if not provided
|
38
|
-
if [ -z "$FEATURE_DIR" ]; then
|
39
|
-
CONTEXT_FILE="$PROJECT_ROOT/memory/context.md"
|
40
|
-
if [ -f "$CONTEXT_FILE" ]; then
|
41
|
-
FEATURE_DIR=$(grep -A1 "Active Feature" "$CONTEXT_FILE" | tail -1 | cut -d: -f2 | xargs)
|
42
|
-
if [ -z "$FEATURE_DIR" ]; then
|
43
|
-
error_exit "No active feature found in context file"
|
44
|
-
fi
|
45
|
-
log "Using active feature from context: $FEATURE_DIR"
|
46
|
-
else
|
47
|
-
error_exit "No feature directory provided and no context file found"
|
48
|
-
fi
|
49
|
-
fi
|
50
|
-
|
51
40
|
PLAN_DIR="$PROJECT_ROOT/plans/${FEATURE_DIR}"
|
52
41
|
SPEC_DIR="$PROJECT_ROOT/specs/${FEATURE_DIR}"
|
53
42
|
TEMPLATE_FILE="$PROJECT_ROOT/templates/plan.md"
|
@@ -5,9 +5,9 @@ set -euo pipefail # Exit on error, unset vars, pipe failures
|
|
5
5
|
|
6
6
|
# Configuration
|
7
7
|
SCRIPT_NAME="$(basename "$0")"
|
8
|
-
|
9
|
-
|
10
|
-
PROJECT_ROOT="$(cd "$
|
8
|
+
# Script is in project-root/scripts/, so parent dir is project root
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
10
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
11
11
|
|
12
12
|
# Function to log messages
|
13
13
|
log() {
|
@@ -28,6 +28,9 @@ fi
|
|
28
28
|
FEATURE_DIR="$1"
|
29
29
|
SPEC_CONTENT="${2:-}"
|
30
30
|
|
31
|
+
# Extract feature ID from directory name (e.g., "001-feature-name" -> "001")
|
32
|
+
FEATURE_ID=$(echo "$FEATURE_DIR" | grep -o '^[0-9]\{3\}' || echo "001")
|
33
|
+
|
31
34
|
# Sanitize feature directory
|
32
35
|
SANITIZED_DIR=$(echo "$FEATURE_DIR" | sed 's/[^a-zA-Z0-9_-]//g')
|
33
36
|
|
@@ -35,20 +38,6 @@ if [ -z "$SANITIZED_DIR" ]; then
|
|
35
38
|
error_exit "Invalid feature directory: '$FEATURE_DIR'"
|
36
39
|
fi
|
37
40
|
|
38
|
-
# Find feature directory if not provided
|
39
|
-
if [ -z "$FEATURE_DIR" ]; then
|
40
|
-
CONTEXT_FILE="$PROJECT_ROOT/memory/context.md"
|
41
|
-
if [ -f "$CONTEXT_FILE" ]; then
|
42
|
-
FEATURE_DIR=$(grep -A1 "Active Feature" "$CONTEXT_FILE" | tail -1 | cut -d: -f2 | xargs)
|
43
|
-
if [ -z "$FEATURE_DIR" ]; then
|
44
|
-
error_exit "No active feature found in context file"
|
45
|
-
fi
|
46
|
-
log "Using active feature from context: $FEATURE_DIR"
|
47
|
-
else
|
48
|
-
error_exit "No feature directory provided and no context file found"
|
49
|
-
fi
|
50
|
-
fi
|
51
|
-
|
52
41
|
SPEC_DIR="$PROJECT_ROOT/specs/${FEATURE_DIR}"
|
53
42
|
TEMPLATE_FILE="$PROJECT_ROOT/templates/spec.md"
|
54
43
|
|
@@ -5,9 +5,9 @@ set -euo pipefail # Exit on error, unset vars, pipe failures
|
|
5
5
|
|
6
6
|
# Configuration
|
7
7
|
SCRIPT_NAME="$(basename "$0")"
|
8
|
-
|
9
|
-
|
10
|
-
PROJECT_ROOT="$(cd "$
|
8
|
+
# Script is in project-root/scripts/, so parent dir is project root
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
10
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
11
11
|
|
12
12
|
# Function to log messages
|
13
13
|
log() {
|
@@ -27,6 +27,9 @@ fi
|
|
27
27
|
|
28
28
|
FEATURE_DIR="$1"
|
29
29
|
|
30
|
+
# Extract feature ID from directory name (e.g., "001-feature-name" -> "001")
|
31
|
+
FEATURE_ID=$(echo "$FEATURE_DIR" | grep -o '^[0-9]\{3\}' || echo "001")
|
32
|
+
|
30
33
|
# Sanitize feature directory
|
31
34
|
SANITIZED_DIR=$(echo "$FEATURE_DIR" | sed 's/[^a-zA-Z0-9_-]//g')
|
32
35
|
|
@@ -34,20 +37,6 @@ if [ -z "$SANITIZED_DIR" ]; then
|
|
34
37
|
error_exit "Invalid feature directory: '$FEATURE_DIR'"
|
35
38
|
fi
|
36
39
|
|
37
|
-
# Find feature directory if not provided
|
38
|
-
if [ -z "$FEATURE_DIR" ]; then
|
39
|
-
CONTEXT_FILE="$PROJECT_ROOT/memory/context.md"
|
40
|
-
if [ -f "$CONTEXT_FILE" ]; then
|
41
|
-
FEATURE_DIR=$(grep -A1 "Active Feature" "$CONTEXT_FILE" | tail -1 | cut -d: -f2 | xargs)
|
42
|
-
if [ -z "$FEATURE_DIR" ]; then
|
43
|
-
error_exit "No active feature found in context file"
|
44
|
-
fi
|
45
|
-
log "Using active feature from context: $FEATURE_DIR"
|
46
|
-
else
|
47
|
-
error_exit "No feature directory provided and no context file found"
|
48
|
-
fi
|
49
|
-
fi
|
50
|
-
|
51
40
|
TASK_DIR="$PROJECT_ROOT/tasks/${FEATURE_DIR}"
|
52
41
|
PLAN_DIR="$PROJECT_ROOT/plans/${FEATURE_DIR}"
|
53
42
|
SPEC_DIR="$PROJECT_ROOT/specs/${FEATURE_DIR}"
|
@@ -132,10 +121,9 @@ if [ "$PLAN_GATE_STATUS" != "COMPLETED" ]; then
|
|
132
121
|
fi
|
133
122
|
|
134
123
|
# Calculate completion percentage
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
COMPLETION_PERCENTAGE=0
|
124
|
+
COMPLETION_PERCENTAGE=0
|
125
|
+
if [ "${TOTAL_TASKS:-0}" -gt 0 ] && [ "${COMPLETED_TASKS:-0}" -ge 0 ]; then
|
126
|
+
COMPLETION_PERCENTAGE=$(( (COMPLETED_TASKS * 100) / TOTAL_TASKS ))
|
139
127
|
fi
|
140
128
|
|
141
129
|
log "Task analysis completed - Total: $TOTAL_TASKS, Completed: $COMPLETED_TASKS ($COMPLETION_PERCENTAGE%), Parallel: $PARALLEL_TASKS"
|
@@ -1,6 +1,6 @@
|
|
1
|
-
specpulse/__init__.py,sha256=
|
1
|
+
specpulse/__init__.py,sha256=kYgVcf5KKzNWm3EZCK0jY8hX5ygDK6-KJBe3GTPWraI,270
|
2
2
|
specpulse/cli/__init__.py,sha256=DpX6FoRJtSNjudsmZ3mTih_RIaWyiIgxew4-f8mOmFY,70
|
3
|
-
specpulse/cli/main.py,sha256=
|
3
|
+
specpulse/cli/main.py,sha256=2VST6mGdplReNgfFJriULTQQ9mOAgUF3OlIb9OnCEXg,33333
|
4
4
|
specpulse/core/__init__.py,sha256=VKHGdPDM38QM9yDIq05jxol4q8WFlFAeltOzYLsPuto,132
|
5
5
|
specpulse/core/specpulse.py,sha256=glEYB-AiXN6wTKgVc3Yu0BHjUMByNBzcjMds7CA-FBo,32717
|
6
6
|
specpulse/core/validator.py,sha256=VsXU0qD8uUbZS3a8umqKpUx__sNlVRqTA7YTek9lezQ,18669
|
@@ -24,11 +24,11 @@ specpulse/resources/memory/constitution.md,sha256=34M0dMDzeE9JfAaNjK1S9uxVSD1I8K
|
|
24
24
|
specpulse/resources/memory/context.md,sha256=B-6m5f4WP8x_VXp0S9fbqm8tHH-2PZ7d9VWzW934hpo,1957
|
25
25
|
specpulse/resources/memory/decisions.md,sha256=ZwzVyOPB2mIzwveWpGmedej7ncI81GALg8WVy6AeZA4,686
|
26
26
|
specpulse/resources/scripts/sp-pulse-decompose.sh,sha256=EN8iF02pij4yse3of3fgO8ZI6YKFUV7Z7f4epEmaKXI,1431
|
27
|
-
specpulse/resources/scripts/sp-pulse-execute.sh,sha256
|
28
|
-
specpulse/resources/scripts/sp-pulse-init.sh,sha256=
|
29
|
-
specpulse/resources/scripts/sp-pulse-plan.sh,sha256=
|
30
|
-
specpulse/resources/scripts/sp-pulse-spec.sh,sha256=
|
31
|
-
specpulse/resources/scripts/sp-pulse-task.sh,sha256=
|
27
|
+
specpulse/resources/scripts/sp-pulse-execute.sh,sha256=696vgsj0NpV-Mr0KMyoJ63NkTqmS1tmQ1X4BzK0kQGA,5493
|
28
|
+
specpulse/resources/scripts/sp-pulse-init.sh,sha256=ECqLvgt6H-Wtp1hpKhkCKv_k70ZVfkmb13YyxT8Ni2M,3285
|
29
|
+
specpulse/resources/scripts/sp-pulse-plan.sh,sha256=KHSpm3K1qyryBaiz693ytHZU61YDRLN85Ew063KFOYQ,3911
|
30
|
+
specpulse/resources/scripts/sp-pulse-spec.sh,sha256=1QBHkJKpopH2Vn8fIGYSMuuiqMrtu3F1WZCyk5liN-Y,3906
|
31
|
+
specpulse/resources/scripts/sp-pulse-task.sh,sha256=E-2ld9TX4ipybtCEDH6rmcpcK_VOw3qoymBiVB51BiM,4801
|
32
32
|
specpulse/resources/templates/plan.md,sha256=KSCB5HvYRjqrM-VTe7nwJgR1MjGI748YE2BJtn41g4Q,6689
|
33
33
|
specpulse/resources/templates/spec.md,sha256=yVWn2LhZn0IMLJ9XuBjPWSWNS4GYJFowRrqRMT2wJf4,3748
|
34
34
|
specpulse/resources/templates/task.md,sha256=mGRlE4WD2E1Lh5gGr7kyOEmoXDbjLhUVMG9D7ZGCpmw,5357
|
@@ -40,9 +40,9 @@ specpulse/resources/templates/decomposition/service-plan.md,sha256=YCAu0-jRKNQ-G
|
|
40
40
|
specpulse/utils/__init__.py,sha256=VTGRDsVLl2JIXYyHB9Sidxj5acY_W-LJI2MMtY1pwb0,122
|
41
41
|
specpulse/utils/console.py,sha256=xn4Koc1_ph61bvBTlvPOwAbqZ5ac7TZ51xTWJbwG0sc,12973
|
42
42
|
specpulse/utils/git_utils.py,sha256=RzJBZoyWp5on1_wq2lY1bs__UJsGKSDpAUeDKFdRYlQ,6095
|
43
|
-
specpulse-1.3.
|
44
|
-
specpulse-1.3.
|
45
|
-
specpulse-1.3.
|
46
|
-
specpulse-1.3.
|
47
|
-
specpulse-1.3.
|
48
|
-
specpulse-1.3.
|
43
|
+
specpulse-1.3.3.dist-info/licenses/LICENSE,sha256=ImSFezK-Phy0oTBqZipcajsJfPZT8mmg8m3jkgNdNhA,1066
|
44
|
+
specpulse-1.3.3.dist-info/METADATA,sha256=KBo0aGm9qp4rz9yhIvSwiJrrT4KvcWkaiDlWaBmgwi0,21109
|
45
|
+
specpulse-1.3.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
46
|
+
specpulse-1.3.3.dist-info/entry_points.txt,sha256=GwMaCKWSCFZlJMrTNavEYrnREynIS6dM3B0ILxnaouA,83
|
47
|
+
specpulse-1.3.3.dist-info/top_level.txt,sha256=pEfkFil5xe38J00OHrBrJ07xpbm6bRnGhI8B07O9KeI,10
|
48
|
+
specpulse-1.3.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|