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
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Conflict Detection
|
|
3
|
+
*
|
|
4
|
+
* Distinguishes true git conflicts from clean merges with uncommitted changes
|
|
5
|
+
* using git status --porcelain to detect conflict markers.
|
|
6
|
+
*
|
|
7
|
+
* Key principle: UU status indicates unmerged/both modified = true conflict
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const { execSync } = require('child_process');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Validate that repoPath is a valid git repository
|
|
16
|
+
* @param {string} repoPath - Path to validate
|
|
17
|
+
* @throws {Error} If path is invalid or not a git repository
|
|
18
|
+
*/
|
|
19
|
+
function validateRepoPath(repoPath) {
|
|
20
|
+
if (!repoPath || typeof repoPath !== 'string') {
|
|
21
|
+
throw new Error('repoPath is required and must be a string');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Check if path exists
|
|
25
|
+
if (!fs.existsSync(repoPath)) {
|
|
26
|
+
throw new Error(`Repository path does not exist: ${repoPath}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Check if path is a directory
|
|
30
|
+
const stats = fs.statSync(repoPath);
|
|
31
|
+
if (!stats.isDirectory()) {
|
|
32
|
+
throw new Error(`Repository path is not a directory: ${repoPath}`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Check if .git directory exists (handles both normal repos and worktrees)
|
|
36
|
+
const gitDir = path.join(repoPath, '.git');
|
|
37
|
+
if (!fs.existsSync(gitDir)) {
|
|
38
|
+
throw new Error(`Not a git repository (missing .git): ${repoPath}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Classify error types for better error handling
|
|
44
|
+
* @param {Error} err - Error from git command
|
|
45
|
+
* @returns {Object} { isFatal: boolean, category: string, message: string }
|
|
46
|
+
*/
|
|
47
|
+
function classifyGitError(err) {
|
|
48
|
+
const errorMsg = err.message || '';
|
|
49
|
+
const stderr = err.stderr ? err.stderr.toString() : '';
|
|
50
|
+
const fullError = `${errorMsg} ${stderr}`.toLowerCase();
|
|
51
|
+
|
|
52
|
+
// Fatal errors that should stop execution
|
|
53
|
+
if (fullError.includes('not a git repository') ||
|
|
54
|
+
fullError.includes('no such file or directory')) {
|
|
55
|
+
return {
|
|
56
|
+
isFatal: true,
|
|
57
|
+
category: 'INVALID_REPO',
|
|
58
|
+
message: 'Invalid or missing git repository'
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Detached HEAD state - recoverable but needs special handling
|
|
63
|
+
if (fullError.includes('detached head') ||
|
|
64
|
+
fullError.includes('not currently on any branch')) {
|
|
65
|
+
return {
|
|
66
|
+
isFatal: false,
|
|
67
|
+
category: 'DETACHED_HEAD',
|
|
68
|
+
message: 'Repository is in detached HEAD state'
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Permission errors - fatal
|
|
73
|
+
if (fullError.includes('permission denied') ||
|
|
74
|
+
fullError.includes('eacces')) {
|
|
75
|
+
return {
|
|
76
|
+
isFatal: true,
|
|
77
|
+
category: 'PERMISSION_DENIED',
|
|
78
|
+
message: 'Permission denied accessing repository'
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Default to recoverable
|
|
83
|
+
return {
|
|
84
|
+
isFatal: false,
|
|
85
|
+
category: 'UNKNOWN',
|
|
86
|
+
message: errorMsg || 'Unknown git error'
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Check if git merge has true conflicts or just uncommitted changes
|
|
92
|
+
*
|
|
93
|
+
* Uses git status --porcelain to detect conflict markers (UU status).
|
|
94
|
+
* This allows us to distinguish between:
|
|
95
|
+
* - True conflicts: Files with UU status (both sides modified, needs manual resolution)
|
|
96
|
+
* - Clean merge: Files with M/A/D status (uncommitted changes, safe to auto-commit)
|
|
97
|
+
*
|
|
98
|
+
* @param {string} repoPath - Path to git repository
|
|
99
|
+
* @returns {Object} { hasConflicts: boolean, conflictFiles: string[], status: string, error: Object|null }
|
|
100
|
+
* @throws {Error} Only for fatal errors (invalid repo, permission denied)
|
|
101
|
+
*/
|
|
102
|
+
function checkForConflicts(repoPath) {
|
|
103
|
+
// Validate input
|
|
104
|
+
try {
|
|
105
|
+
validateRepoPath(repoPath);
|
|
106
|
+
} catch (validationErr) {
|
|
107
|
+
// Validation errors are always fatal
|
|
108
|
+
throw validationErr;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
// Run git status --porcelain to get machine-readable status
|
|
113
|
+
const status = execSync('git status --porcelain', {
|
|
114
|
+
cwd: repoPath,
|
|
115
|
+
encoding: 'utf8',
|
|
116
|
+
stdio: ['pipe', 'pipe', 'pipe'] // Capture stderr
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// Parse for conflict markers
|
|
120
|
+
// Git status codes for conflicts (X Y filename):
|
|
121
|
+
// DD - both deleted
|
|
122
|
+
// AU - added by us
|
|
123
|
+
// UD - deleted by them
|
|
124
|
+
// UA - added by them
|
|
125
|
+
// DU - deleted by us
|
|
126
|
+
// AA - both added
|
|
127
|
+
// UU - both modified
|
|
128
|
+
const conflictLines = status.split('\n').filter(line => {
|
|
129
|
+
const code = line.substring(0, 2);
|
|
130
|
+
return code === 'DD' || code === 'AU' || code === 'UD' ||
|
|
131
|
+
code === 'UA' || code === 'DU' || code === 'AA' || code === 'UU';
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// Extract file paths (skip the 'UU ' prefix)
|
|
135
|
+
const conflictFiles = conflictLines.map(line => line.substring(3));
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
hasConflicts: conflictLines.length > 0,
|
|
139
|
+
conflictFiles: conflictFiles,
|
|
140
|
+
status: status,
|
|
141
|
+
error: null
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
} catch (err) {
|
|
145
|
+
const errorInfo = classifyGitError(err);
|
|
146
|
+
|
|
147
|
+
// Fatal errors should throw
|
|
148
|
+
if (errorInfo.isFatal) {
|
|
149
|
+
throw new Error(`${errorInfo.category}: ${errorInfo.message}`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Recoverable errors return with error info
|
|
153
|
+
return {
|
|
154
|
+
hasConflicts: false,
|
|
155
|
+
conflictFiles: [],
|
|
156
|
+
status: '',
|
|
157
|
+
error: {
|
|
158
|
+
category: errorInfo.category,
|
|
159
|
+
message: errorInfo.message,
|
|
160
|
+
recoverable: true
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
module.exports = {
|
|
167
|
+
checkForConflicts
|
|
168
|
+
};
|