phewsh 0.15.60 → 0.15.61
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/commands/session.js +23 -16
- package/package.json +1 -1
package/commands/session.js
CHANGED
|
@@ -426,27 +426,31 @@ async function main() {
|
|
|
426
426
|
// ── The Exhale: animated brand reveal ──────────────────
|
|
427
427
|
await ui.brandReveal();
|
|
428
428
|
|
|
429
|
-
//
|
|
430
|
-
//
|
|
431
|
-
//
|
|
432
|
-
//
|
|
433
|
-
|
|
429
|
+
// The welcome beat — warm, plain-language, and continuity-first. This is the
|
|
430
|
+
// "you made it" moment that frames what phewsh is FOR: one thread across every
|
|
431
|
+
// AI tool, so you switch harnesses mid-work and nothing gets re-explained.
|
|
432
|
+
// Non-technical readers get one inviting sentence; the cockpit rows below give
|
|
433
|
+
// engineers the exact facts. Fail-soft: a missing piece shortens the line, it
|
|
434
|
+
// never blocks the door.
|
|
435
|
+
(function welcome() {
|
|
434
436
|
try {
|
|
435
437
|
const toolCount = harnesses.filter(h => h.installed).length;
|
|
436
438
|
const hasProject = intentFiles.length > 0;
|
|
437
439
|
const dot = teal('●');
|
|
438
440
|
const tools = `${toolCount} AI tool${toolCount !== 1 ? 's' : ''}`;
|
|
439
|
-
if (hasProject && toolCount >
|
|
440
|
-
console.log(` ${dot} ${sage(
|
|
441
|
+
if (hasProject && toolCount > 1) {
|
|
442
|
+
console.log(` ${dot} ${sage('Welcome back. One shared memory of')} ${cream(projectName)}${sage(`, and ${tools} that all read it`)} ${slate('— switch tools mid-thought, nothing re-explained.')}`);
|
|
441
443
|
} else if (hasProject) {
|
|
442
|
-
console.log(` ${dot} ${sage('
|
|
443
|
-
} else if (toolCount >
|
|
444
|
-
console.log(` ${dot} ${sage(
|
|
444
|
+
console.log(` ${dot} ${sage('Welcome back. One verified memory of')} ${cream(projectName)} ${sage('— ready for whatever AI tool you reach for next.')}`);
|
|
445
|
+
} else if (toolCount > 1) {
|
|
446
|
+
console.log(` ${dot} ${sage(`Welcome — you made it. ${tools} here; this is where they share one thread.`)} ${slate('/init')} ${sage('to begin.')}`);
|
|
447
|
+
} else if (toolCount === 1) {
|
|
448
|
+
console.log(` ${dot} ${sage('Welcome — you made it. Add Codex or Gemini and phewsh keeps every tool on the same page.')}`);
|
|
445
449
|
} else {
|
|
446
|
-
console.log(` ${dot} ${sage('Install Claude Code, Codex, or Gemini
|
|
450
|
+
console.log(` ${dot} ${sage('Welcome — you made it. Install Claude Code, Codex, or Gemini and phewsh keeps them all on the same page.')}`);
|
|
447
451
|
}
|
|
448
452
|
console.log('');
|
|
449
|
-
} catch { /* the
|
|
453
|
+
} catch { /* the welcome is a flourish, never a blocker */ }
|
|
450
454
|
})();
|
|
451
455
|
|
|
452
456
|
if (config?.apiKey && !config.apiKey.startsWith('sk-')) {
|
|
@@ -583,6 +587,10 @@ async function main() {
|
|
|
583
587
|
console.log(` ${b(cream('What are you trying to do?'))}`);
|
|
584
588
|
console.log(` ${teal('1')} ${sage('Build')} ${slate('·')} ${teal('2')} ${sage('Research')} ${slate('·')} ${teal('3')} ${sage('Decide')} ${slate('·')} ${teal('4')} ${sage('Review')} ${slate('·')} ${teal('5')} ${sage('Ask another model')}`);
|
|
585
589
|
console.log(` ${slate('pick a number, or just type — your context travels with every route')}`);
|
|
590
|
+
// One quiet line to the deeper power, without dumping the whole command list:
|
|
591
|
+
// the moves that make phewsh more than a chat box — true continuity across
|
|
592
|
+
// harnesses. /help opens everything when they're ready.
|
|
593
|
+
console.log(` ${slate('⌄ deeper:')} ${cream('/work')} ${slate('hand to a tool')} ${slate('·')} ${cream('/council')} ${slate('ask them all')} ${slate('·')} ${cream('/handoff')} ${slate('what carries over')} ${slate('·')} ${cream('/help')} ${slate('all')}`);
|
|
586
594
|
}
|
|
587
595
|
|
|
588
596
|
// Self-aware guidance: snapshot the session's state so phewsh can recommend
|
|
@@ -666,6 +674,7 @@ async function main() {
|
|
|
666
674
|
const tools = continuity.toolsInThread(decisions, { project: projectName });
|
|
667
675
|
const span = tools >= 2 ? slate(` · ${tools} tools, one thread`) : '';
|
|
668
676
|
console.log(` ${teal('↻')} ${sage('Picking up — ' + line)}${span} ${slate('· /thread')}`);
|
|
677
|
+
console.log(''); // breathe before "What are you trying to do?"
|
|
669
678
|
} catch { /* continuity is a nicety, never a blocker */ }
|
|
670
679
|
}
|
|
671
680
|
|
|
@@ -733,10 +742,8 @@ async function main() {
|
|
|
733
742
|
console.log('');
|
|
734
743
|
if (!route) {
|
|
735
744
|
// Nothing to route through: no key, no agent CLIs found on this machine.
|
|
736
|
-
console.log(` ${b(cream('
|
|
737
|
-
console.log('');
|
|
738
|
-
console.log(` ${sage('No agent CLI found (Claude Code, Codex, Gemini, Cursor, OpenCode)')}`);
|
|
739
|
-
console.log(` ${sage('and no API key set. Either one gets you running:')}`);
|
|
745
|
+
console.log(` ${b(cream('Two ways to get running:'))}`);
|
|
746
|
+
console.log(` ${slate('No agent CLI found (Claude Code, Codex, Gemini, Cursor, OpenCode) and no API key yet.')}`);
|
|
740
747
|
console.log('');
|
|
741
748
|
console.log(` ${teal('/key')} ${sage('Set an API key (10 seconds)')}`);
|
|
742
749
|
console.log(` ${teal('/tour')} ${sage('See what this does (nothing needed)')}`);
|