jettypod 4.4.19 → 4.4.21

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
@@ -674,7 +674,7 @@ async function generateClaude(options = {}) {
674
674
 
675
675
  // Initialize project (used by both 'jettypod init' and 'jettypod' with no args)
676
676
  async function initializeProject() {
677
- const { showLogo } = require('./features/terminal-logo');
677
+ const { showLogo } = require('./lib/terminal-logo');
678
678
  showLogo();
679
679
 
680
680
  if (!fs.existsSync('.jettypod')) {
@@ -0,0 +1,39 @@
1
+ // Terminal Logo - Unicode Box Drawing + Gradients
2
+ // Zero dependencies, pure ANSI escape codes
3
+
4
+ const colors = {
5
+ cyan1: '\x1b[38;5;51m', // Bright cyan
6
+ cyan2: '\x1b[38;5;45m', // Medium cyan
7
+ cyan3: '\x1b[38;5;39m', // Darker cyan
8
+ green1: '\x1b[38;5;48m', // Bright green
9
+ green2: '\x1b[38;5;42m', // Medium green
10
+ green3: '\x1b[38;5;36m', // Darker green
11
+ gray: '\x1b[38;5;244m', // Gray for subtitle
12
+ reset: '\x1b[0m', // Reset color
13
+ bold: '\x1b[1m' // Bold text
14
+ };
15
+
16
+ function showLogo() {
17
+ console.log(`
18
+ ${colors.cyan1} ██╗${colors.cyan2}███████╗${colors.cyan3}████████╗${colors.green1}████████╗${colors.green2}██╗ ██╗${colors.reset}
19
+ ${colors.cyan1} ██║${colors.cyan2}██╔════╝${colors.cyan3}╚══██╔══╝${colors.green1}╚══██╔══╝${colors.green2}╚██╗ ██╔╝${colors.reset}
20
+ ${colors.cyan1} ██║${colors.cyan2}█████╗ ${colors.cyan3} ██║ ${colors.green1} ██║ ${colors.green2} ╚████╔╝ ${colors.reset}
21
+ ${colors.cyan1}██ ██║${colors.cyan2}██╔══╝ ${colors.cyan3} ██║ ${colors.green1} ██║ ${colors.green2} ╚██╔╝ ${colors.reset}
22
+ ${colors.cyan1}╚█████╔╝${colors.cyan2}███████╗${colors.cyan3} ██║ ${colors.green1} ██║ ${colors.green2} ██║ ${colors.reset}
23
+ ${colors.cyan1} ╚════╝ ${colors.cyan2}╚══════╝${colors.cyan3} ╚═╝ ${colors.green1} ╚═╝ ${colors.green2} ╚═╝ ${colors.reset}
24
+
25
+ ${colors.green1}██████╗ ${colors.green2}██████╗ ${colors.green3}██████╗ ${colors.reset}
26
+ ${colors.green1}██╔══██╗${colors.green2}██╔═══██╗${colors.green3}██╔══██╗${colors.reset}
27
+ ${colors.green1}██████╔╝${colors.green2}██║ ██║${colors.green3}██║ ██║${colors.reset}
28
+ ${colors.green1}██╔═══╝ ${colors.green2}██║ ██║${colors.green3}██║ ██║${colors.reset}
29
+ ${colors.green1}██║ ${colors.green2}╚██████╔╝${colors.green3}██████╔╝${colors.reset}
30
+ ${colors.green1}╚═╝ ${colors.green2} ╚═════╝ ${colors.green3}╚═════╝ ${colors.reset}
31
+ `);
32
+
33
+ const pkg = require('../../package.json');
34
+ const version = pkg.version || '3.0.0';
35
+ console.log(colors.gray + ' AI Development Context Manager ' + colors.bold + 'v' + version + colors.reset);
36
+ console.log();
37
+ }
38
+
39
+ module.exports = { showLogo };
@@ -0,0 +1,30 @@
1
+ Feature: Terminal Logo Display
2
+ As a JettyPod user
3
+ I want to see a welcoming logo when I run jettypod init
4
+ So that the tool feels approachable and modern
5
+
6
+ Scenario: jettypod init displays unicode gradient logo
7
+ Given a new empty directory
8
+ When I run jettypod init
9
+ Then the output contains the unicode gradient logo
10
+ And the logo includes "DEV" and "POD" text
11
+ And the logo uses ANSI color codes
12
+
13
+ Scenario: Logo module exports showLogo function
14
+ Given the logo module exists
15
+ When I import it
16
+ Then it exports a "showLogo" function
17
+
18
+ Scenario: Logo output is properly formatted
19
+ When I call the showLogo function
20
+ Then it outputs 6 lines of logo art
21
+ And it includes the version subtitle
22
+
23
+ # Integration test
24
+ Scenario: jettypod init integrates with existing features
25
+ Given a new empty directory
26
+ When I run jettypod init
27
+ Then I see the unicode logo
28
+ And the .jettypod directory is created
29
+ And CLAUDE.md is created
30
+ And git hooks are installed
@@ -231,28 +231,34 @@ async function createWorktree(workItem, options = {}) {
231
231
  throw new Error(`Failed to create .jettypod symlink: ${symlinkErr.message}`);
232
232
  }
233
233
 
234
- // Step 4.5: Add .jettypod to worktree's .gitignore
235
- // NOTE: git's info/exclude does NOT work for worktrees - only .gitignore works
234
+ // Step 4.5: Add .jettypod to MAIN repo's .git/info/exclude
235
+ // NOTE: Worktree-specific info/exclude does NOT work - must use main repo's exclude
236
236
  // This prevents the symlink from being committed when merging the worktree branch
237
237
  try {
238
- const gitignorePath = path.join(worktreePath, '.gitignore');
238
+ const excludePath = path.join(gitRoot, '.git', 'info', 'exclude');
239
239
 
240
- // Read existing .gitignore or create empty
241
- let gitignoreContent = '';
242
- if (fs.existsSync(gitignorePath)) {
243
- gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');
240
+ // Ensure the info directory exists
241
+ const infoDir = path.dirname(excludePath);
242
+ if (!fs.existsSync(infoDir)) {
243
+ fs.mkdirSync(infoDir, { recursive: true });
244
244
  }
245
245
 
246
- // Add .jettypod if not already in .gitignore
247
- if (!gitignoreContent.includes('.jettypod')) {
248
- const newEntry = gitignoreContent.endsWith('\n') || gitignoreContent === ''
246
+ // Read existing exclude or create empty
247
+ let excludeContent = '';
248
+ if (fs.existsSync(excludePath)) {
249
+ excludeContent = fs.readFileSync(excludePath, 'utf8');
250
+ }
251
+
252
+ // Add .jettypod if not already excluded
253
+ if (!excludeContent.includes('.jettypod')) {
254
+ const newEntry = excludeContent.endsWith('\n') || excludeContent === ''
249
255
  ? '.jettypod\n'
250
256
  : '\n.jettypod\n';
251
- fs.writeFileSync(gitignorePath, gitignoreContent + newEntry);
257
+ fs.writeFileSync(excludePath, excludeContent + newEntry);
252
258
  }
253
- } catch (gitignoreErr) {
259
+ } catch (excludeErr) {
254
260
  // Non-fatal - log warning but continue
255
- console.warn(`Warning: Could not add .jettypod to .gitignore: ${gitignoreErr.message}`);
261
+ console.warn(`Warning: Could not add .jettypod to .git/info/exclude: ${excludeErr.message}`);
256
262
  }
257
263
 
258
264
  // Step 5: Symlink .env files from main repo
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jettypod",
3
- "version": "4.4.19",
3
+ "version": "4.4.21",
4
4
  "description": "AI-powered development workflow manager with TDD, BDD, and automatic test generation",
5
5
  "main": "jettypod.js",
6
6
  "bin": {