life-pulse 2.3.0 → 2.3.2

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/dist/ui/app.js CHANGED
@@ -17,31 +17,28 @@ const INIT = {
17
17
  progress: null,
18
18
  };
19
19
  // ─── Components ───────────────────────────────────
20
- const SpinnerLine = ({ label, frame }) => (_jsxs(Text, { children: [' ', _jsx(Text, { color: "#7aa2f7", children: SPIN[frame % SPIN.length] }), ' ', _jsx(Text, { color: "#565f89", children: label })] }));
20
+ const SpinnerLine = ({ label, frame }) => (_jsxs(Text, { children: [' ', _jsx(Text, { color: "#565f89", children: SPIN[frame % SPIN.length] }), ' ', _jsx(Text, { color: "#565f89", children: label })] }));
21
21
  const BAR_W = 20;
22
22
  const MAX_VIS = 4;
23
23
  const Bar = ({ done, total }) => {
24
24
  const f = Math.round((done / Math.max(total, 1)) * BAR_W);
25
- return (_jsxs(Text, { children: [_jsx(Text, { color: "#7aa2f7", children: ''.repeat(f) }), _jsx(Text, { color: "#292e42", children: ''.repeat(BAR_W - f) }), ' ', _jsx(Text, { bold: true, color: "#c0caf5", children: done }), _jsx(Text, { color: "#565f89", children: "/" }), _jsx(Text, { bold: true, color: "#c0caf5", children: total })] }));
25
+ return (_jsxs(Text, { children: [_jsx(Text, { color: "#565f89", children: ''.repeat(f) }), _jsx(Text, { color: "#292e42", children: ''.repeat(BAR_W - f) }), ' ', _jsx(Text, { color: "#565f89", children: done }), _jsx(Text, { color: "#3b4261", children: "/" }), _jsx(Text, { color: "#565f89", children: total })] }));
26
26
  };
27
27
  const ProgressView = ({ progress, frame }) => {
28
28
  const spin = (off = 0) => BAR_CHARS[(frame + off) % BAR_CHARS.length];
29
29
  if (progress.thinking && !progress.items.length && !progress.total) {
30
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { children: ' ' }), _jsxs(Text, { children: [' ', _jsx(Text, { color: "#7aa2f7", children: spin() }), ' ', _jsx(Text, { color: "#c0caf5", children: "thinking\u2026" })] })] }));
30
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { children: ' ' }), _jsxs(Text, { children: [' ', _jsx(Text, { color: "#3b4261", children: spin() }), ' ', _jsx(Text, { color: "#565f89", children: "thinking" })] })] }));
31
31
  }
32
32
  const { phase, done, total, items } = progress;
33
33
  const allDone = done === total && total > 0;
34
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { children: ' ' }), allDone ? (_jsxs(Text, { children: [' ', _jsx(Text, { color: "#9ece6a", children: '' }), ' ', _jsx(Text, { color: "#565f89", children: phase === 'scanning' ? 'scanned' : 'done' })] })) : total > 0 ? (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: [' ', _jsx(Text, { color: "#565f89", children: phase || 'working' }), ' ', _jsx(Bar, { done: done, total: total })] }), items.slice(0, MAX_VIS).map((item, i) => (_jsxs(Text, { children: [' ', _jsx(Text, { color: "#7aa2f7", children: spin(i) }), ' ', _jsx(Text, { color: "#c0caf5", children: item.label }), item.tool && _jsxs(Text, { color: "#565f89", children: [' — ', item.tool] })] }, i))), items.length > MAX_VIS && _jsxs(Text, { color: "#565f89", children: [' ', "+", items.length - MAX_VIS, " more"] })] })) : null, progress.thinking && total > 0 && (_jsxs(Text, { children: [' ', _jsx(Text, { color: "#7aa2f7", children: spin() }), ' ', _jsx(Text, { color: "#c0caf5", children: "thinking\u2026" })] }))] }));
34
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { children: ' ' }), allDone ? (_jsxs(Text, { children: [' ', _jsx(Text, { color: "#565f89", children: '·' }), ' ', _jsx(Text, { color: "#565f89", children: phase === 'scanning' ? 'scanned' : 'done' })] })) : total > 0 ? (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: [' ', _jsx(Text, { color: "#565f89", children: phase || 'working' }), ' ', _jsx(Bar, { done: done, total: total })] }), items.slice(0, MAX_VIS).map((item, i) => (_jsxs(Text, { children: [' ', _jsx(Text, { color: "#3b4261", children: spin(i) }), ' ', _jsx(Text, { color: "#565f89", children: item.label }), item.tool && _jsxs(Text, { color: "#3b4261", children: [' — ', item.tool] })] }, i))), items.length > MAX_VIS && _jsxs(Text, { color: "#3b4261", children: [' ', "+", items.length - MAX_VIS, " more"] })] })) : null, progress.thinking && total > 0 && (_jsxs(Text, { children: [' ', _jsx(Text, { color: "#3b4261", children: spin() }), ' ', _jsx(Text, { color: "#565f89", children: "thinking" })] }))] }));
35
35
  };
