@rewrlution/papyrus-cli 0.0.5 → 0.0.6
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/README.md +4 -8
- package/dist/cli.js +0 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth/logout.js +2 -0
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/journal/app.d.ts +1 -0
- package/dist/commands/journal/app.js +22 -0
- package/dist/commands/journal/app.js.map +1 -0
- package/dist/commands/journal/edit.js +8 -10
- package/dist/commands/journal/edit.js.map +1 -1
- package/dist/commands/journal/index.js +9 -10
- package/dist/commands/journal/index.js.map +1 -1
- package/dist/commands/journal/show.js +8 -14
- package/dist/commands/journal/show.js.map +1 -1
- package/dist/components/AppLayout.d.ts +32 -0
- package/dist/components/AppLayout.js +34 -0
- package/dist/components/AppLayout.js.map +1 -0
- package/dist/components/Divider.d.ts +7 -0
- package/dist/components/Divider.js +19 -0
- package/dist/components/Divider.js.map +1 -0
- package/dist/components/JournalBrowser.d.ts +14 -0
- package/dist/components/JournalBrowser.js +102 -0
- package/dist/components/JournalBrowser.js.map +1 -0
- package/dist/components/JournalList.d.ts +16 -0
- package/dist/components/JournalList.js +73 -0
- package/dist/components/JournalList.js.map +1 -0
- package/dist/components/JournalViewer.d.ts +5 -23
- package/dist/components/JournalViewer.js +73 -80
- package/dist/components/JournalViewer.js.map +1 -1
- package/dist/components/LoginForm.js +2 -2
- package/dist/components/LoginForm.js.map +1 -1
- package/dist/components/LogoCompact.d.ts +5 -0
- package/dist/components/LogoCompact.js +11 -0
- package/dist/components/LogoCompact.js.map +1 -0
- package/dist/components/RegisterForm.js +2 -2
- package/dist/components/RegisterForm.js.map +1 -1
- package/dist/components/StatusMessage.d.ts +2 -1
- package/dist/components/StatusMessage.js +3 -3
- package/dist/components/StatusMessage.js.map +1 -1
- package/dist/lib/auth/require-auth.js +4 -5
- package/dist/lib/auth/require-auth.js.map +1 -1
- package/dist/utils/alternate-screen.d.ts +46 -0
- package/dist/utils/alternate-screen.js +60 -0
- package/dist/utils/alternate-screen.js.map +1 -0
- package/dist/utils/date.js +3 -4
- package/dist/utils/date.js.map +1 -1
- package/dist/utils/editor.js +0 -1
- package/dist/utils/editor.js.map +1 -1
- package/dist/utils/journal-preview.d.ts +15 -0
- package/dist/utils/journal-preview.js +34 -0
- package/dist/utils/journal-preview.js.map +1 -0
- package/dist/utils/journal-preview.test.d.ts +1 -0
- package/dist/utils/journal-preview.test.js +62 -0
- package/dist/utils/journal-preview.test.js.map +1 -0
- package/dist/utils/messages.d.ts +43 -0
- package/dist/utils/messages.js +72 -0
- package/dist/utils/messages.js.map +1 -0
- package/dist/utils/text.d.ts +25 -0
- package/dist/utils/text.js +51 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/utils/text.test.d.ts +1 -0
- package/dist/utils/text.test.js +47 -0
- package/dist/utils/text.test.js.map +1 -0
- package/package.json +3 -2
- package/dist/commands/journal/list.d.ts +0 -1
- package/dist/commands/journal/list.js +0 -20
- package/dist/commands/journal/list.js.map +0 -1
- package/dist/components/Browser.d.ts +0 -29
- package/dist/components/Browser.js +0 -124
- package/dist/components/Browser.js.map +0 -1
- package/dist/components/BrowserFooter.d.ts +0 -6
- package/dist/components/BrowserFooter.js +0 -6
- package/dist/components/BrowserFooter.js.map +0 -1
- package/dist/components/BrowserHeader.d.ts +0 -6
- package/dist/components/BrowserHeader.js +0 -6
- package/dist/components/BrowserHeader.js.map +0 -1
- package/dist/components/JournalListView.d.ts +0 -10
- package/dist/components/JournalListView.js +0 -40
- package/dist/components/JournalListView.js.map +0 -1
|
@@ -1,142 +1,135 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Box, Text, useInput, useApp } from 'ink';
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput, useApp, useStdout } from 'ink';
|
|
3
3
|
import { useState, useMemo } from 'react';
|
|
4
4
|
import { formatDateHeader } from '../utils/date.js';
|
|
5
|
+
import { AppLayout } from './AppLayout.js';
|
|
6
|
+
// Special characters
|
|
7
|
+
const NBSP = '\u00A0'; // Non-breaking space
|
|
8
|
+
const VBAR = '│'; // Vertical bar for line number separator
|
|
9
|
+
// Line number formatting
|
|
10
|
+
const LINE_NUMBER_WIDTH = 4; // Width for padded line numbers
|
|
11
|
+
const LINE_NUMBER_SEPARATOR = ` ${VBAR} `; // " │ " with spaces
|
|
5
12
|
/**
|
|
6
|
-
*
|
|
13
|
+
* Journal viewer - displays full journal content with scrolling.
|
|
7
14
|
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
* - Horizontal panning for long lines (no text wrapping)
|
|
11
|
-
* - Line numbers for easy reference
|
|
12
|
-
* - Sticky header with date and position indicator
|
|
13
|
-
* - Sticky footer with keyboard shortcuts
|
|
14
|
-
* - Multiple navigation methods (arrows, vim keys, page up/down)
|
|
15
|
-
*
|
|
16
|
-
* Architecture:
|
|
17
|
-
* 1. Split content into lines (memoized for performance)
|
|
18
|
-
* 2. Calculate viewport dimensions based on terminal size
|
|
19
|
-
* 3. Track scroll position (vertical and horizontal)
|
|
20
|
-
* 4. Only render visible slice of content (virtual scrolling)
|
|
21
|
-
* 5. Update scroll position on keyboard input
|
|
22
|
-
*
|
|
23
|
-
* Key Design Decisions:
|
|
24
|
-
* - Each content line = 1 display row (no wrapping, use horizontal panning instead)
|
|
25
|
-
* - Line numbers always correspond to content lines (1:1 mapping)
|
|
26
|
-
* - Progress calculated from last visible line (shows 100% when viewing all content)
|
|
27
|
-
* - Auto-reset horizontal position when moving vertically (better UX)
|
|
28
|
-
* - React keys use line numbers (unique, stable identifiers)
|
|
15
|
+
* Uses AppLayout for consistent layout structure.
|
|
16
|
+
* Handles viewer-specific navigation and scrolling.
|
|
29
17
|
*/
|
|
30
18
|
export const JournalViewer = ({ date, content, onExit, }) => {
|
|
31
19
|
const { exit } = useApp();
|
|
20
|
+
const { stdout } = useStdout();
|
|
32
21
|
// Split content into lines (memoized to avoid re-splitting on every render)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
//
|
|
22
|
+
// Remove trailing empty line if file ends with newline (which is standard)
|
|
23
|
+
const contentLines = useMemo(() => {
|
|
24
|
+
const lines = content.split('\n');
|
|
25
|
+
// If file ends with newline, split creates an empty last element - remove it
|
|
26
|
+
if (lines.length > 0 && lines[lines.length - 1] === '') {
|
|
27
|
+
return lines.slice(0, -1);
|
|
28
|
+
}
|
|
29
|
+
return lines;
|
|
30
|
+
}, [content]);
|
|
31
|
+
// Viewport configuration - use same stdout as AppLayoutGeneric
|
|
32
|
+
const terminalHeight = stdout?.rows || 24;
|
|
33
|
+
const terminalWidth = stdout?.columns || 120;
|
|
34
|
+
// Reserve space for UI elements:
|
|
35
|
+
// - Outer box border: 2 (top + bottom, handled by AppLayoutGeneric's height={terminalHeight-2})
|
|
36
|
+
// - Logo: 1
|
|
37
|
+
// - Divider: 1
|
|
38
|
+
// - Header: 1
|
|
39
|
+
// - Divider: 1
|
|
40
|
+
// - [Content area - what we calculate here]
|
|
41
|
+
// - Divider: 1
|
|
42
|
+
// - Footer: 1
|
|
43
|
+
// - Flex layout overhead: 2 (accounting for flexbox rendering and potential shrinkage)
|
|
44
|
+
// Total reserved: 2 + 1 + 1 + 1 + 1 + 1 + 1 + 2 = 10
|
|
45
|
+
const reservedHeight = 10;
|
|
43
46
|
const visibleLines = Math.max(5, terminalHeight - reservedHeight);
|
|
44
|
-
// Calculate available width for content
|
|
45
|
-
const borderWidth = 2;
|
|
46
|
-
const paddingWidth = 2;
|
|
47
|
-
const lineNumberWidth =
|
|
47
|
+
// Calculate available width for content
|
|
48
|
+
const borderWidth = 2;
|
|
49
|
+
const paddingWidth = 2;
|
|
50
|
+
const lineNumberWidth = LINE_NUMBER_WIDTH + LINE_NUMBER_SEPARATOR.length; // e.g., " 1 │ " = 4 + 3 = 7
|
|
48
51
|
const contentWidth = terminalWidth - borderWidth - paddingWidth - lineNumberWidth;
|
|
49
52
|
// Scroll state
|
|
50
|
-
const [scrollOffset, setScrollOffset] = useState(0);
|
|
51
|
-
const [horizontalOffset, setHorizontalOffset] = useState(0);
|
|
52
|
-
// Calculate maximum scroll position
|
|
53
|
+
const [scrollOffset, setScrollOffset] = useState(0);
|
|
54
|
+
const [horizontalOffset, setHorizontalOffset] = useState(0);
|
|
55
|
+
// Calculate maximum scroll position
|
|
53
56
|
const maxScroll = Math.max(0, contentLines.length - visibleLines);
|
|
54
57
|
// Keyboard navigation
|
|
55
58
|
useInput((input, key) => {
|
|
56
59
|
// Quit (q or Escape)
|
|
57
60
|
if (input === 'q' || key.escape) {
|
|
58
61
|
if (onExit) {
|
|
59
|
-
onExit();
|
|
62
|
+
onExit();
|
|
60
63
|
}
|
|
61
64
|
else {
|
|
62
|
-
exit();
|
|
65
|
+
exit();
|
|
63
66
|
}
|
|
64
67
|
return;
|
|
65
68
|
}
|
|
66
69
|
// Vertical navigation
|
|
67
|
-
// Down (↓ or j)
|
|
68
70
|
if (key.downArrow || input === 'j') {
|
|
69
71
|
setScrollOffset((prev) => Math.min(prev + 1, maxScroll));
|
|
70
|
-
setHorizontalOffset(0);
|
|
72
|
+
setHorizontalOffset(0);
|
|
71
73
|
}
|
|
72
|
-
// Up (↑ or k)
|
|
73
74
|
if (key.upArrow || input === 'k') {
|
|
74
75
|
setScrollOffset((prev) => Math.max(prev - 1, 0));
|
|
75
|
-
setHorizontalOffset(0);
|
|
76
|
+
setHorizontalOffset(0);
|
|
76
77
|
}
|
|
77
|
-
// Page down (PgDn or Space)
|
|
78
78
|
if (key.pageDown || input === ' ') {
|
|
79
79
|
setScrollOffset((prev) => Math.min(prev + visibleLines, maxScroll));
|
|
80
|
-
setHorizontalOffset(0);
|
|
80
|
+
setHorizontalOffset(0);
|
|
81
81
|
}
|
|
82
|
-
// Page up (PgUp)
|
|
83
82
|
if (key.pageUp) {
|
|
84
83
|
setScrollOffset((prev) => Math.max(prev - visibleLines, 0));
|
|
85
|
-
setHorizontalOffset(0);
|
|
84
|
+
setHorizontalOffset(0);
|
|
86
85
|
}
|
|
87
|
-
// Jump to top (Home or g)
|
|
88
86
|
if (key.home || input === 'g') {
|
|
89
87
|
setScrollOffset(0);
|
|
90
|
-
setHorizontalOffset(0);
|
|
88
|
+
setHorizontalOffset(0);
|
|
91
89
|
}
|
|
92
|
-
// Jump to bottom (End or G)
|
|
93
90
|
if (key.end || input === 'G') {
|
|
94
91
|
setScrollOffset(maxScroll);
|
|
95
|
-
setHorizontalOffset(0);
|
|
92
|
+
setHorizontalOffset(0);
|
|
96
93
|
}
|
|
97
94
|
// Horizontal navigation
|
|
98
|
-
// Left (← or h)
|
|
99
95
|
if (key.leftArrow || input === 'h') {
|
|
100
96
|
setHorizontalOffset((prev) => Math.max(prev - 10, 0));
|
|
101
97
|
}
|
|
102
|
-
// Right (→ or l)
|
|
103
98
|
if (key.rightArrow || input === 'l') {
|
|
104
99
|
setHorizontalOffset((prev) => prev + 10);
|
|
105
100
|
}
|
|
106
|
-
// Jump to start of line (0)
|
|
107
101
|
if (input === '0') {
|
|
108
102
|
setHorizontalOffset(0);
|
|
109
103
|
}
|
|
110
104
|
});
|
|
111
105
|
// Virtual scrolling: only render visible lines
|
|
112
|
-
// This is critical for performance with large journals (1000+ lines)
|
|
113
106
|
const visibleContent = contentLines.slice(scrollOffset, scrollOffset + visibleLines);
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
107
|
+
// Pad with empty lines to fill the terminal height
|
|
108
|
+
const paddingNeeded = Math.max(0, visibleLines - visibleContent.length);
|
|
109
|
+
const emptyLines = Array(paddingNeeded).fill('');
|
|
110
|
+
// Calculate position info
|
|
117
111
|
const lastVisibleLine = Math.min(scrollOffset + visibleLines, contentLines.length);
|
|
118
112
|
const progress = calculateProgress(lastVisibleLine, contentLines.length);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
113
|
+
// Header content: date and position
|
|
114
|
+
const headerContent = (_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: "cyan", children: formatDateHeader(date) }), _jsxs(Text, { dimColor: true, children: ["Line ", lastVisibleLine, "/", contentLines.length, " (", progress, "%)"] })] }));
|
|
115
|
+
// Footer content: keyboard shortcuts
|
|
116
|
+
const footerContent = (_jsxs(Text, { dimColor: true, children: ["\u2191\u2193/jk Scroll \u2022 \u2190\u2192/hl Pan \u2022 0 Home \u2022 PgUp/PgDn Page \u2022 g/G Top/Bot \u2022 q Quit", horizontalOffset > 0 && ` • Col ${horizontalOffset + 1}+`] }));
|
|
117
|
+
// Format empty line number column (matches width of actual line numbers)
|
|
118
|
+
const emptyLineNumberColumn = ''.padStart(LINE_NUMBER_WIDTH, ' ') + LINE_NUMBER_SEPARATOR;
|
|
119
|
+
// Content area: scrollable journal lines
|
|
120
|
+
const contentArea = (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [visibleContent.map((line, idx) => {
|
|
121
|
+
const lineNumber = scrollOffset + idx + 1;
|
|
122
|
+
const lineNumberStr = lineNumber
|
|
123
|
+
.toString()
|
|
124
|
+
.padStart(LINE_NUMBER_WIDTH, ' ');
|
|
125
|
+
const visiblePortion = line.substring(horizontalOffset, horizontalOffset + contentWidth);
|
|
126
|
+
const displayContent = visiblePortion || NBSP;
|
|
127
|
+
return (_jsxs(Box, { flexDirection: "row", minHeight: 1, children: [_jsx(Text, { dimColor: true, children: lineNumberStr + LINE_NUMBER_SEPARATOR }), _jsx(Text, { children: displayContent })] }, lineNumber));
|
|
128
|
+
}), emptyLines.map((_, idx) => (_jsxs(Box, { flexDirection: "row", minHeight: 1, children: [_jsx(Text, { dimColor: true, children: emptyLineNumberColumn }), _jsx(Text, { children: NBSP })] }, `empty-${idx}`)))] }));
|
|
129
|
+
return (_jsx(AppLayout, { headerContent: headerContent, footerContent: footerContent, children: contentArea }));
|
|
133
130
|
};
|
|
134
131
|
/**
|
|
135
132
|
* Calculate percentage through content.
|
|
136
|
-
*
|
|
137
|
-
* @param currentLine - Current line number (1-indexed)
|
|
138
|
-
* @param totalLines - Total number of lines
|
|
139
|
-
* @returns Percentage (0-100)
|
|
140
133
|
*/
|
|
141
134
|
function calculateProgress(currentLine, totalLines) {
|
|
142
135
|
if (totalLines === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JournalViewer.js","sourceRoot":"","sources":["../../src/components/JournalViewer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"JournalViewer.js","sourceRoot":"","sources":["../../src/components/JournalViewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { SigninSchema } from '@rewrlution/papyrus-shared';
|
|
|
6
6
|
import { api } from '../lib/api/index.js';
|
|
7
7
|
import { ColdStartAwareSpinner } from './ColdStart.js';
|
|
8
8
|
import { FormInput } from './FormInput.js';
|
|
9
|
-
import {
|
|
9
|
+
import { LogoCompact } from './LogoCompact.js';
|
|
10
10
|
import { StatusMessage } from './StatusMessage.js';
|
|
11
11
|
export function LoginForm() {
|
|
12
12
|
const { exit } = useApp();
|
|
@@ -63,6 +63,6 @@ export function LoginForm() {
|
|
|
63
63
|
exit(); // Exit with code 0 - error message already displayed
|
|
64
64
|
}, 1000);
|
|
65
65
|
};
|
|
66
|
-
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 2, children: [_jsx(
|
|
66
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 2, children: [_jsx(LogoCompact, {}), _jsx(Newline, {}), _jsx(Text, { color: "gray", dimColor: true, children: "Login to your account" }), _jsx(Text, { color: "gray", dimColor: true, children: "Press Ctrl+C to cancel" }), _jsx(Newline, {}), step === 'email' && (_jsx(FormInput, { label: "Email", value: email, onChange: setEmail, placeholder: "user@example.com", focus: true })), step === 'password' && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Email:" }), _jsxs(Box, { marginLeft: 2, marginBottom: 1, children: [_jsx(Text, { color: "gray", children: '> ' }), _jsx(Text, { children: email })] }), _jsx(FormInput, { label: "Password", value: password, onChange: setPassword, mask: "*", focus: true })] })), step === 'validating' && (_jsx(StatusMessage, { type: "loading", message: "Validating..." })), step === 'submitting' && (_jsx(ColdStartAwareSpinner, { message: "Logging in..." })), step === 'success' && (_jsx(StatusMessage, { type: "success", message: `Welcome back, ${userName}!` })), step === 'error' && (_jsx(StatusMessage, { type: "error", message: errorMessage }))] }));
|
|
67
67
|
}
|
|
68
68
|
//# sourceMappingURL=LoginForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginForm.js","sourceRoot":"","sources":["../../src/components/LoginForm.tsx"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC3D,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"LoginForm.js","sourceRoot":"","sources":["../../src/components/LoginForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { Text, Box } from 'ink';
|
|
4
|
+
/**
|
|
5
|
+
* Compact logo for interactive commands (login, register, list)
|
|
6
|
+
* Takes up minimal space while maintaining branding
|
|
7
|
+
*/
|
|
8
|
+
export function LogoCompact() {
|
|
9
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Text, { children: [chalk.cyan('P'), chalk.blue('A'), chalk.green('P'), chalk.yellow('Y'), chalk.rgb(255, 165, 0)('R'), chalk.magenta('U'), chalk.red('S'), " ", chalk.gray('│'), ' ', chalk.dim('AI-powered developer journaling')] }) }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=LogoCompact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogoCompact.js","sourceRoot":"","sources":["../../src/components/LogoCompact.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACzB,MAAC,IAAI,eACF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EACf,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAChB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EACjB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAC3B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAClB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EACrC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,IACxC,GACH,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -6,7 +6,7 @@ import { SignupSchema } from '@rewrlution/papyrus-shared';
|
|
|
6
6
|
import { api } from '../lib/api/index.js';
|
|
7
7
|
import { ColdStartAwareSpinner } from './ColdStart.js';
|
|
8
8
|
import { FormInput } from './FormInput.js';
|
|
9
|
-
import {
|
|
9
|
+
import { LogoCompact } from './LogoCompact.js';
|
|
10
10
|
import { StatusMessage } from './StatusMessage.js';
|
|
11
11
|
export function RegisterForm() {
|
|
12
12
|
const { exit } = useApp();
|
|
@@ -67,6 +67,6 @@ export function RegisterForm() {
|
|
|
67
67
|
exit(); // Exit with code 0 - error message already displayed
|
|
68
68
|
}, 1000);
|
|
69
69
|
};
|
|
70
|
-
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 2, children: [_jsx(
|
|
70
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 2, children: [_jsx(LogoCompact, {}), _jsx(Newline, {}), _jsx(Text, { color: "gray", dimColor: true, children: "Create your Papyrus account" }), _jsx(Text, { color: "gray", dimColor: true, children: "Press Ctrl+C to cancel" }), _jsx(Newline, {}), step === 'email' && (_jsx(FormInput, { label: "Email", value: email, onChange: setEmail, placeholder: "user@example.com", focus: true })), step === 'password' && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Email:" }), _jsxs(Box, { marginLeft: 2, marginBottom: 1, children: [_jsx(Text, { color: "gray", children: '> ' }), _jsx(Text, { children: email })] }), _jsx(FormInput, { label: "Password (8+ chars, uppercase, lowercase, number, special char)", value: password, onChange: setPassword, mask: "*", focus: true })] })), step === 'confirmPassword' && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Email:" }), _jsxs(Box, { marginLeft: 2, marginBottom: 1, children: [_jsx(Text, { color: "gray", children: '> ' }), _jsx(Text, { children: email })] }), _jsx(Text, { color: "cyan", bold: true, children: "Password:" }), _jsxs(Box, { marginLeft: 2, marginBottom: 1, children: [_jsx(Text, { color: "gray", children: '> ' }), _jsx(Text, { children: '*'.repeat(password.length) })] }), _jsx(FormInput, { label: "Confirm Password", value: confirmPassword, onChange: setConfirmPassword, mask: "*", focus: true })] })), step === 'validating' && (_jsx(StatusMessage, { type: "loading", message: "Validating..." })), step === 'submitting' && (_jsx(ColdStartAwareSpinner, { message: "Creating account..." })), step === 'success' && (_jsx(StatusMessage, { type: "success", message: `Registration successful!\nPlease check ${userName} to verify your account. If you don't receive the verification email, contact: rewrlution@gmail.com` })), step === 'error' && (_jsx(StatusMessage, { type: "error", message: errorMessage }))] }));
|
|
71
71
|
}
|
|
72
72
|
//# sourceMappingURL=RegisterForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegisterForm.js","sourceRoot":"","sources":["../../src/components/RegisterForm.tsx"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"RegisterForm.js","sourceRoot":"","sources":["../../src/components/RegisterForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ type MessageType = 'success' | 'error' | 'info' | 'loading';
|
|
|
2
2
|
interface StatusMessageProps {
|
|
3
3
|
type: MessageType;
|
|
4
4
|
message: string;
|
|
5
|
+
hint?: string;
|
|
5
6
|
}
|
|
6
|
-
export declare function StatusMessage({ type, message }: StatusMessageProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function StatusMessage({ type, message, hint }: StatusMessageProps): import("react/jsx-runtime").JSX.Element;
|
|
7
8
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
3
|
const icons = {
|
|
4
4
|
success: '✅',
|
|
@@ -12,8 +12,8 @@ const colors = {
|
|
|
12
12
|
info: 'blue',
|
|
13
13
|
loading: 'cyan',
|
|
14
14
|
};
|
|
15
|
-
export function StatusMessage({ type, message }) {
|
|
15
|
+
export function StatusMessage({ type, message, hint }) {
|
|
16
16
|
const lines = message.split('\n');
|
|
17
|
-
return (
|
|
17
|
+
return (_jsxs(Box, { flexDirection: "column", children: [lines.map((line, index) => (_jsx(Text, { color: colors[type], children: index === 0 ? `${icons[type]} ${line}` : ` ${line}` }, index))), hint && _jsxs(Text, { color: "gray", children: ["\uD83D\uDCA1 ", hint] })] }));
|
|
18
18
|
}
|
|
19
19
|
//# sourceMappingURL=StatusMessage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusMessage.js","sourceRoot":"","sources":["../../src/components/StatusMessage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"StatusMessage.js","sourceRoot":"","sources":["../../src/components/StatusMessage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAWhC,MAAM,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,KAAK;CACf,CAAC;AAEF,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAsB;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1B,KAAC,IAAI,IAAa,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,YAClC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,IAD7C,KAAK,CAET,CACR,CAAC,EACD,IAAI,IAAI,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,8BAAK,IAAI,IAAQ,IACxC,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as msg from '../../utils/messages.js';
|
|
1
2
|
import { isTokenExpired, isTokenExpiringSoon, getTimeUntilExpiration, } from '../../utils/token.js';
|
|
2
3
|
import { tokenStore } from '../storage/index.js';
|
|
3
4
|
/**
|
|
@@ -93,15 +94,13 @@ export function requireAuth(options = {}) {
|
|
|
93
94
|
export function ensureAuthenticated(options = {}) {
|
|
94
95
|
const authResult = requireAuth(options);
|
|
95
96
|
if (!authResult.isAuthenticated) {
|
|
96
|
-
|
|
97
|
-
process.exit(1);
|
|
97
|
+
msg.error(authResult.message);
|
|
98
98
|
}
|
|
99
99
|
if (authResult.isExpired) {
|
|
100
|
-
|
|
101
|
-
process.exit(1);
|
|
100
|
+
msg.error(authResult.message);
|
|
102
101
|
}
|
|
103
102
|
if (authResult.isExpiringSoon && authResult.message) {
|
|
104
|
-
|
|
103
|
+
msg.warn(authResult.message);
|
|
105
104
|
}
|
|
106
105
|
}
|
|
107
106
|
//# sourceMappingURL=require-auth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"require-auth.js","sourceRoot":"","sources":["../../../src/lib/auth/require-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA2BjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW,CAAC,UAA8B,EAAE;IAC1D,MAAM,EAAE,wBAAwB,GAAG,EAAE,EAAE,kBAAkB,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE7E,mCAAmC;IACnC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QACzB,OAAO;YACL,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,IAAI;YACzB,OAAO,EAAE,qDAAqD;SAC/D,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,IAAI;YACzB,OAAO,EAAE,kDAAkD;SAC5D,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,oCAAoC;QACpC,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO;YACL,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,IAAI;YACzB,OAAO,EAAE,6DAA6D;SACvE,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IAC1E,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAE1D,OAAO;QACL,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,YAAY;QAC5B,mBAAmB;QACnB,OAAO,EACL,YAAY,IAAI,kBAAkB,IAAI,mBAAmB;YACvD,CAAC,CAAC,+BAA+B,mBAAmB,4CAA4C;YAChG,CAAC,CAAC,SAAS;KAChB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAA8B,EAAE;IAClE,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;QAChC,
|
|
1
|
+
{"version":3,"file":"require-auth.js","sourceRoot":"","sources":["../../../src/lib/auth/require-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA2BjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW,CAAC,UAA8B,EAAE;IAC1D,MAAM,EAAE,wBAAwB,GAAG,EAAE,EAAE,kBAAkB,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE7E,mCAAmC;IACnC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QACzB,OAAO;YACL,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,IAAI;YACzB,OAAO,EAAE,qDAAqD;SAC/D,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,IAAI;YACzB,OAAO,EAAE,kDAAkD;SAC5D,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,oCAAoC;QACpC,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO;YACL,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,IAAI;YACzB,OAAO,EAAE,6DAA6D;SACvE,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IAC1E,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAE1D,OAAO;QACL,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,YAAY;QAC5B,mBAAmB;QACnB,OAAO,EACL,YAAY,IAAI,kBAAkB,IAAI,mBAAmB;YACvD,CAAC,CAAC,+BAA+B,mBAAmB,4CAA4C;YAChG,CAAC,CAAC,SAAS;KAChB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAA8B,EAAE;IAClE,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAQ,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QACzB,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAQ,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alternate Screen Buffer Management
|
|
3
|
+
*
|
|
4
|
+
* Provides clean full-screen terminal UI experience using alternate screen buffer.
|
|
5
|
+
* When you enter alternate screen, the terminal saves current state and gives you
|
|
6
|
+
* a clean canvas. When you exit, it restores everything as if your app was never there.
|
|
7
|
+
*
|
|
8
|
+
* This is the standard approach used by vim, less, htop, and all professional TUI tools.
|
|
9
|
+
*
|
|
10
|
+
* ## Usage
|
|
11
|
+
*
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { withAlternateScreen } from './alternate-screen.js';
|
|
14
|
+
* import { render } from 'ink';
|
|
15
|
+
*
|
|
16
|
+
* await withAlternateScreen(async () => {
|
|
17
|
+
* const { waitUntilExit } = render(<YourComponent />);
|
|
18
|
+
* await waitUntilExit();
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* ## Known Limitations
|
|
23
|
+
*
|
|
24
|
+
* VS Code's integrated terminal may not properly restore screen state for complex
|
|
25
|
+
* Ink components. This is a VS Code limitation, not a bug in our code. The same
|
|
26
|
+
* code works perfectly in Windows Terminal, Git Bash, PowerShell, and other terminals.
|
|
27
|
+
*
|
|
28
|
+
* @see https://github.com/sindresorhus/ansi-escapes
|
|
29
|
+
*/
|
|
30
|
+
/**
|
|
31
|
+
* Enter the alternate screen buffer.
|
|
32
|
+
* Saves current terminal state and switches to a clean screen.
|
|
33
|
+
*/
|
|
34
|
+
export declare function enterAlternateScreen(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Exit the alternate screen buffer.
|
|
37
|
+
* Restores the original terminal state.
|
|
38
|
+
*/
|
|
39
|
+
export declare function exitAlternateScreen(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Execute a function within the alternate screen buffer.
|
|
42
|
+
* Ensures the screen is properly restored even if an error occurs.
|
|
43
|
+
*
|
|
44
|
+
* @param fn - Async function to execute in alternate screen
|
|
45
|
+
*/
|
|
46
|
+
export declare function withAlternateScreen(fn: () => Promise<void>): Promise<void>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alternate Screen Buffer Management
|
|
3
|
+
*
|
|
4
|
+
* Provides clean full-screen terminal UI experience using alternate screen buffer.
|
|
5
|
+
* When you enter alternate screen, the terminal saves current state and gives you
|
|
6
|
+
* a clean canvas. When you exit, it restores everything as if your app was never there.
|
|
7
|
+
*
|
|
8
|
+
* This is the standard approach used by vim, less, htop, and all professional TUI tools.
|
|
9
|
+
*
|
|
10
|
+
* ## Usage
|
|
11
|
+
*
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { withAlternateScreen } from './alternate-screen.js';
|
|
14
|
+
* import { render } from 'ink';
|
|
15
|
+
*
|
|
16
|
+
* await withAlternateScreen(async () => {
|
|
17
|
+
* const { waitUntilExit } = render(<YourComponent />);
|
|
18
|
+
* await waitUntilExit();
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* ## Known Limitations
|
|
23
|
+
*
|
|
24
|
+
* VS Code's integrated terminal may not properly restore screen state for complex
|
|
25
|
+
* Ink components. This is a VS Code limitation, not a bug in our code. The same
|
|
26
|
+
* code works perfectly in Windows Terminal, Git Bash, PowerShell, and other terminals.
|
|
27
|
+
*
|
|
28
|
+
* @see https://github.com/sindresorhus/ansi-escapes
|
|
29
|
+
*/
|
|
30
|
+
import ansiEscapes from 'ansi-escapes';
|
|
31
|
+
/**
|
|
32
|
+
* Enter the alternate screen buffer.
|
|
33
|
+
* Saves current terminal state and switches to a clean screen.
|
|
34
|
+
*/
|
|
35
|
+
export function enterAlternateScreen() {
|
|
36
|
+
process.stdout.write(ansiEscapes.enterAlternativeScreen);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Exit the alternate screen buffer.
|
|
40
|
+
* Restores the original terminal state.
|
|
41
|
+
*/
|
|
42
|
+
export function exitAlternateScreen() {
|
|
43
|
+
process.stdout.write(ansiEscapes.exitAlternativeScreen);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Execute a function within the alternate screen buffer.
|
|
47
|
+
* Ensures the screen is properly restored even if an error occurs.
|
|
48
|
+
*
|
|
49
|
+
* @param fn - Async function to execute in alternate screen
|
|
50
|
+
*/
|
|
51
|
+
export async function withAlternateScreen(fn) {
|
|
52
|
+
enterAlternateScreen();
|
|
53
|
+
try {
|
|
54
|
+
await fn();
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
exitAlternateScreen();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=alternate-screen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alternate-screen.js","sourceRoot":"","sources":["../../src/utils/alternate-screen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAuB;IAEvB,oBAAoB,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,CAAC;IACb,CAAC;YAAS,CAAC;QACT,mBAAmB,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
|
package/dist/utils/date.js
CHANGED
|
@@ -102,10 +102,9 @@ export function parseDateToLocalTimestamp(dateString) {
|
|
|
102
102
|
* Example: "20260104" → "January 4, 2026 (Saturday)"
|
|
103
103
|
*/
|
|
104
104
|
export function formatDateHeader(dateStr) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
const date = new Date(`${year}-${month}-${day}`);
|
|
105
|
+
// Use parseDateToLocalTimestamp to create Date in local timezone at noon
|
|
106
|
+
// This avoids timezone edge cases (e.g., "2025-10-06" as UTC being "2025-10-05" in PST)
|
|
107
|
+
const date = parseDateToLocalTimestamp(dateStr);
|
|
109
108
|
const options = {
|
|
110
109
|
year: 'numeric',
|
|
111
110
|
month: 'long',
|
package/dist/utils/date.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/utils/date.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/utils/date.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/editor.js
CHANGED
|
@@ -52,7 +52,6 @@ export function openInEditor(content, baseFilename = 'papyrus.md') {
|
|
|
52
52
|
fs.writeFileSync(tempFile, content, 'utf-8');
|
|
53
53
|
try {
|
|
54
54
|
const editor = detectEditor();
|
|
55
|
-
console.log(`Opening in ${editor}...`);
|
|
56
55
|
// Determine args based on editor
|
|
57
56
|
const args = editor === 'code' ? ['--wait', tempFile] : [tempFile];
|
|
58
57
|
const result = spawnSync(editor, args, {
|