jettypod 4.1.2 → 4.1.4

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 (179) hide show
  1. package/.nvmrc +1 -0
  2. package/docs/COMPLETE-TESTING-STRATEGY.md +970 -0
  3. package/docs/DECISIONS.md +10 -12
  4. package/docs/NODE_VERSION.md +83 -0
  5. package/docs/TDD-INFRASTRUCTURE-STRATEGY.md +1374 -0
  6. package/docs/TESTING-FOR-NON-ENGINEERS.md +1588 -0
  7. package/docs/TESTING-STRATEGY-AUDIT.md +698 -0
  8. package/hooks/post-checkout +17 -0
  9. package/hooks/post-merge +17 -0
  10. package/hooks/pre-commit +30 -0
  11. package/jettypod.js +259 -120
  12. package/lib/coverage-tracker.js +218 -0
  13. package/lib/database.js +2 -0
  14. package/lib/db-export.js +192 -0
  15. package/lib/db-import.js +193 -0
  16. package/lib/external-transition-handler.js +32 -0
  17. package/lib/git-hook-helpers.js +174 -0
  18. package/lib/git-root.js +90 -0
  19. package/lib/infrastructure-chore-generator.js +45 -0
  20. package/lib/install-hooks.js +52 -0
  21. package/lib/jettypod-backup.js +238 -0
  22. package/lib/merge-lock.js +193 -0
  23. package/lib/migrations/012-add-worktree-path.js +38 -0
  24. package/lib/migrations/013-worktrees-table.js +86 -0
  25. package/lib/migrations/014-migrate-worktree-data.js +161 -0
  26. package/lib/migrations/015-merge-locks-table.js +67 -0
  27. package/lib/pattern-finder.js +152 -0
  28. package/lib/process-manager.js +140 -0
  29. package/lib/production-standards-reader.js +13 -2
  30. package/lib/production-standards-writer.js +85 -0
  31. package/lib/skills/feature-planning/dry-run-validator.js +135 -0
  32. package/lib/skills/feature-planning/validation-formatter.js +160 -0
  33. package/lib/smart-conflict-detection.js +168 -0
  34. package/lib/smart-fetch-rebase.js +614 -0
  35. package/lib/step-definition-parser.js +76 -0
  36. package/lib/unit-test-generator.js +232 -0
  37. package/lib/verification-command-generator.js +66 -0
  38. package/lib/worktree-diagnostics.js +413 -0
  39. package/lib/worktree-facade.js +174 -0
  40. package/lib/worktree-manager.js +636 -0
  41. package/lib/worktree-reconciler.js +429 -0
  42. package/package.json +30 -3
  43. package/skills-templates/external-transition/SKILL.md +34 -3
  44. package/skills-templates/feature-planning/SKILL.md +190 -24
  45. package/skills-templates/production-mode/SKILL.md +127 -9
  46. package/skills-templates/speed-mode/SKILL.md +454 -51
  47. package/skills-templates/stable-mode/SKILL.md +285 -76
  48. package/.claude/PROTECT_SKILLS.md +0 -28
  49. package/.claude/settings.json +0 -24
  50. package/.claude/settings.local.json +0 -16
  51. package/.claude/skills/epic-planning/SKILL.md +0 -297
  52. package/.claude/skills/external-transition/SKILL.md +0 -384
  53. package/.claude/skills/feature-planning/SKILL.md +0 -464
  54. package/.claude/skills/production-mode/SKILL.md +0 -369
  55. package/.claude/skills/speed-mode/SKILL.md +0 -481
  56. package/.claude/skills/stable-mode/SKILL.md +0 -713
  57. package/.claude/skills.backup-2025-11-10T23-33-09-368Z/epic-planning/SKILL.md +0 -297
  58. package/.claude/skills.backup-2025-11-10T23-33-09-368Z/feature-planning/SKILL.md +0 -464
  59. package/.claude/skills.backup-2025-11-10T23-33-09-368Z/speed-mode/SKILL.md +0 -467
  60. package/.claude/skills.backup-2025-11-10T23-33-09-368Z/stable-mode/SKILL.md +0 -673
  61. package/.claude/skills.backup-2025-11-11T16-15-10-070Z/epic-discover/SKILL.md +0 -297
  62. package/.claude/skills.backup-2025-11-11T16-42-43-212Z/epic-planning/SKILL.md +0 -297
  63. package/.claude/skills.backup-2025-11-11T16-42-43-212Z/feature-planning/SKILL.md +0 -464
  64. package/.claude/skills.backup-2025-11-11T16-42-43-212Z/speed-mode/SKILL.md +0 -467
  65. package/.claude/skills.backup-2025-11-11T16-42-43-212Z/stable-mode/SKILL.md +0 -673
  66. package/.claude/skills.backup-2025-11-11T17-06-09-783Z/epic-planning/SKILL.md +0 -297
  67. package/.claude/skills.backup-2025-11-11T17-06-09-783Z/feature-planning/SKILL.md +0 -464
  68. package/.claude/skills.backup-2025-11-11T17-06-09-783Z/speed-mode/SKILL.md +0 -467
  69. package/.claude/skills.backup-2025-11-11T17-06-09-783Z/stable-mode/SKILL.md +0 -673
  70. package/.devpod/current-work.json +0 -10
  71. package/.devpod/work.db +0 -0
  72. package/.github/workflows/test-safety.yml +0 -85
  73. package/.jettypod/config.json +0 -5
  74. package/.jettypod/current-work.json +0 -10
  75. package/.jettypod/hooks/README.md +0 -77
  76. package/.jettypod/hooks/protect-claude-md.js +0 -338
  77. package/.jettypod/test-work.db +0 -0
  78. package/.jettypod/work.db +0 -0
  79. package/CLAUDE.md +0 -49
  80. package/SPEED-STABLE-AUDIT.md +0 -853
  81. package/SYSTEM-BEHAVIOR.md +0 -2199
  82. package/TEST_SAFETY_AUDIT.md +0 -314
  83. package/TEST_SAFETY_IMPLEMENTATION.md +0 -97
  84. package/cucumber-report.html +0 -45
  85. package/dist/devpod-linux +0 -0
  86. package/dist/devpod-macos +0 -0
  87. package/dist/devpod-win.exe +0 -0
  88. package/docs/features/jettypod-standards-explained.md +0 -543
  89. package/docs/features/standards-inventory.md +0 -257
  90. package/features/auto-generate-production-chores.feature +0 -13
  91. package/features/backlog-command.feature +0 -26
  92. package/features/backlog-filtering-production.feature +0 -10
  93. package/features/claude-md-protection/steps.js +0 -498
  94. package/features/decisions/index.js +0 -490
  95. package/features/decisions/index.test.js +0 -208
  96. package/features/fix-text-wrapping.feature +0 -42
  97. package/features/git-hooks/git-hooks.feature +0 -30
  98. package/features/git-hooks/index.js +0 -93
  99. package/features/git-hooks/index.test.js +0 -137
  100. package/features/git-hooks/post-commit +0 -56
  101. package/features/git-hooks/post-merge +0 -47
  102. package/features/git-hooks/pre-commit +0 -28
  103. package/features/git-hooks/simple-steps.js +0 -53
  104. package/features/git-hooks/simple-test.feature +0 -10
  105. package/features/git-hooks/steps.js +0 -196
  106. package/features/jettypod-update-command.feature +0 -46
  107. package/features/mode-prompts/index.js +0 -95
  108. package/features/mode-prompts/simple-steps.js +0 -44
  109. package/features/mode-prompts/simple-test.feature +0 -9
  110. package/features/mode-prompts/validation.test.js +0 -120
  111. package/features/multiple-claude-instances.feature +0 -121
  112. package/features/production-mode-skill.feature +0 -121
  113. package/features/refactor-mode/steps.js +0 -217
  114. package/features/refactor-mode.feature +0 -49
  115. package/features/simplify-external-transition.feature +0 -166
  116. package/features/skills-update/index.test.js +0 -216
  117. package/features/step_definitions/backlog-command.steps.js +0 -37
  118. package/features/step_definitions/fix-text-wrapping.steps.js +0 -271
  119. package/features/step_definitions/multiple-claude-instances.steps.js +0 -621
  120. package/features/step_definitions/production-mode-skill.steps.js +0 -862
  121. package/features/step_definitions/simplify-external-transition.steps.js +0 -370
  122. package/features/step_definitions/terminal-logo.steps.js +0 -145
  123. package/features/step_definitions/update-command.steps.js +0 -183
  124. package/features/support/hooks.js +0 -9
  125. package/features/terminal-logo/index.js +0 -39
  126. package/features/terminal-logo/terminal-logo.feature +0 -30
  127. package/features/update-command/index.js +0 -181
  128. package/features/update-command/index.test.js +0 -225
  129. package/features/work-commands/bug-workflow-display.feature +0 -22
  130. package/features/work-commands/index.js +0 -498
  131. package/features/work-commands/simple-steps.js +0 -69
  132. package/features/work-commands/stable-tests.feature +0 -57
  133. package/features/work-commands/steps.js +0 -1174
  134. package/features/work-commands/validation.test.js +0 -88
  135. package/features/work-commands/work-commands.feature +0 -13
  136. package/features/work-tracking/discovery-validation.test.js +0 -228
  137. package/features/work-tracking/index.js +0 -1921
  138. package/features/work-tracking/mode-required.feature +0 -112
  139. package/features/work-tracking/phase-tracking.test.js +0 -482
  140. package/features/work-tracking/prototype-tracking.test.js +0 -485
  141. package/features/work-tracking/tree-view.test.js +0 -310
  142. package/features/work-tracking/work-set-mode.feature +0 -71
  143. package/features/work-tracking/work-start-mode.feature +0 -88
  144. package/full-test.txt +0 -0
  145. package/lib/bug-workflow.test.js +0 -177
  146. package/lib/claudemd.test.js +0 -195
  147. package/lib/config.test.js +0 -511
  148. package/lib/constants.test.js +0 -164
  149. package/lib/current-work.test.js +0 -146
  150. package/lib/database-project-config.test.js +0 -111
  151. package/lib/database.test.js +0 -106
  152. package/lib/decisions-generator.test.js +0 -457
  153. package/lib/decisions-helpers.test.js +0 -310
  154. package/lib/git-coordinator.js +0 -167
  155. package/lib/git.test.js +0 -145
  156. package/lib/migrations/002-default-work-item-modes.test.js +0 -351
  157. package/lib/production-chore-generator.test.js +0 -432
  158. package/lib/production-context-detector.test.js +0 -277
  159. package/lib/production-scenario-appender.test.js +0 -235
  160. package/lib/production-scenario-validator.test.js +0 -246
  161. package/lib/production-standards-reader.test.js +0 -270
  162. package/lib/project-state.test.js +0 -92
  163. package/lib/push-queue.js +0 -417
  164. package/lib/queue-processor.js +0 -74
  165. package/lib/test-helpers.js +0 -202
  166. package/lib/test-helpers.test.js +0 -255
  167. package/prototypes/2025-01-11-production-mode-autonomous.js +0 -119
  168. package/prototypes/2025-01-11-production-mode-collaborative.js +0 -166
  169. package/prototypes/2025-01-11-production-mode-guided.js +0 -217
  170. package/prototypes/2025-01-11-production-mode-smart-context.js +0 -347
  171. package/prototypes/2025-01-11-production-standards-example.md +0 -204
  172. package/prototypes/2025-11-10-backlog-filtering-tree-aware.js +0 -242
  173. package/prototypes/test/index.html +0 -1
  174. package/setup-dist-repo.sh +0 -68
  175. package/test-production-standards-engine.js +0 -130
  176. package/test-results.json +0 -2195
  177. package/test-safety-check.sh +0 -80
  178. package/work-item-tracking-plan.md +0 -199
  179. /package/{.jettypod/devpod.db → jettypod.db} +0 -0
