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.
- package/.nvmrc +1 -0
- package/docs/COMPLETE-TESTING-STRATEGY.md +970 -0
- package/docs/DECISIONS.md +10 -12
- package/docs/NODE_VERSION.md +83 -0
- package/docs/TDD-INFRASTRUCTURE-STRATEGY.md +1374 -0
- package/docs/TESTING-FOR-NON-ENGINEERS.md +1588 -0
- package/docs/TESTING-STRATEGY-AUDIT.md +698 -0
- package/hooks/post-checkout +17 -0
- package/hooks/post-merge +17 -0
- package/hooks/pre-commit +30 -0
- package/jettypod.js +259 -120
- package/lib/coverage-tracker.js +218 -0
- package/lib/database.js +2 -0
- package/lib/db-export.js +192 -0
- package/lib/db-import.js +193 -0
- package/lib/external-transition-handler.js +32 -0
- package/lib/git-hook-helpers.js +174 -0
- package/lib/git-root.js +90 -0
- package/lib/infrastructure-chore-generator.js +45 -0
- package/lib/install-hooks.js +52 -0
- package/lib/jettypod-backup.js +238 -0
- package/lib/merge-lock.js +193 -0
- package/lib/migrations/012-add-worktree-path.js +38 -0
- package/lib/migrations/013-worktrees-table.js +86 -0
- package/lib/migrations/014-migrate-worktree-data.js +161 -0
- package/lib/migrations/015-merge-locks-table.js +67 -0
- package/lib/pattern-finder.js +152 -0
- package/lib/process-manager.js +140 -0
- package/lib/production-standards-reader.js +13 -2
- package/lib/production-standards-writer.js +85 -0
- package/lib/skills/feature-planning/dry-run-validator.js +135 -0
- package/lib/skills/feature-planning/validation-formatter.js +160 -0
- package/lib/smart-conflict-detection.js +168 -0
- package/lib/smart-fetch-rebase.js +614 -0
- package/lib/step-definition-parser.js +76 -0
- package/lib/unit-test-generator.js +232 -0
- package/lib/verification-command-generator.js +66 -0
- package/lib/worktree-diagnostics.js +413 -0
- package/lib/worktree-facade.js +174 -0
- package/lib/worktree-manager.js +636 -0
- package/lib/worktree-reconciler.js +429 -0
- package/package.json +30 -3
- package/skills-templates/external-transition/SKILL.md +34 -3
- package/skills-templates/feature-planning/SKILL.md +190 -24
- package/skills-templates/production-mode/SKILL.md +127 -9
- package/skills-templates/speed-mode/SKILL.md +454 -51
- package/skills-templates/stable-mode/SKILL.md +285 -76
- package/.claude/PROTECT_SKILLS.md +0 -28
- package/.claude/settings.json +0 -24
- package/.claude/settings.local.json +0 -16
- package/.claude/skills/epic-planning/SKILL.md +0 -297
- package/.claude/skills/external-transition/SKILL.md +0 -384
- package/.claude/skills/feature-planning/SKILL.md +0 -464
- package/.claude/skills/production-mode/SKILL.md +0 -369
- package/.claude/skills/speed-mode/SKILL.md +0 -481
- package/.claude/skills/stable-mode/SKILL.md +0 -713
- package/.claude/skills.backup-2025-11-10T23-33-09-368Z/epic-planning/SKILL.md +0 -297
- package/.claude/skills.backup-2025-11-10T23-33-09-368Z/feature-planning/SKILL.md +0 -464
- package/.claude/skills.backup-2025-11-10T23-33-09-368Z/speed-mode/SKILL.md +0 -467
- package/.claude/skills.backup-2025-11-10T23-33-09-368Z/stable-mode/SKILL.md +0 -673
- package/.claude/skills.backup-2025-11-11T16-15-10-070Z/epic-discover/SKILL.md +0 -297
- package/.claude/skills.backup-2025-11-11T16-42-43-212Z/epic-planning/SKILL.md +0 -297
- package/.claude/skills.backup-2025-11-11T16-42-43-212Z/feature-planning/SKILL.md +0 -464
- package/.claude/skills.backup-2025-11-11T16-42-43-212Z/speed-mode/SKILL.md +0 -467
- package/.claude/skills.backup-2025-11-11T16-42-43-212Z/stable-mode/SKILL.md +0 -673
- package/.claude/skills.backup-2025-11-11T17-06-09-783Z/epic-planning/SKILL.md +0 -297
- package/.claude/skills.backup-2025-11-11T17-06-09-783Z/feature-planning/SKILL.md +0 -464
- package/.claude/skills.backup-2025-11-11T17-06-09-783Z/speed-mode/SKILL.md +0 -467
- package/.claude/skills.backup-2025-11-11T17-06-09-783Z/stable-mode/SKILL.md +0 -673
- package/.devpod/current-work.json +0 -10
- package/.devpod/work.db +0 -0
- package/.github/workflows/test-safety.yml +0 -85
- package/.jettypod/config.json +0 -5
- package/.jettypod/current-work.json +0 -10
- package/.jettypod/hooks/README.md +0 -77
- package/.jettypod/hooks/protect-claude-md.js +0 -338
- package/.jettypod/test-work.db +0 -0
- package/.jettypod/work.db +0 -0
- package/CLAUDE.md +0 -49
- package/SPEED-STABLE-AUDIT.md +0 -853
- package/SYSTEM-BEHAVIOR.md +0 -2199
- package/TEST_SAFETY_AUDIT.md +0 -314
- package/TEST_SAFETY_IMPLEMENTATION.md +0 -97
- package/cucumber-report.html +0 -45
- package/dist/devpod-linux +0 -0
- package/dist/devpod-macos +0 -0
- package/dist/devpod-win.exe +0 -0
- package/docs/features/jettypod-standards-explained.md +0 -543
- package/docs/features/standards-inventory.md +0 -257
- package/features/auto-generate-production-chores.feature +0 -13
- package/features/backlog-command.feature +0 -26
- package/features/backlog-filtering-production.feature +0 -10
- package/features/claude-md-protection/steps.js +0 -498
- package/features/decisions/index.js +0 -490
- package/features/decisions/index.test.js +0 -208
- package/features/fix-text-wrapping.feature +0 -42
- package/features/git-hooks/git-hooks.feature +0 -30
- package/features/git-hooks/index.js +0 -93
- package/features/git-hooks/index.test.js +0 -137
- package/features/git-hooks/post-commit +0 -56
- package/features/git-hooks/post-merge +0 -47
- package/features/git-hooks/pre-commit +0 -28
- package/features/git-hooks/simple-steps.js +0 -53
- package/features/git-hooks/simple-test.feature +0 -10
- package/features/git-hooks/steps.js +0 -196
- package/features/jettypod-update-command.feature +0 -46
- package/features/mode-prompts/index.js +0 -95
- package/features/mode-prompts/simple-steps.js +0 -44
- package/features/mode-prompts/simple-test.feature +0 -9
- package/features/mode-prompts/validation.test.js +0 -120
- package/features/multiple-claude-instances.feature +0 -121
- package/features/production-mode-skill.feature +0 -121
- package/features/refactor-mode/steps.js +0 -217
- package/features/refactor-mode.feature +0 -49
- package/features/simplify-external-transition.feature +0 -166
- package/features/skills-update/index.test.js +0 -216
- package/features/step_definitions/backlog-command.steps.js +0 -37
- package/features/step_definitions/fix-text-wrapping.steps.js +0 -271
- package/features/step_definitions/multiple-claude-instances.steps.js +0 -621
- package/features/step_definitions/production-mode-skill.steps.js +0 -862
- package/features/step_definitions/simplify-external-transition.steps.js +0 -370
- package/features/step_definitions/terminal-logo.steps.js +0 -145
- package/features/step_definitions/update-command.steps.js +0 -183
- package/features/support/hooks.js +0 -9
- package/features/terminal-logo/index.js +0 -39
- package/features/terminal-logo/terminal-logo.feature +0 -30
- package/features/update-command/index.js +0 -181
- package/features/update-command/index.test.js +0 -225
- package/features/work-commands/bug-workflow-display.feature +0 -22
- package/features/work-commands/index.js +0 -498
- package/features/work-commands/simple-steps.js +0 -69
- package/features/work-commands/stable-tests.feature +0 -57
- package/features/work-commands/steps.js +0 -1174
- package/features/work-commands/validation.test.js +0 -88
- package/features/work-commands/work-commands.feature +0 -13
- package/features/work-tracking/discovery-validation.test.js +0 -228
- package/features/work-tracking/index.js +0 -1921
- package/features/work-tracking/mode-required.feature +0 -112
- package/features/work-tracking/phase-tracking.test.js +0 -482
- package/features/work-tracking/prototype-tracking.test.js +0 -485
- package/features/work-tracking/tree-view.test.js +0 -310
- package/features/work-tracking/work-set-mode.feature +0 -71
- package/features/work-tracking/work-start-mode.feature +0 -88
- package/full-test.txt +0 -0
- package/lib/bug-workflow.test.js +0 -177
- package/lib/claudemd.test.js +0 -195
- package/lib/config.test.js +0 -511
- package/lib/constants.test.js +0 -164
- package/lib/current-work.test.js +0 -146
- package/lib/database-project-config.test.js +0 -111
- package/lib/database.test.js +0 -106
- package/lib/decisions-generator.test.js +0 -457
- package/lib/decisions-helpers.test.js +0 -310
- package/lib/git-coordinator.js +0 -167
- package/lib/git.test.js +0 -145
- package/lib/migrations/002-default-work-item-modes.test.js +0 -351
- package/lib/production-chore-generator.test.js +0 -432
- package/lib/production-context-detector.test.js +0 -277
- package/lib/production-scenario-appender.test.js +0 -235
- package/lib/production-scenario-validator.test.js +0 -246
- package/lib/production-standards-reader.test.js +0 -270
- package/lib/project-state.test.js +0 -92
- package/lib/push-queue.js +0 -417
- package/lib/queue-processor.js +0 -74
- package/lib/test-helpers.js +0 -202
- package/lib/test-helpers.test.js +0 -255
- package/prototypes/2025-01-11-production-mode-autonomous.js +0 -119
- package/prototypes/2025-01-11-production-mode-collaborative.js +0 -166
- package/prototypes/2025-01-11-production-mode-guided.js +0 -217
- package/prototypes/2025-01-11-production-mode-smart-context.js +0 -347
- package/prototypes/2025-01-11-production-standards-example.md +0 -204
- package/prototypes/2025-11-10-backlog-filtering-tree-aware.js +0 -242
- package/prototypes/test/index.html +0 -1
- package/setup-dist-repo.sh +0 -68
- package/test-production-standards-engine.js +0 -130
- package/test-results.json +0 -2195
- package/test-safety-check.sh +0 -80
- package/work-item-tracking-plan.md +0 -199
- /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
|
-
});
|