36
36
  const CardView = ({ card, num, sel }) => {
37
37
  const opts = card.options || [];
38
- const cat = card.category || '';
39
- const catColor = cat === 'promise' ? '#f7768e' : cat === 'blocker' ? '#e0af68'
40
- : cat === 'bump' ? '#7dcfff' : cat === 'alpha' ? '#bb9af7' : '#565f89';
41
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { children: ' ' }), _jsxs(Text, { children: [' ', _jsxs(Text, { color: "#565f89", children: ['#', num] }), ' ', _jsx(Text, { bold: true, color: catColor, children: cat.toUpperCase() })] }), _jsxs(Text, { bold: true, children: [' ', card.title] }), card.context && _jsxs(Text, { color: "#565f89", children: [' ', card.context] }), _jsx(Text, { children: ' ' }), opts.map((opt, i) => {
38
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { children: ' ' }), _jsxs(Text, { bold: true, color: "#c0caf5", children: [' ', card.title] }), card.context && _jsxs(Text, { color: "#565f89", children: [' ', card.context] }), _jsx(Text, { children: ' ' }), opts.map((opt, i) => {
42
39
  const on = i === sel;
43
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: [' ', _jsxs(Text, { color: on ? '#7aa2f7' : '#3b4261', children: [on ? '▸' : ' ', ' '] }), _jsx(Text, { bold: on, color: on ? '#c0caf5' : '#565f89', children: opt.label })] }), opt.description && on && (_jsxs(Text, { color: "#565f89", children: [' ', opt.description] }))] }, opt.label));
44
- }), _jsx(Text, { children: ' ' }), _jsxs(Text, { color: "#3b4261", children: [' ', "\u2191\u2193 navigate \u00B7 \u23CE pick"] })] }));
40
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: [' ', _jsxs(Text, { color: on ? '#7aa2f7' : '#292e42', children: [on ? '▸' : ' ', ' '] }), _jsx(Text, { bold: on, color: on ? '#c0caf5' : '#3b4261', children: opt.label })] }), opt.description && (_jsxs(Text, { color: on ? '#565f89' : '#292e42', children: [' ', opt.description] }))] }, opt.label));
41
+ }), _jsx(Text, { children: ' ' })] }));
45
42
  };
46
43
  // ─── Main App ─────────────────────────────────────