@@ -1,88 +0,0 @@
1
- // Unit tests for work commands validation logic
2
- // These test the error handling and validation without full database integration
3
-
4
- const { VALID_STATUSES } = require('../../lib/constants');
5
-
6
- describe('Work Commands - Validation', () => {
7
- describe('startWork validation', () => {
8
- test('should validate work item ID is numeric', () => {
9
- const invalidIds = [null, undefined, 'abc', '', {}, []];
10
- invalidIds.forEach(id => {
11
- const isValid = !!(id && !isNaN(id) && id >= 1);
12
- expect(isValid).toBe(false);
13
- });
14
- });
15
-
16
- test('should validate work item ID is positive', () => {
17
- expect(!!(0 && !isNaN(0) && 0 >= 1)).toBe(false);
18
- expect(!!(-1 && !isNaN(-1) && -1 >= 1)).toBe(false);
19
- });
20
-
21
- test('should accept valid work item IDs', () => {
22
- const validIds = [1, 2, 100, 999];
23
- validIds.forEach(id => {
24
- const isValid = id && !isNaN(id) && id >= 1;
25
- expect(isValid).toBe(true);
26
- });
27
- });
28
- });
29
-
30
- describe('stopWork validation', () => {
31
- test('should validate status is in VALID_STATUSES', () => {
32
- const invalidStatuses = ['invalid', 'foo', '', null, undefined];
33
- invalidStatuses.forEach(status => {
34
- const isValid = !!(status && VALID_STATUSES.includes(status));
35
- expect(isValid).toBe(false);
36
- });
37
- });
38
-
39
- test('should accept valid statuses', () => {
40
- VALID_STATUSES.forEach(status => {
41
- const isValid = VALID_STATUSES.includes(status);
42
- expect(isValid).toBe(true);
43
- });
44
- });
45
-
46
- test('should accept null status (means no status change)', () => {
47
- const status = null;
48
- // Null is valid - means we're just stopping without changing status
49
- expect(status === null).toBe(true);
50
- });
51
- });
52
-
53
- describe('Path validation', () => {
54
- test('should check jettypod directory exists', () => {
55
- const fs = require('fs');
56
- const path = require('path');
57
-
58
- // In a non-initialized directory
59
- const nonExistentPath = '/nonexistent/path/.jettypod';
60
- expect(fs.existsSync(nonExistentPath)).toBe(false);
61
- });
62
-
63
- test('should check database file exists', () => {
64
- const fs = require('fs');
65
- const path = require('path');
66
-
67
- // In a non-initialized directory
68
- const nonExistentDb = '/nonexistent/path/.jettypod/work.db';
69
- expect(fs.existsSync(nonExistentDb)).toBe(false);
70
- });
71
- });
72
-
73
- describe('Status transition logic', () => {
74
- test('should change todo to in_progress', () => {
75
- const currentStatus = 'todo';
76
- const finalStatus = currentStatus === 'todo' ? 'in_progress' : currentStatus;
77
- expect(finalStatus).toBe('in_progress');
78
- });
79
-
80
- test('should preserve non-todo statuses', () => {
81
- const statuses = ['backlog', 'in_progress', 'blocked', 'done', 'cancelled'];
82
- statuses.forEach(status => {
83
- const finalStatus = status === 'todo' ? 'in_progress' : status;
84
- expect(finalStatus).toBe(status);
85
- });
86
- });
87
- });
88
- });
@@ -1,13 +0,0 @@
1
- Feature: Work Item Commands
2
- As a developer
3
- I want to start and stop work on items
4
- So that my current work is tracked automatically
5
-
6
- Scenario: Integration - work commands with existing work tracking
7
- Given I have initialized jettypod
8
- And I create an epic with id 1
9
- And I create a feature with id 2 under epic 1
10
- When I start work on item 2
11
- Then the current work file exists
12
- And the current work contains item 2
13
- And item 2 status is in_progress or backlog
@@ -1,228 +0,0 @@
1
- // Tests for work-tracking discovery validation
2
- // Ensures epics and features cannot be created during project discovery
3
-
4
- const { createTestEnvironment } = require('../../lib/test-helpers');
5
- const workTracking = require('./index');
6
- const config = require('../../lib/config');
7
-
8
- describe('Work Tracking - Discovery Validation', () => {
9
- let testEnv;
10
-
11
- beforeEach(() => {
12
- testEnv = createTestEnvironment();
13
- process.chdir(testEnv.testDir);
14
- });
15
-
16
- afterEach(() => {
17
- testEnv.cleanup();
18
- });
19
-
20
- describe('epic creation during discovery', () => {
21
- test('should block epic creation when project discovery in_progress', async () => {
22
- // Start project discovery
23
- config.update({
24
- project_discovery: {
25
- status: 'in_progress',
26
- prototypes: [],
27
- winner: null,
28
- rationale: null,
29
- started_date: new Date().toISOString(),
30
- completed_date: null
31
- }
32
- });
33
-
34
- await expect(workTracking.create('epic', 'Test Epic', 'Description'))
35
- .rejects.toThrow('Cannot create epics while project discovery is in progress');
36
- });
37
-
38
- test('should allow epic creation when discovery is not_started', async () => {
39
- const newId = await workTracking.create('epic', 'Test Epic', 'Description');
40
- expect(newId).toBeDefined();
41
- expect(typeof newId).toBe('number');
42
- expect(newId).toBeGreaterThan(0);
43
- });
44
-
45
- test('should allow epic creation when discovery is completed', async () => {
46
- // Complete discovery
47
- config.update({
48
- project_discovery: {
49
- status: 'completed',
50
- prototypes: ['proto1.js'],
51
- winner: 'proto1.js',
52
- rationale: 'Best approach',
53
- started_date: new Date().toISOString(),
54
- completed_date: new Date().toISOString()
55
- }
56
- });
57
-
58
- const newId = await workTracking.create('epic', 'Test Epic', 'Description');
59
- expect(newId).toBeDefined();
60
- expect(typeof newId).toBe('number');
61
- });
62
- });
63
-
64
- describe('feature creation during discovery', () => {
65
- test('should block feature creation when project discovery in_progress', async () => {
66
- // Start project discovery
67
- config.update({
68
- project_discovery: {
69
- status: 'in_progress',
70
- prototypes: [],
71
- winner: null,
72
- rationale: null,
73
- started_date: new Date().toISOString(),
74
- completed_date: null
75
- }
76
- });
77
-
78
- await expect(workTracking.create('feature', 'Test Feature', 'Description'))
79
- .rejects.toThrow('Cannot create features while project discovery is in progress');
80
- });
81
-
82
- test('should allow feature creation when discovery is not_started', async () => {
83
- const newId = await workTracking.create('feature', 'Test Feature', 'Description');
84
- expect(newId).toBeDefined();
85
- expect(typeof newId).toBe('number');
86
- });
87
-
88
- test('should allow feature creation when discovery is completed', async () => {
89
- // Complete discovery
90
- config.update({
91
- project_discovery: {
92
- status: 'completed',
93
- prototypes: ['proto1.js'],
94
- winner: 'proto1.js',
95
- rationale: 'Best approach',
96
- started_date: new Date().toISOString(),
97
- completed_date: new Date().toISOString()
98
- }
99
- });
100
-
101
- const newId = await workTracking.create('feature', 'Test Feature', 'Description');
102
- expect(newId).toBeDefined();
103
- expect(typeof newId).toBe('number');
104
- });
105
- });
106
-
107
- describe('chore creation during discovery', () => {
108
- test('should allow chore creation when project discovery in_progress', async () => {
109
- // Start project discovery
110
- config.update({
111
- project_discovery: {
112
- status: 'in_progress',
113
- prototypes: [],
114
- winner: null,
115
- rationale: null,
116
- started_date: new Date().toISOString(),
117
- completed_date: null
118
- }
119
- });
120
-
121
- const newId = await workTracking.create('chore', 'Test Chore', 'Description');
122
- expect(newId).toBeDefined();
123
- expect(typeof newId).toBe('number');
124
- });
125
-
126
- test('should allow chore creation in all discovery states', async () => {
127
- // not_started (default)
128
- let newId = await workTracking.create('chore', 'Chore 1', 'Description');
129
- expect(newId).toBeDefined();
130
- expect(typeof newId).toBe('number');
131
-
132
- // in_progress
133
- config.update({
134
- project_discovery: {
135
- status: 'in_progress',
136
- prototypes: [],
137
- winner: null,
138
- rationale: null,
139
- started_date: new Date().toISOString(),
140
- completed_date: null
141
- }
142
- });
143
- newId = await workTracking.create('chore', 'Chore 2', 'Description');
144
- expect(newId).toBeDefined();
145
- expect(typeof newId).toBe('number');
146
-
147
- // completed
148
- config.update({
149
- project_discovery: {
150
- status: 'completed',
151
- prototypes: ['proto1.js'],
152
- winner: 'proto1.js',
153
- rationale: 'Best approach',
154
- started_date: new Date().toISOString(),
155
- completed_date: new Date().toISOString()
156
- }
157
- });
158
- newId = await workTracking.create('chore', 'Chore 3', 'Description');
159
- expect(newId).toBeDefined();
160
- expect(typeof newId).toBe('number');
161
- });
162
- });
163
-
164
- describe('bug creation during discovery', () => {
165
- test('should allow bug creation when project discovery in_progress', async () => {
166
- // Start project discovery
167
- config.update({
168
- project_discovery: {
169
- status: 'in_progress',
170
- prototypes: [],
171
- winner: null,
172
- rationale: null,
173
- started_date: new Date().toISOString(),
174
- completed_date: null
175
- }
176
- });
177
-
178
- const newId = await workTracking.create('bug', 'Test Bug', 'Description');
179
- expect(newId).toBeDefined();
180
- expect(typeof newId).toBe('number');
181
- });
182
- });
183
-
184
- describe('error messages', () => {
185
- test('should provide helpful error message for epic creation', async () => {
186
- config.update({
187
- project_discovery: {
188
- status: 'in_progress',
189
- prototypes: [],
190
- winner: null,
191
- rationale: null,
192
- started_date: new Date().toISOString(),
193
- completed_date: null
194
- }
195
- });
196
-
197
- try {
198
- await workTracking.create('epic', 'Test Epic', 'Description');
199
- } catch (error) {
200
- expect(error.message).toContain('Cannot create epics');
201
- expect(error.message).toContain('discovery is in progress');
202
- expect(error.message).toContain('jettypod project discover complete');
203
- expect(error.message).toContain('Claude Code');
204
- }
205
- });
206
-
207
- test('should provide helpful error message for feature creation', async () => {
208
- config.update({
209
- project_discovery: {
210
- status: 'in_progress',
211
- prototypes: [],
212
- winner: null,
213
- rationale: null,
214
- started_date: new Date().toISOString(),
215
- completed_date: null
216
- }
217
- });
218
-
219
- try {
220
- await workTracking.create('feature', 'Test Feature', 'Description');
221
- } catch (error) {
222
- expect(error.message).toContain('Cannot create features');
223
- expect(error.message).toContain('discovery is in progress');
224
- expect(error.message).toContain('jettypod project discover complete');
225
- }
226
- });
227
- });
228
- });