jettypod 4.4.50 → 4.4.51

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.
package/jettypod.js CHANGED
@@ -2686,7 +2686,7 @@ Quick commands:
2686
2686
  const db = getDb();
2687
2687
  await waitForMigrations();
2688
2688
 
2689
- // Define gate requirements for each skill
2689
+ // Define gate requirements for each skill (also serves as known skills list)
2690
2690
  const gateRequirements = {
2691
2691
  'speed-mode': ['feature_planning_complete'],
2692
2692
  'stable-mode': ['speed_mode_complete'],
@@ -2695,7 +2695,49 @@ Quick commands:
2695
2695
  'epic-planning': []
2696
2696
  };
2697
2697
 
2698
- const requiredGates = gateRequirements[skillName] || [];
2698
+ // Validate skill name
2699
+ if (!gateRequirements.hasOwnProperty(skillName)) {
2700
+ console.log(`Unknown skill: ${skillName}`);
2701
+ console.log('');
2702
+ console.log('Valid skills: ' + Object.keys(gateRequirements).join(', '));
2703
+ process.exit(1);
2704
+ }
2705
+
2706
+ // Validate work item exists
2707
+ const workItem = await new Promise((resolve, reject) => {
2708
+ db.get(
2709
+ `SELECT id, title FROM work_items WHERE id = ?`,
2710
+ [workItemId],
2711
+ (err, row) => {
2712
+ if (err) reject(err);
2713
+ else resolve(row);
2714
+ }
2715
+ );
2716
+ });
2717
+
2718
+ if (!workItem) {
2719
+ console.log(`Work item not found: #${workItemId}`);
2720
+ process.exit(1);
2721
+ }
2722
+
2723
+ // Check for existing in-progress execution of this skill
2724
+ const existingExecution = await new Promise((resolve, reject) => {
2725
+ db.get(
2726
+ `SELECT id FROM skill_executions WHERE work_item_id = ? AND skill_name = ? AND status = 'in_progress'`,
2727
+ [workItemId, skillName],
2728
+ (err, row) => {
2729
+ if (err) reject(err);
2730
+ else resolve(row);
2731
+ }
2732
+ );
2733
+ });
2734
+
2735
+ if (existingExecution) {
2736
+ console.log(`${skillName} is already in progress for #${workItemId}`);
2737
+ process.exit(1);
2738
+ }
2739
+
2740
+ const requiredGates = gateRequirements[skillName];
2699
2741
 
2700
2742
  // Check prerequisite gates
2701
2743
  const passedGates = await new Promise((resolve, reject) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jettypod",
3
- "version": "4.4.50",
3
+ "version": "4.4.51",
4
4
  "description": "AI-powered development workflow manager with TDD, BDD, and automatic test generation",
5
5
  "main": "jettypod.js",
6
6
  "bin": {
@@ -229,6 +229,14 @@ Example:
229
229
 
230
230
  #### Step 6B: Propose BDD Scenarios (DO NOT WRITE YET)
231
231
 
232
+ **🚫 FORBIDDEN: Writing Files at This Step**
233
+ ```
234
+ ❌ Write tool to features/*.feature
235
+ ❌ Write tool to features/step_definitions/*.js
236
+ ❌ Any file creation on main branch
237
+ ```
238
+ **Files are written in Step 8D** inside an isolated worktree. At this step, you are ONLY displaying proposed scenarios to the user for confirmation. The worktree doesn't exist yet.
239
+
232
240
  **CRITICAL:** Do NOT write files yet. Display the proposed scenarios for user confirmation. Files will be written in Step 8D inside an isolated worktree.
233
241
 
234
242
  **Feature slug:** Derive `FEATURE_SLUG` from the feature title: