phewsh 0.11.13 → 0.11.14

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/bin/phewsh.js CHANGED
@@ -75,37 +75,30 @@ function showHelp() {
75
75
  const pkg = require('../package.json');
76
76
  showBrand();
77
77
  console.log(` ${g('v' + pkg.version)} · ${g('phewsh.com/cli')}\n`);
78
- console.log(` ${g('─'.repeat(48))}`);
79
- console.log(` ${b('Just type')} ${w('phewsh')} ${b('to start.')} ${g('Everything else is optional.')}`);
80
- console.log(` ${g('─'.repeat(48))}`);
78
+ console.log(` ${g('The loop: define .intent/ → sync → every AI tool reads → work → repeat')}`);
81
79
  console.log('');
82
- console.log(` ${b(w('start here'))}`);
83
- console.log(` ${cyan('phewsh')} Open AI session with your .intent/ context`);
84
- console.log(` ${cyan('phewsh clarify')} Turn a messy idea into .intent/ artifacts`);
85
- console.log(` ${cyan('phewsh login')} Set up identity + API key`);
80
+ console.log(` ${b(w('get started'))}`);
81
+ console.log(` ${cyan('phewsh')} ${g('Open a session create, plan, and work')}`);
82
+ console.log(` ${cyan('phewsh clarify')} ${g('Turn a messy idea into .intent/ artifacts')}`);
86
83
  console.log('');
87
- console.log(` ${b(w('.intent/ management'))}`);
88
- console.log(` ${cyan('intent')} ${g('Create, view, and evolve .intent/ artifacts')}`);
89
- console.log(` ${cyan('gate')} ${g('Declare constraints (budget, time, skill, urgency)')}`);
90
- console.log(` ${cyan('context')} ${g('Export .intent/ as portable context for any AI tool')}`);
91
- console.log(` ${cyan('ai')} ${g('One-shot AI prompt with .intent/ context injected')}`);
84
+ console.log(` ${b(w('author .intent/'))}`);
85
+ console.log(` ${cyan('intent')} ${g('Create, view, evolve .intent/ artifacts')}`);
86
+ console.log(` ${cyan('gate')} ${g('Set constraints (budget, time, skill, urgency)')}`);
87
+ console.log(` ${cyan('context')} ${g('Export .intent/ for any AI tool')}`);
88
+ console.log(` ${cyan('ai')} ${g('One-shot prompt with .intent/ context')}`);
92
89
  console.log('');
93
- console.log(` ${b(w('sync'))}`);
94
- console.log(` ${cyan('watch')} ${g('Keep AI tools in sync with .intent/ (CLAUDE.md + cloud)')}`);
95
- console.log(` ${cyan('push')} ${g('Push .intent/ to phewsh.com/intent')}`);
96
- console.log(` ${cyan('pull')} ${g('Pull from phewsh.com/intent to .intent/')}`);
97
- console.log(` ${cyan('serve')} ${g('Execution bridge for phewsh.com/intent')}`);
90
+ console.log(` ${b(w('sync everywhere'))}`);
91
+ console.log(` ${cyan('watch')} ${g('Auto-sync .intent/ CLAUDE.md + cloud')}`);
92
+ console.log(` ${cyan('push/pull')} ${g('Manual sync to/from phewsh.com/intent')}`);
93
+ console.log(` ${cyan('serve')} ${g('Execution bridge — run from phewsh.com/intent')}`);
94
+ console.log(` ${cyan('mcp')} ${g('Connect AI agents via MCP protocol')}`);
98
95
  console.log('');
99
- console.log(` ${b(w('connect'))}`);
100
- console.log(` ${cyan('mcp')} ${g('Connect AI agents via MCP protocol')}`);
101
- console.log(` ${cyan('link')} ${g('Link local .intent/ to cloud project')}`);
96
+ console.log(` ${b(w('configure'))}`);
97
+ console.log(` ${cyan('login')} ${g('Identity + API key + cloud sync')}`);
98
+ console.log(` ${cyan('link')} ${g('Link local .intent/ to cloud project')}`);
102
99
  console.log('');
103
- console.log(` ${b(w('more'))}`);
104
- console.log(` ${cyan('sap')} ${g('Sustainable AI Protocol usage tracking')}`);
105
- console.log(` ${cyan('style')} ${g('Style identity — ingest, profile, sync')}`);
106
- console.log(` ${cyan('mbhd')} ${g('MBHD music engine')}`);
107
- console.log('');
108
- console.log(` ${g('Everything works without an account. Account adds sync + sharing.')}`);
100
+ console.log(` ${g('Works in: Claude Code · Cursor · ChatGPT · any MCP agent')}`);
101
+ console.log(` ${g('No account needed. Account adds sync + sharing.')}`);
109
102
  console.log('');
110
103
  }
