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 +1 -1
- package/lib/terminal-logo/index.js +39 -0
- package/lib/terminal-logo/terminal-logo.feature +30 -0
- package/lib/worktree-manager.js +19 -13
- package/package.json +1 -1
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('./
|
|
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
|
package/lib/worktree-manager.js
CHANGED
|
@@ -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
|
|
235
|
-
// NOTE:
|
|
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
|
|
238
|
+
const excludePath = path.join(gitRoot, '.git', 'info', 'exclude');
|
|
239
239
|
|
|
240
|
-
//
|
|
241
|
-
|
|
242
|
-
if (fs.existsSync(
|
|
243
|
-
|
|
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
|
-
//
|
|
247
|
-
|
|
248
|
-
|
|
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(
|
|
257
|
+
fs.writeFileSync(excludePath, excludeContent + newEntry);
|
|
252
258
|
}
|
|
253
|
-
} catch (
|
|
259
|
+
} catch (excludeErr) {
|
|
254
260
|
// Non-fatal - log warning but continue
|
|
255
|
-
console.warn(`Warning: Could not add .jettypod to .
|
|
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
|