47
44
  const App = () => {
@@ -137,7 +134,7 @@ export function updateSpinner(label) {
137
134
  export function hideSpinner(doneMsg) {
138
135
  _update?.(p => ({ ...p, spinner: null }));
139
136
  if (doneMsg)
140
- log(` ${C.ok('✓')} ${C.dim(doneMsg)}`);
137
+ log(` ${C.dim(doneMsg)}`);
141
138
  }
142
139
  // ── Card picker ──
143
140
  export async function pickCard(card, num) {
@@ -149,8 +146,8 @@ export async function pickCard(card, num) {
149
146
  return new Promise(resolve => {
150
147
  _cardResolve = (pick) => {
151
148
  _update?.(p => ({ ...p, card: null, cardSel: 0 }));
152
- const t = card.title.length > 44 ? card.title.slice(0, 43) + '…' : card.title;
153
- log(` ${C.ok('✓')} ${C.dim(t)} ${C.ok('→')} ${pick}`);
149
+ const t = card.title.length > 50 ? card.title.slice(0, 49) + '…' : card.title;
150
+ log(` ${C.dim(t)} ${C.faint('→')} ${C.bright(pick)}`);
154
151
  log('');
155
152
  resolve(pick);
156
153
  };
@@ -5,30 +5,30 @@
5
5
  */
6
6
  import { showProgress, hideProgress } from './app.js';
7
7
  const LABEL = {
8
- search_all_messages: 'checking messages',
9
- get_conversation: 'reading thread',
10
- profile_contact: 'looking up contact',
11
- get_messages: 'checking messages',
12
- get_unanswered_messages: 'checking unreplied texts',
13
- get_screen_time: 'checking screen time',
14
- get_browsing: 'checking browsing',
15
- get_calls: 'checking calls',
16
- scan_sources: 'scanning',
17
- lookup_contact: 'looking up contact',
18
- get_email_summary: 'checking email',
19
- get_git_activity: 'checking projects',
20
- get_recent_files: 'checking recent files',
21
- get_shell_history: 'checking history',
22
- get_notes: 'reading notes',
23
- get_claude_history: 'checking chats',
24
- get_chatgpt_history: 'checking chats',
25
- get_interests_for_plans: 'checking interests',
26
- get_calendar: 'checking calendar',
27
- get_reminders: 'checking reminders',
28
- get_notifications: 'checking notifications',
29
- discover_platforms: 'scanning apps',
30
- generate_archetype: 'building profile',
31
- search_emails: 'searching email',
8
+ search_all_messages: 'reading the room',
9
+ get_conversation: 'listening in',
10
+ profile_contact: 'learning who this is',
11
+ get_messages: 'reading the room',
12
+ get_unanswered_messages: 'finding what you missed',
13
+ get_screen_time: 'tracking your attention',
14
+ get_browsing: 'retracing your steps',
15
+ get_calls: 'checking who called',
16
+ scan_sources: 'pulling threads',
17
+ lookup_contact: 'learning who this is',
18
+ get_email_summary: 'going through your inbox',
19
+ get_git_activity: 'seeing what you shipped',
20
+ get_recent_files: 'noticing what you touched',
21
+ get_shell_history: 'retracing your steps',
22
+ get_notes: 'reading your thoughts',
23
+ get_claude_history: 'seeing what you asked',
24
+ get_chatgpt_history: 'seeing what you asked',
25
+ get_interests_for_plans: 'understanding your world',
26
+ get_calendar: 'looking at your day',
27
+ get_reminders: 'checking what you owe yourself',
28
+ get_notifications: 'catching up',
29
+ discover_platforms: 'figuring out your world',
30
+ generate_archetype: 'figuring out who you are',
31
+ search_emails: 'digging through mail',
32
32
  };
33
33
  export class InkProgress {
34
34
  tools = [];
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Design System — "Midnight Console"
3
3
  *
4
- * Tokyo Night inspired. Warm accents. NOT generic AI-slop purple.
5
- * Opinionated palette with clear text hierarchy.
4
+ * Restraint is luxury. One accent color. Everything else is grayscale.
5
+ * Category distinction comes from position, not color.
6
6
  */
7
7
  export declare const C: {
8
8
  accent: import("chalk").ChalkInstance;
package/dist/ui/theme.js CHANGED
@@ -1,20 +1,21 @@
1
1
  /**
2
2
  * Design System — "Midnight Console"
3
3
  *
4
- * Tokyo Night inspired. Warm accents. NOT generic AI-slop purple.
5
- * Opinionated palette with clear text hierarchy.
4
+ * Restraint is luxury. One accent color. Everything else is grayscale.
5
+ * Category distinction comes from position, not color.
6
6
  */
7
7
  import chalk from 'chalk';
8
8
  // ─── Palette ──────────────────────────────────────
9
9
  export const C = {
10
- // Brand
10
+ // Brand — the only color
11
11
  accent: chalk.hex('#7aa2f7'),
12
12
  brand: chalk.bold.hex('#7aa2f7'),
13
- // Semantic
14
- ok: chalk.hex('#9ece6a'),
15
- warn: chalk.hex('#e0af68'),
16
- err: chalk.hex('#f7768e'),
17
- info: chalk.hex('#7dcfff'),
13
+ // Semantic — all map to the grayscale hierarchy
14
+ // "ok" is bright (not green), "err" is bright bold (not red)
15
+ ok: chalk.hex('#c0caf5'),
16
+ warn: chalk.hex('#a9b1d6'),
17
+ err: chalk.bold.hex('#c0caf5'),
18
+ info: chalk.hex('#a9b1d6'),
18
19
  // Text hierarchy (bright → invisible)
19
20
  hd: chalk.bold.hex('#c0caf5'),
20
21
  heading: chalk.bold.hex('#c0caf5'),
@@ -27,12 +28,12 @@ export const C = {
27
28
  };
28
29
  // Lowercase alias (backward compat)
29
30
  export const c = C;
30
- // Category badge colors
31
+ // Category styles — accent for the one that matters, dim for the rest
31
32
  export const CAT_STYLE = {
32
- promise: C.err,
33
- blocker: C.warn,
34
- bump: C.info,
35
- alpha: chalk.hex('#bb9af7'),
33
+ promise: C.bright,
34
+ blocker: C.text,
35
+ bump: C.dim,
36
+ alpha: C.accent,
36
37
  };
37
38
  export const CAT_LABEL = {
38
39
  promise: 'PROMISE',
@@ -40,10 +41,10 @@ export const CAT_LABEL = {
40
41
  bump: 'BUMP',
41
42
  alpha: 'ALPHA',
42
43
  };
43
- // Icons
44
+ // Icons — minimal
44
45
  export const icon = {
45
- check: '', cross: '✗', bullet: '·', arrow: '→',
46
- star: '', bar: '▸', dot: '',
46
+ check: '·', cross: '✗', bullet: '·', arrow: '→',
47
+ star: '·', bar: '▸', dot: '·',
47
48
  };
48
49
  // Layout
49
50
  export const W = () => Math.min(process.stdout.columns || 80, 80);
@@ -51,30 +52,30 @@ export const INNER = () => W() - 4;
51
52
  // Spinner frames
52
53
  export const SPIN = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
53
54
  export const BAR_CHARS = ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'];
54
- // Progress label map
55
+ // Progress label map — personality, not developer console
55
56
  export const TOOL_LABEL = {
56
- search_all_messages: 'checking messages',
57
- get_conversation: 'reading thread',
58
- profile_contact: 'looking up contact',
59
- get_messages: 'checking messages',
60
- get_unanswered_messages: 'checking unreplied',
61
- get_screen_time: 'checking screen time',
62
- get_browsing: 'checking browsing',
63
- get_calls: 'checking calls',
64
- scan_sources: 'scanning',
65
- lookup_contact: 'looking up contact',
66
- get_email_summary: 'checking email',
67
- get_git_activity: 'checking projects',
68
- get_recent_files: 'checking recent files',
69
- get_shell_history: 'checking history',
70
- get_notes: 'reading notes',
71
- get_claude_history: 'checking chats',
72
- get_chatgpt_history: 'checking chats',
73
- get_interests_for_plans: 'checking interests',
74
- get_calendar: 'checking calendar',
75
- get_reminders: 'checking reminders',
76
- get_notifications: 'checking notifications',
77
- discover_platforms: 'scanning apps',
78
- generate_archetype: 'building profile',
79
- search_emails: 'searching email',
57
+ search_all_messages: 'reading the room',
58
+ get_conversation: 'listening in',
59
+ profile_contact: 'learning who this is',
60
+ get_messages: 'reading the room',
61
+ get_unanswered_messages: 'finding what you missed',
62
+ get_screen_time: 'tracking your attention',
63
+ get_browsing: 'retracing your steps',
64
+ get_calls: 'checking who called',
65
+ scan_sources: 'pulling threads',
66
+ lookup_contact: 'learning who this is',
67
+ get_email_summary: 'going through your inbox',
68
+ get_git_activity: 'seeing what you shipped',
69
+ get_recent_files: 'noticing what you touched',
70
+ get_shell_history: 'retracing your steps',
71
+ get_notes: 'reading your thoughts',
72
+ get_claude_history: 'seeing what you asked',
73
+ get_chatgpt_history: 'seeing what you asked',
74
+ get_interests_for_plans: 'understanding your world',
75
+ get_calendar: 'looking at your day',
76
+ get_reminders: 'checking what you owe yourself',
77
+ get_notifications: 'catching up',
78
+ discover_platforms: 'figuring out your world',
79
+ generate_archetype: 'figuring out who you are',
80
+ search_emails: 'digging through mail',
80
81
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "life-pulse",
3
- "version": "2.3.0",
3
+ "version": "2.3.2",
4
4
  "description": "macOS life diagnostic — reads local data sources, generates actionable insights",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {