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
@@ -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
+ };