phewsh 0.11.13 → 0.11.15
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 +20 -27
- package/commands/session.js +85 -73
- package/lib/ui.js +39 -56
- package/package.json +1 -1
package/bin/phewsh.js
CHANGED
|
@@ -7,7 +7,7 @@ const command = args[0];
|
|
|
7
7
|
const b = (s) => `\x1b[1m${s}\x1b[0m`; // bold
|
|
8
8
|
const d = (s) => `\x1b[2m${s}\x1b[0m`; // dim
|
|
9
9
|
const w = (s) => `\x1b[97m${s}\x1b[0m`; // bright white
|
|
10
|
-
const g = (s) => `\x1b[
|
|
10
|
+
const g = (s) => `\x1b[38;2;130;142;138m${s}\x1b[0m`; // slate (matches ui.js)
|
|
11
11
|
const cyan = (s) => `\x1b[36m${s}\x1b[0m`;
|
|
12
12
|
const green = (s) => `\x1b[32m${s}\x1b[0m`;
|
|
13
13
|
|
|
@@ -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('
|
|
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('
|
|
83
|
-
console.log(` ${cyan('phewsh')}
|
|
84
|
-
console.log(` ${cyan('phewsh clarify')}
|
|
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/
|
|
88
|
-
console.log(` ${cyan('intent')}
|
|
89
|
-
console.log(` ${cyan('gate')}
|
|
90
|
-
console.log(` ${cyan('context')}
|
|
91
|
-
console.log(` ${cyan('ai')}
|
|
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')}
|
|
95
|
-
console.log(` ${cyan('push')}
|
|
96
|
-
console.log(` ${cyan('
|
|
97
|
-
console.log(` ${cyan('
|
|
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('
|
|
100
|
-
console.log(` ${cyan('
|
|
101
|
-
console.log(` ${cyan('link')}
|
|
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(` ${
|
|
104
|
-
console.log(`
|
|
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
|
|
package/commands/session.js
CHANGED
|
@@ -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(`
|
|
220
|
-
console.log(`
|
|
221
|
-
console.log(`
|
|
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
|
-
|
|
231
|
+
statusParts.push(teal('●') + sage(` .intent/ (${intentFiles.length} files)`));
|
|
244
232
|
} else {
|
|
245
|
-
|
|
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
|
-
//
|
|
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
|
|
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
|
|
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(` ${
|
|
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
|
-
|
|
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('
|
|
331
|
-
console.log(` ${teal('/init')} ${sage('Create .intent/
|
|
332
|
-
console.log(` ${teal('/clarify')} ${sage('
|
|
333
|
-
console.log(` ${teal('/gate')} ${sage('
|
|
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/
|
|
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('/
|
|
341
|
-
console.log(` ${teal('/
|
|
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('
|
|
345
|
-
console.log(` ${teal('/
|
|
346
|
-
console.log(` ${teal('/
|
|
347
|
-
console.log(` ${teal('/
|
|
348
|
-
console.log(` ${teal('/
|
|
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('
|
|
353
|
-
console.log(` ${teal('/
|
|
354
|
-
console.log(` ${teal('/
|
|
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(` ${
|
|
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(
|
|
15
|
-
const slate = rgb(
|
|
14
|
+
const sage = rgb(175, 195, 185); // quiet — secondary text
|
|
15
|
+
const slate = rgb(130, 142, 138); // whisper — dim text
|
|
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
|
-
`${
|
|
231
|
-
`${
|
|
232
|
-
`${
|
|
233
|
-
`${
|
|
234
|
-
`${
|
|
235
|
-
`${
|
|
236
|
-
`${
|
|
237
|
-
`${
|
|
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: '
|
|
247
|
+
title: 'The idea',
|
|
248
248
|
body: [
|
|
249
249
|
'',
|
|
250
|
-
`
|
|
251
|
-
`
|
|
250
|
+
` Every AI tool you use asks the same question:`,
|
|
251
|
+
` ${slate('"What are you building?"')}`,
|
|
252
252
|
'',
|
|
253
|
-
` ${
|
|
254
|
-
`
|
|
253
|
+
` ${teal('.intent/')} ${sage('answers it once. Every tool reads it.')}`,
|
|
254
|
+
` Plain markdown. Committed with your code. No lock-in.`,
|
|
255
255
|
'',
|
|
256
|
-
`
|
|
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
|
|
260
|
+
title: 'The files',
|
|
265
261
|
body: [
|
|
266
262
|
'',
|
|
267
263
|
` ${teal('.intent/')}`,
|
|
268
|
-
` ${peach('vision.md')} ${sage('What
|
|
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('
|
|
271
|
-
` ${ember('gate.json')} ${sage('
|
|
266
|
+
` ${peach('next.md')} ${sage('What to do right now')}`,
|
|
267
|
+
` ${ember('gate.json')} ${sage('Constraints: budget, time, skill')}`,
|
|
272
268
|
'',
|
|
273
|
-
` ${
|
|
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: '
|
|
274
|
+
title: 'Sync everywhere',
|
|
278
275
|
body: [
|
|
279
276
|
'',
|
|
280
|
-
`
|
|
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('
|
|
295
|
-
` ${b(cream('Cursor'))} ${sage('
|
|
296
|
-
` ${b(cream('ChatGPT'))} ${sage('
|
|
297
|
-
` ${b(cream('MCP agents'))} ${sage('
|
|
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('
|
|
284
|
+
` ${sage('Switch tools mid-thought. Context follows.')}`,
|
|
300
285
|
]
|
|
301
286
|
},
|
|
302
287
|
{
|
|
303
|
-
title: '
|
|
288
|
+
title: 'Constraints',
|
|
304
289
|
body: [
|
|
305
290
|
'',
|
|
306
|
-
`
|
|
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('
|
|
313
|
-
` ${sage('
|
|
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: '
|
|
301
|
+
title: 'Go',
|
|
318
302
|
body: [
|
|
319
303
|
'',
|
|
320
|
-
` ${teal('
|
|
321
|
-
` ${teal('
|
|
322
|
-
` ${teal('
|
|
323
|
-
` ${teal('
|
|
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('.
|
|
309
|
+
` ${sage('Intent-driven development. Define once. Work everywhere.')}`,
|
|
327
310
|
]
|
|
328
311
|
},
|
|
329
312
|
];
|