111
104
 
@@ -212,24 +212,11 @@ async function main() {
212
212
 
213
213
  // ── First-run welcome ──────────────────────────────────
214
214
  if (!config?.apiKey) {
215
- console.log(` ${b(cream('Welcome.'))}`);
216
- console.log(` ${sage('.intent/ is your project\'s working memory.')}`);
217
- console.log(` ${sage('Define it once — every AI tool reads it. No more re-explaining.')}`);
215
+ console.log(` ${b(cream('Welcome to phewsh.'))}`);
218
216
  console.log('');
219
- console.log(` ${cream('To chat, you need an API key.')} ${slate('(not a subscription)')}`);
220
- console.log(` ${slate('ChatGPT Plus / Claude Pro don\'t include API access.')}`);
221
- console.log(` ${slate('API keys are pay-as-you-go both providers offer free credits.')}`);
222
- console.log('');
223
- console.log(` ${teal('1')} ${b(cream('Anthropic'))} ${slate('(recommended)')}`);
224
- console.log(` ${sage('console.anthropic.com/settings/keys')}`);
225
- console.log(` ${slate('Direct Claude access. Best quality. ~$0.01/message.')}`);
226
- console.log('');
227
- console.log(` ${teal('2')} ${b(cream('OpenRouter'))}`);
228
- console.log(` ${sage('openrouter.ai/keys')}`);
229
- console.log(` ${slate('One key → Claude, GPT, Gemini, and more.')}`);
230
- console.log('');
231
- console.log(` ${sage('Got a key?')} ${cream('/key')} ${sage('to paste it in.')}`);
232
- console.log(` ${sage('Curious?')} ${cream('/tour')} ${sage('to explore (no key needed).')}`);
217
+ console.log(` ${teal('/key')} ${sage('Set your API key (takes 10 seconds)')}`);
218
+ console.log(` ${teal('/init')} ${sage('Create .intent/ for this project')}`);
219
+ console.log(` ${teal('/tour')} ${sage('See what this does (no key needed)')}`);
233
220
  console.log('');
234
221
  } else if (!config.apiKey.startsWith('sk-')) {
235
222
  console.log(` ${ember('!')} ${sage('Stored API key looks invalid.')}`);
@@ -238,22 +225,17 @@ async function main() {
238
225
  config.apiKey = null;
239
226
  }
240
227
 
241
- // ── Project status ─────────────────────────────────────
228
+ // ── Project status (compact) ────────────────────────────
229
+ const statusParts = [cream(projectName)];
242
230
  if (intentFiles.length > 0) {
243
- console.log(` ${teal('●')} ${cream(projectName)} ${slate('·')} ${sage(intentFiles.map(f => f.file).join(', '))}`);
231
+ statusParts.push(teal('●') + sage(` .intent/ (${intentFiles.length} files)`));
244
232
  } else {
245
- console.log(` ${teal('●')} ${cream(projectName)} ${slate('·')} ${sage('no .intent/ context')}`);
246
- console.log(` ${slate(' run /init to create .intent/ artifacts')}`);
247
- }
248
- console.log(` ${slate(' model:')} ${sage(MODELS[currentModel].name)}`);
249
- if (config?.email) {
250
- console.log(` ${slate(' user:')} ${sage(config.email)}`);
233
+ statusParts.push(slate('no .intent/ — run /init'));
251
234
  }
235
+ statusParts.push(sage(MODELS[currentModel].name));
236
+ console.log(` ${statusParts.join(slate(' · '))}`);
252
237
 
253
- // ── Interop ────────────────────────────────────────────
254
- ui.interopLine(config, intentFiles);
255
-
256
- // Sync status (non-blocking)
238
+ // Sync status (one-line, non-blocking)
257
239
  if (config?.supabaseUserId && intentFiles.length > 0) {
258
240
  const syncResult = await Promise.race([
259
241
  checkSyncStatus(config),
@@ -261,26 +243,21 @@ async function main() {
261
243
  ]);
262
244
  if (syncResult) {
263
245
  if (syncResult.status === 'cloud-newer') {
264
- console.log(` ${ember('↓')} ${sage('Cloud is newer (' + syncResult.ago + ') — run /pull')}`);
246
+ console.log(` ${ember('↓')} ${sage('Cloud newer (' + syncResult.ago + ') — /pull')}`);
265
247
  } else if (syncResult.status === 'local-newer') {
266
- console.log(` ${ember('↑')} ${sage('Local changes not pushed (' + syncResult.ago + ') run /push')}`);
248
+ console.log(` ${ember('↑')} ${sage('Local changes — /push')}`);
267
249
  } else if (syncResult.status === 'synced') {
268
250
  console.log(` ${teal('↕')} ${slate('synced')}`);
269
- } else if (syncResult.status === 'local-only') {
270
- console.log(` ${slate('↕ not linked to cloud — run /push to sync')}`);
271
251
  }
272
252
  }
273
253
  }
274
254
 
275
255
  console.log('');
276
- ui.divider('line');
277
256
  if (!config?.apiKey) {
278
- console.log(` ${sage('type')} ${cream('/key')} ${sage('to get started ·')} ${cream('/tour')} ${sage('to explore ·')} ${cream('/help')} ${sage('for commands')}`);
257
+ console.log(` ${cream('/key')} ${sage('to start ·')} ${cream('/tour')} ${sage('to explore ·')} ${cream('/help')} ${sage('for more')}`);
279
258
  } else {
280
259
  console.log(` ${ui.randomTip()}`);
281
- console.log(` ${sage('type naturally ·')} ${cream('/help')} ${sage('for commands ·')} ${cream('/quit')} ${sage('to exit')}`);
282
260
  }
283
- ui.divider('line');
284
261
  console.log('');
285
262
 
286
263
  const rl = readline.createInterface({
@@ -308,50 +285,47 @@ async function main() {
308
285
 
309
286
  if (cmd === 'quit' || cmd === 'exit' || cmd === 'q') {
310
287
  const turns = messages.length / 2;
288
+ // Clean up background children
289
+ if (global._phewshChildren) {
290
+ global._phewshChildren.forEach(c => { try { c.kill(); } catch {} });
291
+ }
311
292
  console.log('');
312
- ui.divider('line');
313
293
  console.log(` ${sage('session ended · ' + turns + ' exchanges · ' + (totalPromptTokens + totalCompletionTokens) + ' tokens')}`);
314
- ui.divider('line');
315
294
  console.log('');
316
295
  process.exit(0);
317
296
  }
318
297
 
319
298
  if (cmd === 'help' || cmd === 'h') {
320
299
  console.log('');
321
- ui.divider('line');
322
- console.log(` ${b(cream('Session commands'))}`);
323
- ui.divider('line');
324
- console.log('');
325
- console.log(` ${cream('conversation')}`);
326
- console.log(` ${teal('/clear')} ${sage('Clear conversation history')}`);
327
- console.log(` ${teal('/run')} ${slate('<prompt>')} ${sage('One-shot prompt (no history)')}`);
328
- console.log(` ${teal('/quit')} ${sage('End session')}`);
300
+ console.log(` ${sage('the loop: define .intent/ → sync → work → evolve → repeat')}`);
329
301
  console.log('');
330
- console.log(` ${cream('project')}`);
331
- console.log(` ${teal('/init')} ${sage('Create .intent/ artifacts in this directory')}`);
332
- console.log(` ${teal('/clarify')} ${sage('AI-assisted artifact generation')}`);
333
- console.log(` ${teal('/gate')} ${sage('Declare constraints (budget, time, skill)')}`);
334
- console.log(` ${teal('/export')} ${sage('Export portable context for other AI tools')}`);
302
+ console.log(` ${cream('author .intent/')}`);
303
+ console.log(` ${teal('/init')} ${sage('Create .intent/ for this project')}`);
304
+ console.log(` ${teal('/clarify')} ${sage('Turn ideas into .intent/ artifacts')}`);
305
+ console.log(` ${teal('/gate')} ${sage('Set constraints (budget, time, skill)')}`);
335
306
  console.log(` ${teal('/context')} ${sage('Show loaded .intent/ files')}`);
336
- console.log(` ${teal('/reload')} ${sage('Reload .intent/ context from disk')}`);
337
- console.log(` ${teal('/status')} ${sage('Show session stats')}`);
307
+ console.log(` ${teal('/reload')} ${sage('Reload .intent/ from disk')}`);
338
308
  console.log('');
339
- console.log(` ${cream('sync')}`);
340
- console.log(` ${teal('/push')} ${sage('Push .intent/ to cloud')}`);
341
- console.log(` ${teal('/pull')} ${sage('Pull .intent/ from cloud (reloads context)')}`);
309
+ console.log(` ${cream('sync everywhere')}`);
310
+ console.log(` ${teal('/watch')} ${sage('Sync .intent/ CLAUDE.md + cloud (background)')}`);
311
+ console.log(` ${teal('/export')} ${sage('Export .intent/ for any AI tool')}`);
312
+ console.log(` ${teal('/push')} ${sage('Push to phewsh.com/intent')}`);
313
+ console.log(` ${teal('/pull')} ${sage('Pull from cloud (reloads context)')}`);
314
+ console.log(` ${teal('/serve')} ${sage('Execution bridge for phewsh.com/intent')}`);
342
315
  console.log(` ${teal('/sync')} ${sage('Check sync status')}`);
343
316
  console.log('');
344
- console.log(` ${cream('configuration')}`);
345
- console.log(` ${teal('/login')} ${sage('Set up identity + cloud sync')}`);
346
- console.log(` ${teal('/key')} ${sage('Set or update your API key')}`);
347
- console.log(` ${teal('/model')} ${slate('<name>')} ${sage('Switch model (sonnet, opus, haiku)')}`);
348
- console.log(` ${teal('/models')} ${sage('List available models')}`);
349
- console.log(` ${teal('/provider')} ${sage('Show current provider info')}`);
350
- console.log(` ${teal('/update')} ${sage('Update phewsh to the latest version')}`);
317
+ console.log(` ${cream('session')}`);
318
+ console.log(` ${teal('/run')} ${slate('<prompt>')} ${sage('One-shot prompt (no history)')}`);
319
+ console.log(` ${teal('/clear')} ${sage('Clear conversation')}`);
320
+ console.log(` ${teal('/status')} ${sage('Session stats')}`);
321
+ console.log(` ${teal('/quit')} ${sage('Exit')}`);
351
322
  console.log('');
352
- console.log(` ${cream('explore')}`);
353
- console.log(` ${teal('/tour')} ${sage('Guided walkthrough of PHEWSH')}`);
354
- console.log(` ${teal('/system')} ${sage('Show current system prompt')}`);
323
+ console.log(` ${cream('configure')}`);
324
+ console.log(` ${teal('/key')} ${sage('Set API key')}`);
325
+ console.log(` ${teal('/login')} ${sage('Identity + cloud sync')}`);
326
+ console.log(` ${teal('/model')} ${slate('<name>')} ${sage('Switch model (sonnet, opus, haiku)')}`);
327
+ console.log(` ${teal('/update')} ${sage('Update phewsh')}`);
328
+ console.log(` ${teal('/tour')} ${sage('Quick walkthrough')}`);
355
329
  console.log('');
356
330
  rl.prompt();
357
331
  return;
@@ -717,6 +691,49 @@ async function main() {
717
691
  return;
718
692
  }
719
693
 
694
+ if (cmd === 'watch') {
695
+ if (!fs.existsSync(INTENT_DIR)) {
696
+ console.log(`\n ${ember('!')} ${sage('No .intent/ found. Run /init first.')}\n`);
697
+ rl.prompt();
698
+ return;
699
+ }
700
+ const { spawn } = require('child_process');
701
+ const watchArgs = ['watch'];
702
+ if (cmdArg) watchArgs.push(...cmdArg.split(/\s+/));
703
+ const child = spawn(process.execPath, [path.join(__dirname, '..', 'bin', 'phewsh.js'), ...watchArgs], {
704
+ stdio: 'inherit',
705
+ detached: false,
706
+ });
707
+ child.on('error', (err) => {
708
+ console.log(` ${ember('!')} ${sage('Watch failed:')} ${err.message}`);
709
+ });
710
+ // Store ref so we can clean up on exit
711
+ if (!global._phewshChildren) global._phewshChildren = [];
712
+ global._phewshChildren.push(child);
713
+ console.log(`\n ${teal('●')} ${sage('Watch started — .intent/ syncing in background')}`);
714
+ console.log(` ${slate('CLAUDE.md and cloud will auto-update on changes')}\n`);
715
+ rl.prompt();
716
+ return;
717
+ }
718
+
719
+ if (cmd === 'serve') {
720
+ const { spawn } = require('child_process');
721
+ const serveArgs = ['serve'];
722
+ if (cmdArg) serveArgs.push(...cmdArg.split(/\s+/));
723
+ const child = spawn(process.execPath, [path.join(__dirname, '..', 'bin', 'phewsh.js'), ...serveArgs], {
724
+ stdio: 'inherit',
725
+ detached: false,
726
+ });
727
+ child.on('error', (err) => {
728
+ console.log(` ${ember('!')} ${sage('Serve failed:')} ${err.message}`);
729
+ });
730
+ if (!global._phewshChildren) global._phewshChildren = [];
731
+ global._phewshChildren.push(child);
732
+ console.log(`\n ${teal('●')} ${sage('Serve started — execution bridge running')}\n`);
733
+ rl.prompt();
734
+ return;
735
+ }
736
+
720
737
  if (cmd === 'run') {
721
738
  if (!cmdArg) {
722
739
  console.log(` ${sage('Usage:')} ${cream('/run <prompt>')}`);
@@ -764,12 +781,7 @@ async function main() {
764
781
  // Regular input → send to AI
765
782
  if (!config?.apiKey) {
766
783
  console.log('');
767
- console.log(` ${peach('Almost there.')} ${sage('You need an API key to chat.')}`);
768
- console.log(` ${sage('Type')} ${cream('/key')} ${sage('and paste one in — takes 10 seconds.')}`);
769
- console.log('');
770
- console.log(` ${slate('Get a key:')} ${sage('console.anthropic.com/settings/keys')}`);
771
- console.log(` ${slate('Or try:')} ${sage('openrouter.ai/keys')}`);
772
- console.log(` ${slate('Explore:')} ${cream('/tour')} ${slate('to see what PHEWSH does (no key needed)')}`);
784
+ console.log(` ${sage('Type')} ${cream('/key')} ${sage('to set your API key first.')}`);
773
785
  console.log('');
774
786
  rl.prompt();
775
787
  return;
package/lib/ui.js CHANGED
@@ -11,8 +11,8 @@ const rgbBg = (r, g, b) => (s) => `\x1b[48;2;${r};${g};${b}m${s}\x1b[0m`;
11
11
  // Brand colors — relief, quiet, future
12
12
  const teal = rgb(100, 215, 195); // cool calm — primary
13
13
  const peach = rgb(255, 195, 145); // warm exhale — accent
14
- const sage = rgb(130, 150, 140); // quiet — secondary text
15
- const slate = rgb(80, 90, 88); // whisper — dim text
14
+ const sage = rgb(155, 175, 165); // quiet — secondary text (bumped for readability)
15
+ const slate = rgb(105, 115, 112); // whisper — dim text (bumped for readability)
16
16
  const cream = rgb(240, 235, 225); // clarity — bright text
17
17
  const ember = rgb(220, 140, 90); // glow — warnings/energy
18
18
 
@@ -227,14 +227,14 @@ function typewrite(text, speed = 25) {
227
227
 
228
228
  // ── Welcome tips ─────────────────────────────────────────
229
229
  const TIPS = [
230
- `${slate('·')} ${cream('/clarify')} ${sage('turns a messy idea into .intent/ artifacts')}`,
231
- `${slate('·')} ${cream('/gate')} ${sage('sets constraints every AI response respects your budget and time')}`,
232
- `${slate('·')} ${sage('Run')} ${cream('phewsh watch')} ${sage('in another tab keeps CLAUDE.md in sync with .intent/')}`,
233
- `${slate('·')} ${cream('/export')} ${sage('exports .intent/ as portable context for any AI tool')}`,
234
- `${slate('·')} ${sage('.intent/ files are plain markdown — edit them directly anytime')}`,
235
- `${slate('·')} ${cream('phewsh context --copy')} ${sage('puts your .intent/ context on the clipboard')}`,
236
- `${slate('·')} ${cream('/tour')} ${sage('walks through the .intent/ workflow (no key needed)')}`,
237
- `${slate('·')} ${sage('Everything works without an account. Account adds sync + sharing.')}`,
230
+ `${sage('try')} ${cream('/clarify')} ${sage('turns ideas into .intent/ artifacts')}`,
231
+ `${sage('try')} ${cream('/gate')} ${sage(' set budget/time constraints, AI respects them')}`,
232
+ `${sage('try')} ${cream('/watch')} ${sage(' sync .intent/ to CLAUDE.md in the background')}`,
233
+ `${sage('try')} ${cream('/export')} ${sage(' .intent/ as portable context for any AI tool')}`,
234
+ `${sage('.intent/ is plain markdown — edit the files directly anytime')}`,
235
+ `${sage('the loop: define .intent/ sync work → evolve → repeat')}`,
236
+ `${sage('try')} ${cream('/tour')} ${sage(' quick walkthrough, no key needed')}`,
237
+ `${sage('works in Claude Code, Cursor, ChatGPT, and any MCP agent')}`,
238
238
  ];
239
239
 
240
240
  function randomTip() {
@@ -244,86 +244,69 @@ function randomTip() {
244
244
  // ── Tour content ─────────────────────────────────────────
245
245
  const TOUR_PAGES = [
246
246
  {
247
- title: 'What is .intent/?',
247
+ title: 'The idea',
248
248
  body: [
249
249
  '',
250
- ` ${teal('.intent/')} ${sage('is your project\'s working memory.')}`,
251
- ` Plain markdown files, committed with your code, read by every AI tool.`,
250
+ ` Every AI tool you use asks the same question:`,
251
+ ` ${slate('"What are you building?"')}`,
252
252
  '',
253
- ` ${cream('phew')} ${sage(' the relief of not re-explaining.')}`,
254
- ` ${cream('shh')} ${sage('— it just works. No noise.')}`,
253
+ ` ${teal('.intent/')} ${sage('answers it once. Every tool reads it.')}`,
254
+ ` Plain markdown. Committed with your code. No lock-in.`,
255
255
  '',
256
- ` PHEWSH is the tool that ${cream('authors')} and ${cream('syncs')} .intent/.`,
257
- ` It works standalone, inside Claude Code, Cursor, ChatGPT, or any MCP agent.`,
258
- '',
259
- ` ${sage('You own these files. They travel with your code.')}`,
260
- ` ${sage('Everything works without an account. Account adds sync + sharing.')}`,
256
+ ` ${sage('The loop:')} ${cream('define')} ${sage('→')} ${cream('sync')} ${sage('→')} ${cream('work')} ${sage('→')} ${cream('evolve')} ${sage('→')} ${cream('repeat')}`,
261
257
  ]
262
258
  },
263
259
  {
264
- title: 'The .intent/ directory',
260
+ title: 'The files',
265
261
  body: [
266
262
  '',
267
263
  ` ${teal('.intent/')}`,
268
- ` ${peach('vision.md')} ${sage('What this project is and why it exists')}`,
264
+ ` ${peach('vision.md')} ${sage('What you\'re building and why')}`,
269
265
  ` ${peach('plan.md')} ${sage('Strategy, phases, milestones')}`,
270
- ` ${peach('next.md')} ${sage('Current tasks and what to do right now')}`,
271
- ` ${ember('gate.json')} ${sage('Your constraints (budget, time, skill)')}`,
266
+ ` ${peach('next.md')} ${sage('What to do right now')}`,
267
+ ` ${ember('gate.json')} ${sage('Constraints: budget, time, skill')}`,
272
268
  '',
273
- ` ${sage('Create these with')} ${cream('/init')} ${sage('or')} ${cream('/clarify')}`,
269
+ ` ${cream('/init')} ${sage('creates them.')} ${cream('/clarify')} ${sage('authors them with AI.')}`,
270
+ ` ${sage('Or just edit the markdown directly.')}`,
274
271
  ]
275
272
  },
276
273
  {
277
- title: 'Standalone mode',
274
+ title: 'Sync everywhere',
278
275
  body: [
279
276
  '',
280
- ` Run ${cream('phewsh')} and type naturally.`,
281
- ` Every message carries your .intent/ context automatically.`,
282
- '',
283
- ` ${teal('phewsh')} ${sage('>')} what should I focus on today?`,
284
- ` ${teal('phewsh')} ${sage('>')} is my plan realistic given my budget?`,
285
- ` ${teal('phewsh')} ${sage('>')} break this feature into tasks`,
286
- '',
287
- ` ${sage('The AI reads .intent/ — no warmup needed.')}`,
288
- ]
289
- },
290
- {
291
- title: '.intent/ in other tools',
292
- body: [
277
+ ` ${cream('/watch')} ${sage('syncs .intent/ to your tools in the background:')}`,
293
278
  '',
294
- ` ${b(cream('Claude Code'))} ${sage('phewsh watch → CLAUDE.md stays in sync with .intent/')}`,
295
- ` ${b(cream('Cursor'))} ${sage('phewsh context --file exports .intent/ to .phewsh.context')}`,
296
- ` ${b(cream('ChatGPT'))} ${sage('phewsh context --copy .intent/ on your clipboard')}`,
297
- ` ${b(cream('MCP agents'))} ${sage('phewsh mcp setup agents read .intent/ automatically')}`,
279
+ ` ${b(cream('Claude Code'))} ${sage('→ CLAUDE.md auto-updates')}`,
280
+ ` ${b(cream('Cursor'))} ${sage('→ /export writes .phewsh.context')}`,
281
+ ` ${b(cream('ChatGPT'))} ${sage(' /export --copy to clipboard')}`,
282
+ ` ${b(cream('MCP agents'))} ${sage('→ self-brief from .intent/ via protocol')}`,
298
283
  '',
299
- ` ${sage('Same .intent/. Every tool. Switch mid-thought. Nothing lost.')}`,
284
+ ` ${sage('Switch tools mid-thought. Context follows.')}`,
300
285
  ]
301
286
  },
302
287
  {
303
- title: 'The Decision Gate',
288
+ title: 'Constraints',
304
289
  body: [
305
290
  '',
306
- ` Before you build, decide ${b(cream('whether'))} to build.`,
307
- ` The gate captures what you can actually spend:`,
291
+ ` ${cream('/gate')} ${sage('captures what you can actually spend:')}`,
308
292
  '',
309
293
  ` ${sage('Budget')} ${cream('$50')} ${sage('Skill')} ${cream('expert')}`,
310
294
  ` ${sage('Time')} ${cream('15 hrs/week')} ${sage('Urgency')} ${cream('high')}`,
311
295
  '',
312
- ` ${sage('These constraints shape every AI response.')}`,
313
- ` ${sage('Run')} ${cream('/gate activate')} ${sage('to set yours.')}`,
296
+ ` ${sage('Every AI response respects these.')}`,
297
+ ` ${sage('Ask "what should I do next?" — the answer fits your reality.')}`,
314
298
  ]
315
299
  },
316
300
  {
317
- title: 'You\'re ready',
301
+ title: 'Go',
318
302
  body: [
319
303
  '',
320
- ` ${teal('')} ${cream('/init')} or ${cream('/clarify')} to create .intent/ artifacts`,
321
- ` ${teal('')} Type naturally — .intent/ context is always loaded`,
322
- ` ${teal('')} ${cream('/gate')} to set your constraints`,
323
- ` ${teal('')} ${cream('phewsh watch')} to keep AI tools in sync`,
324
- ` ${teal('●')} ${cream('/help')} for all commands`,
304
+ ` ${teal('1.')} ${cream('/init')} ${sage('or')} ${cream('/clarify')} ${sage('— create .intent/')}`,
305
+ ` ${teal('2.')} ${sage('Type naturally — context is always loaded')}`,
306
+ ` ${teal('3.')} ${cream('/watch')} ${sage('— sync to all your tools')}`,
307
+ ` ${teal('4.')} ${cream('/gate')} ${sage('— set constraints')}`,
325
308
  '',
326
- ` ${sage('.intent/ is your project\'s working memory. PHEWSH keeps it useful.')}`,
309
+ ` ${sage('Intent-driven development. Define once. Work everywhere.')}`,
327
310
  ]
328
311
  },
329
312
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phewsh",
3
- "version": "0.11.13",
3
+ "version": "0.11.14",
4
4
  "description": "Turn intent into action. Structure your thinking, execute your next step.",
5
5
  "bin": {
6
6
  "phewsh": "bin/phewsh.js"